28
28
29
29
#include "py/mphal.h"
30
30
#include "py/runtime.h"
31
+ #include "py/mperrno.h"
31
32
#include "extmod/vfs.h"
32
33
#include "modrp2.h"
33
34
#include "hardware/flash.h"
34
35
#include "pico/binary_info.h"
35
36
36
37
#define BLOCK_SIZE_BYTES (FLASH_SECTOR_SIZE)
37
38
38
- #ifndef MICROPY_HW_FLASH_STORAGE_BYTES
39
- #define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024)
40
- #endif
39
+ static_assert (MICROPY_HW_ROMFS_BYTES % 4096 == 0 , "ROMFS size must be a multiple of 4K" );
41
40
static_assert (MICROPY_HW_FLASH_STORAGE_BYTES % 4096 == 0 , "Flash storage size must be a multiple of 4K" );
42
41
43
42
#ifndef MICROPY_HW_FLASH_STORAGE_BASE
44
43
#define MICROPY_HW_FLASH_STORAGE_BASE (PICO_FLASH_SIZE_BYTES - MICROPY_HW_FLASH_STORAGE_BYTES)
45
44
#endif
46
45
46
+ // Put ROMFS at the upper end of the code space.
47
+ #define MICROPY_HW_ROMFS_BASE (MICROPY_HW_FLASH_STORAGE_BASE - MICROPY_HW_ROMFS_BYTES)
48
+
47
49
static_assert (MICROPY_HW_FLASH_STORAGE_BYTES <= PICO_FLASH_SIZE_BYTES , "MICROPY_HW_FLASH_STORAGE_BYTES too big" );
48
50
static_assert (MICROPY_HW_FLASH_STORAGE_BASE + MICROPY_HW_FLASH_STORAGE_BYTES <= PICO_FLASH_SIZE_BYTES , "MICROPY_HW_FLASH_STORAGE_BYTES too big" );
49
51
@@ -53,6 +55,14 @@ typedef struct _rp2_flash_obj_t {
53
55
uint32_t flash_size ;
54
56
} rp2_flash_obj_t ;
55
57
58
+ #if MICROPY_HW_ROMFS_BYTES > 0
59
+ static rp2_flash_obj_t rp2_flash_romfs_obj = {
60
+ .base = { & rp2_flash_type },
61
+ .flash_base = MICROPY_HW_ROMFS_BASE ,
62
+ .flash_size = MICROPY_HW_ROMFS_BYTES ,
63
+ };
64
+ #endif
65
+
56
66
static rp2_flash_obj_t rp2_flash_obj = {
57
67
.base = { & rp2_flash_type },
58
68
.flash_base = MICROPY_HW_FLASH_STORAGE_BASE ,
@@ -138,6 +148,19 @@ static mp_obj_t rp2_flash_make_new(const mp_obj_type_t *type, size_t n_args, siz
138
148
return MP_OBJ_FROM_PTR (self );
139
149
}
140
150
151
+ static mp_int_t rp2_flash_get_buffer (mp_obj_t self_in , mp_buffer_info_t * bufinfo , mp_uint_t flags ) {
152
+ rp2_flash_obj_t * self = MP_OBJ_TO_PTR (self_in );
153
+ if (flags == MP_BUFFER_READ ) {
154
+ bufinfo -> buf = (void * )(XIP_BASE + self -> flash_base );
155
+ bufinfo -> len = self -> flash_size ;
156
+ bufinfo -> typecode = 'B' ;
157
+ return 0 ;
158
+ } else {
159
+ // Write unsupported.
160
+ return 1 ;
161
+ }
162
+ }
163
+
141
164
static mp_obj_t rp2_flash_readblocks (size_t n_args , const mp_obj_t * args ) {
142
165
rp2_flash_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
143
166
uint32_t offset = mp_obj_get_int (args [1 ]) * BLOCK_SIZE_BYTES ;
@@ -218,5 +241,21 @@ MP_DEFINE_CONST_OBJ_TYPE(
218
241
MP_QSTR_Flash ,
219
242
MP_TYPE_FLAG_NONE ,
220
243
make_new , rp2_flash_make_new ,
244
+ buffer , rp2_flash_get_buffer ,
221
245
locals_dict , & rp2_flash_locals_dict
222
246
);
247
+
248
+ #if MICROPY_VFS_ROM_IOCTL
249
+ mp_obj_t mp_vfs_rom_ioctl (size_t n_args , const mp_obj_t * args ) {
250
+ switch (mp_obj_get_int (args [0 ])) {
251
+ #if MICROPY_HW_ROMFS_BYTES > 0
252
+ case MP_VFS_ROM_IOCTL_GET_NUMBER_OF_SEGMENTS :
253
+ return MP_OBJ_NEW_SMALL_INT (1 );
254
+ case MP_VFS_ROM_IOCTL_GET_SEGMENT :
255
+ return MP_OBJ_FROM_PTR (& rp2_flash_romfs_obj );
256
+ #endif
257
+ default :
258
+ return MP_OBJ_NEW_SMALL_INT (- MP_EINVAL );
259
+ }
260
+ }
261
+ #endif
0 commit comments