summary refs log tree commit diff
path: root/src/pico1541.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pico1541.c')
-rw-r--r--src/pico1541.c43
1 files changed, 22 insertions, 21 deletions
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;