more code space opt -> fold read/write handlers
This commit is contained in:
+14
-38
@@ -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;
|
||||||
set_ep_mode(1, 1, USB_EPTYPE_BULK, USB_STAT_ACK, USB_STAT_STALL, 0, 0);
|
|
||||||
msc_state = STATE_WAITING_FOR_WRITE;
|
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);
|
||||||
|
msc_state = STATE_WAITING_FOR_WRITE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user