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"
@@ -44,6 +45,9 @@ static_assert(MICROPY_HW_FLASH_STORAGE_BYTES % 4096 == 0, "Flash storage size mu
44
45
#define MICROPY_HW_FLASH_STORAGE_BASE (PICO_FLASH_SIZE_BYTES - MICROPY_HW_FLASH_STORAGE_BYTES)
45
46
#endif
46
47
48
+ #define MICROPY_HW_ROMFS_BASE (512 * 1024) // leave 512k for firmware...
49
+ #define MICROPY_HW_ROMFS_BYTES (MICROPY_HW_FLASH_STORAGE_BASE - MICROPY_HW_ROMFS_BASE)
50
+
47
51
static_assert (MICROPY_HW_FLASH_STORAGE_BYTES <= PICO_FLASH_SIZE_BYTES , "MICROPY_HW_FLASH_STORAGE_BYTES too big" );
48
52
static_assert (MICROPY_HW_FLASH_STORAGE_BASE + MICROPY_HW_FLASH_STORAGE_BYTES <= PICO_FLASH_SIZE_BYTES , "MICROPY_HW_FLASH_STORAGE_BYTES too big" );
49
53
@@ -59,6 +63,14 @@ static rp2_flash_obj_t rp2_flash_obj = {
59
63
.flash_size = MICROPY_HW_FLASH_STORAGE_BYTES ,
60
64
};
61
65
66
+ #if MICROPY_HW_ROMFS_BYTES > 0
67
+ static rp2_flash_obj_t rp2_flash_romfs_obj = {
68
+ .base = { & rp2_flash_type },
69
+ .flash_base = MICROPY_HW_ROMFS_BASE ,
70
+ .flash_size = MICROPY_HW_ROMFS_BYTES ,
71
+ };
72
+ #endif
73
+
62
74
// Tag the flash drive in the binary as readable/writable (but not reformatable)
63
75
bi_decl (bi_block_device (
64
76
BINARY_INFO_TAG_MICROPYTHON ,
@@ -138,6 +150,19 @@ static mp_obj_t rp2_flash_make_new(const mp_obj_type_t *type, size_t n_args, siz
138
150
return MP_OBJ_FROM_PTR (self );
139
151
}
140
152
153
+ static mp_int_t rp2_flash_get_buffer (mp_obj_t self_in , mp_buffer_info_t * bufinfo , mp_uint_t flags ) {
154
+ rp2_flash_obj_t * self = MP_OBJ_TO_PTR (self_in );
155
+ if (flags == MP_BUFFER_READ ) {
156
+ bufinfo -> buf = (void * )(XIP_BASE + self -> flash_base );
157
+ bufinfo -> len = self -> flash_size ;
158
+ bufinfo -> typecode = 'B' ;
159
+ return 0 ;
160
+ } else {
161
+ // Write unsupported.
162
+ return 1 ;
163
+ }
164
+ }
165
+
141
166
static mp_obj_t rp2_flash_readblocks (size_t n_args , const mp_obj_t * args ) {
142
167
rp2_flash_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
143
168
uint32_t offset = mp_obj_get_int (args [1 ]) * BLOCK_SIZE_BYTES ;
@@ -218,5 +243,19 @@ MP_DEFINE_CONST_OBJ_TYPE(
218
243
MP_QSTR_Flash ,
219
244
MP_TYPE_FLAG_NONE ,
220
245
make_new , rp2_flash_make_new ,
246
+ buffer , rp2_flash_get_buffer ,
221
247
locals_dict , & rp2_flash_locals_dict
222
248
);
249
+
250
+ mp_obj_t mp_vfs_rom_ioctl (size_t n_args , const mp_obj_t * args ) {
251
+ switch (mp_obj_get_int (args [0 ])) {
252
+ #if MICROPY_HW_ROMFS_BYTES > 0
253
+ case MP_VFS_ROM_IOCTL_GET_NUMBER_OF_SEGMENTS :
254
+ return MP_OBJ_NEW_SMALL_INT (1 );
255
+ case MP_VFS_ROM_IOCTL_GET_SEGMENT :
256
+ return MP_OBJ_FROM_PTR (& rp2_flash_romfs_obj );
257
+ #endif
258
+ default :
259
+ return MP_OBJ_NEW_SMALL_INT (- MP_EINVAL );
260
+ }
261
+ }
0 commit comments