DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to write (1..128) */ ) { switch (pdrv) { case PD_FLASH: for (int i = 0; i < count; i++) { if (!storage_write_block(buff + i * FLASH_BLOCK_SIZE, sector + i)) { return RES_ERROR; } } return RES_OK; #if MICROPY_HW_HAS_SDCARD case PD_SDCARD: if (!sdcard_write_blocks(buff, sector, count)) { return RES_ERROR; } return RES_OK; #endif } return RES_PARERR; }
mp_uint_t storage_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t num_blocks) { for (size_t i = 0; i < num_blocks; i++) { if (!storage_write_block(src + i * FLASH_BLOCK_SIZE, block_num + i)) { return 1; // error } } return 0; // success }
DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to write (1..128) */ ) { switch (pdrv) { case PD_FLASH: for (int i = 0; i < count; i++) { if (!storage_write_block(buff + i * FLASH_BLOCK_SIZE, sector + i)) { return RES_ERROR; } } return RES_OK; #if MICROPY_HW_HAS_SDCARD case PD_SDCARD: if (sdcard_write_blocks(buff, sector, count) != 0) { return RES_ERROR; } return RES_OK; #endif case PD_USER: if (MP_STATE_PORT(fs_user_mount) == NULL) { // nothing mounted return RES_ERROR; } if (MP_STATE_PORT(fs_user_mount)->writeblocks[0] == MP_OBJ_NULL) { // read-only block device return RES_ERROR; } MP_STATE_PORT(fs_user_mount)->writeblocks[2] = MP_OBJ_NEW_SMALL_INT(sector); MP_STATE_PORT(fs_user_mount)->writeblocks[3] = mp_obj_new_bytearray_by_ref(count * 512, (void*)buff); mp_call_method_n_kw(2, 0, MP_STATE_PORT(fs_user_mount)->writeblocks); return RES_OK; } return RES_PARERR; }