From 3ee6d4b5f90cea5f0959ed0724151551c8fb5029 Mon Sep 17 00:00:00 2001 From: Maxwell Beck Date: Thu, 29 May 2025 13:05:58 -0500 Subject: perf: Use 4K sectors for flash access --- src/pico1541.c | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) (limited to 'src/pico1541.c') diff --git a/src/pico1541.c b/src/pico1541.c index e46c4b9..63cb74a 100644 --- a/src/pico1541.c +++ b/src/pico1541.c @@ -170,8 +170,8 @@ bool tud_msc_test_unit_ready_cb(uint8_t lun) { } void tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count, uint16_t *block_size) { - *block_count = FS_BYTES / 512; - *block_size = 512; + *block_count = FS_BYTES / 4096; + *block_size = 4096; } bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) { @@ -182,19 +182,26 @@ bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, boo } int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize) { - if (lba >= FS_BYTES / 512) { + if (lba >= FS_BYTES / 4096) { return -1; } - uint8_t *addr = FS + 512 * lba + offset; + if (offset > 0) { + return -1; + } + + uint8_t *addr = FS + 4096 * lba; memcpy(buffer, addr, bufsize); return (int32_t)bufsize; } -// FIXME This is pretty naive.... int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize) { - if (lba >= FS_BYTES / 512) { + if (lba >= FS_BYTES / 4096) { + return -1; + } + + if (offset > 0) { return -1; } @@ -202,22 +209,16 @@ int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t * uint32_t sect_ofs = lba * 512 + offset - flash_sect; for (uint32_t i = 0; i < bufsize; i += 4096) { uint8_t flash_buf[4096]; - memcpy(flash_buf, FS + flash_sect + i, 4096); - if (i == 0) { - if (bufsize < 4096 - sect_ofs) { - memcpy(flash_buf + sect_ofs, buffer, bufsize); - } else { - memcpy(flash_buf + sect_ofs, buffer, 4096 - sect_ofs); - } - } else if (bufsize - i < 4096) { - memcpy(flash_buf, buffer + i - sect_ofs, bufsize - i); + if (bufsize - i < 4096) { + memcpy(flash_buf, FS + lba * 4096 + i, 4096); + memcpy(flash_buf, buffer + i, bufsize - i); } else { - memcpy(flash_buf, buffer + i - sect_ofs, 4096); + memcpy(flash_buf, buffer + i, 4096); } - flash_range_erase((uint32_t)FS + flash_sect - 0x10000000, 4096); - flash_range_program((uint32_t)FS + flash_sect - 0x10000000, flash_buf, 4096); + flash_range_erase((uint32_t)FS + lba * 4096 - 0x10000000, 4096); + flash_range_program((uint32_t)FS + lba * 4096 - 0x10000000, flash_buf, 4096); } return (int32_t)bufsize; @@ -241,7 +242,7 @@ DSTATUS disk_initialize(BYTE pdrv) { } DRESULT disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count) { - memcpy(buff, FS + 512 * sector, 512 * count); + memcpy(buff, FS + 4096 * sector, 4096 * count); return RES_OK; } @@ -255,10 +256,10 @@ DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) { case CTRL_SYNC: return RES_OK; case GET_SECTOR_COUNT: - *(LBA_t *)buff = (FS_BYTES / 512); + *(LBA_t *)buff = (FS_BYTES / 4096); return RES_OK; case GET_SECTOR_SIZE: - *(WORD *)buff = 512; + *(WORD *)buff = 4096; return RES_OK; case GET_BLOCK_SIZE: *(DWORD *)buff = 4096; -- cgit 1.4.1