more code space opt -> fold read/write handlers

This commit is contained in:
R
2024-04-14 05:26:45 +01:00
parent 3c01843d1e
commit 50672d80b9
+12 -36
View File
@@ -362,9 +362,10 @@ __attribute__((naked)) int main(void) {
uint32_t msc_state = STATE_WANT_CBW; uint32_t msc_state = STATE_WANT_CBW;
uint32_t dCSWTag = 0; uint32_t dCSWTag = 0;
// when reading: // when reading:
// [31:0] = current lba // [31:16] = current lba
// [15:0] = blocks left // [15:0] = blocks left
// when writing: // when writing:
// [31:16] = ignored
// [15:0] = blocks left // [15:0] = blocks left
uint32_t scsi_xfer_lba_blocks = 0; uint32_t scsi_xfer_lba_blocks = 0;
@@ -654,42 +655,9 @@ __attribute__((naked)) int main(void) {
msc_state = STATE_SENT_DATA_IN; msc_state = STATE_SENT_DATA_IN;
break; break;
case 0x28: case 0x28:
{
// READ (10)
// xxx also don't bother checking the flags
// @ 16: flags lba3
// @ 18: lba2 lba1
// @ 20: lba0 group
// @ 22: len1 len0
uint32_t lba = (USB_EP1_OUT(16) << 16) & 0xff000000;
uint32_t tmp = USB_EP1_OUT(18);
lba |= (tmp & 0xff) << 24;
lba |= (tmp & 0xff00);
tmp = USB_EP1_OUT(20);
lba |= (tmp & 0xff);
tmp = USB_EP1_OUT(22);
uint32_t blocks = (tmp >> 8) | ((tmp & 0xff) << 8);
if (blocks > 0x4000 || lba >= 0x4000 || (blocks + lba) > 0x4000) {
msc_state = STATE_SENT_CSW | (5 << 20) | (0x24 << 24);
set_ep_mode(1, 1, USB_EPTYPE_BULK, USB_STAT_STALL, USB_STAT_STALL, 0, 0);
break;
}
if (blocks == 0) {
make_msc_csw(dCSWTag, 0);
msc_state = STATE_SENT_CSW;
break;
}
synthesize_block(lba, 0);
scsi_xfer_lba_blocks = (lba << 16) | blocks;
msc_state = STATE_SEND_MORE_READ;
break;
}
case 0x2a: case 0x2a:
{ {
// WRITE (10) // READ (10) / WRITE (10)
// xxx also don't bother checking the flags // xxx also don't bother checking the flags
// @ 16: flags lba3 // @ 16: flags lba3
// @ 18: lba2 lba1 // @ 18: lba2 lba1
@@ -716,9 +684,17 @@ __attribute__((naked)) int main(void) {
break; break;
} }
scsi_xfer_lba_blocks = blocks; scsi_xfer_lba_blocks = (lba << 16) | blocks;
if (operation_code == 0x28) {
// READ
synthesize_block(lba, 0);
msc_state = STATE_SEND_MORE_READ;
} else {
// WRITE
set_ep_mode(1, 1, USB_EPTYPE_BULK, USB_STAT_ACK, USB_STAT_STALL, 0, 0); set_ep_mode(1, 1, USB_EPTYPE_BULK, USB_STAT_ACK, USB_STAT_STALL, 0, 0);
msc_state = STATE_WAITING_FOR_WRITE; msc_state = STATE_WAITING_FOR_WRITE;
}
break; break;
} }
default: default: