making more progress, but failed with WRITE10
incorrect queue 448 bytes instead of 512
This commit is contained in:
parent
050fa2fd39
commit
421221baa5
|
@ -379,7 +379,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
|
||||||
xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE );
|
xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE );
|
||||||
|
|
||||||
TU_LOG2(" Command Block Wrapper\n");
|
TU_LOG2(" Command Block Wrapper\n");
|
||||||
TU_LOG2_MEM(p_cbw, xferred_bytes, 2);
|
// TU_LOG2_MEM(p_cbw, xferred_bytes, 2);
|
||||||
|
|
||||||
p_csw->signature = MSC_CSW_SIGNATURE;
|
p_csw->signature = MSC_CSW_SIGNATURE;
|
||||||
p_csw->tag = p_cbw->tag;
|
p_csw->tag = p_cbw->tag;
|
||||||
|
@ -451,7 +451,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSC_STAGE_DATA:
|
case MSC_STAGE_DATA:
|
||||||
//TU_LOG2(" SCSI Data\n");
|
TU_LOG2(" SCSI Data\n");
|
||||||
//TU_LOG2_MEM(_mscd_buf, xferred_bytes, 2);
|
//TU_LOG2_MEM(_mscd_buf, xferred_bytes, 2);
|
||||||
|
|
||||||
// OUT transfer, invoke callback if needed
|
// OUT transfer, invoke callback if needed
|
||||||
|
@ -545,7 +545,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
|
||||||
if( (ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t)) )
|
if( (ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t)) )
|
||||||
{
|
{
|
||||||
TU_LOG2(" Command Status Wrapper\n");
|
TU_LOG2(" Command Status Wrapper\n");
|
||||||
TU_LOG2_MEM(p_csw, xferred_bytes, 2);
|
// TU_LOG2_MEM(p_csw, xferred_bytes, 2);
|
||||||
|
|
||||||
// Move to default CMD stage
|
// Move to default CMD stage
|
||||||
p_msc->stage = MSC_STAGE_CMD;
|
p_msc->stage = MSC_STAGE_CMD;
|
||||||
|
|
|
@ -63,6 +63,13 @@ void xfer_begin(xfer_desc_t* xfer, uint8_t * buffer, uint16_t total_bytes)
|
||||||
xfer->actual_len = 0;
|
xfer->actual_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xfer_end(xfer_desc_t* xfer)
|
||||||
|
{
|
||||||
|
xfer->buffer = NULL;
|
||||||
|
xfer->total_len = 0;
|
||||||
|
xfer->actual_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t xfer_packet_len(xfer_desc_t* xfer)
|
uint16_t xfer_packet_len(xfer_desc_t* xfer)
|
||||||
{
|
{
|
||||||
// also cover zero-length packet
|
// also cover zero-length packet
|
||||||
|
@ -258,10 +265,12 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
|
||||||
|
|
||||||
// OUT Data may already received and acked by hardware
|
// OUT Data may already received and acked by hardware
|
||||||
// Read it as 1st packet then continue with transfer if needed
|
// Read it as 1st packet then continue with transfer if needed
|
||||||
// uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);
|
if ( UDP->UDP_CSR[epnum] & (UDP_CSR_RX_DATA_BK0_Msk | UDP_CSR_RX_DATA_BK1_Msk) )
|
||||||
//
|
{
|
||||||
// if ( xact_len )
|
uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);
|
||||||
// {
|
|
||||||
|
TU_LOG2("xact_len = %d\r", xact_len);
|
||||||
|
|
||||||
// // Read from EP fifo
|
// // Read from EP fifo
|
||||||
// xact_ep_read(epnum, xfer->buffer, xact_len);
|
// xact_ep_read(epnum, xfer->buffer, xact_len);
|
||||||
// xfer_packet_done(xfer);
|
// xfer_packet_done(xfer);
|
||||||
|
@ -277,10 +286,10 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
|
||||||
// dcd_event_xfer_complete(rhport, epnum, xact_len, XFER_RESULT_SUCCESS, false);
|
// dcd_event_xfer_complete(rhport, epnum, xact_len, XFER_RESULT_SUCCESS, false);
|
||||||
// return true; // complete
|
// return true; // complete
|
||||||
// }
|
// }
|
||||||
// }
|
}
|
||||||
|
|
||||||
// Enable interrupt when starting OUT transfer
|
// Enable interrupt when starting OUT transfer
|
||||||
UDP->UDP_IER |= (1 << epnum);
|
if (epnum != 0) UDP->UDP_IER |= (1 << epnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -397,10 +406,13 @@ void dcd_isr(uint8_t rhport)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint OUT
|
// Endpoint OUT
|
||||||
if (UDP->UDP_CSR[epnum] & UDP_CSR_RX_DATA_BK0_Msk)
|
// When both Bank0 and Bank1 are both set, there is not way to know which one comes first
|
||||||
|
if (UDP->UDP_CSR[epnum] & (UDP_CSR_RX_DATA_BK0_Msk | UDP_CSR_RX_DATA_BK1_Msk))
|
||||||
{
|
{
|
||||||
uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);
|
uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);
|
||||||
|
|
||||||
|
//if (epnum != 0) TU_LOG2("xact_len = %d\r", xact_len);
|
||||||
|
|
||||||
// Read from EP fifo
|
// Read from EP fifo
|
||||||
xact_ep_read(epnum, xfer->buffer, xact_len);
|
xact_ep_read(epnum, xfer->buffer, xact_len);
|
||||||
xfer_packet_done(xfer);
|
xfer_packet_done(xfer);
|
||||||
|
@ -408,13 +420,14 @@ void dcd_isr(uint8_t rhport)
|
||||||
if ( 0 == xfer_packet_len(xfer) )
|
if ( 0 == xfer_packet_len(xfer) )
|
||||||
{
|
{
|
||||||
// Disable OUT EP interrupt when transfer is complete
|
// Disable OUT EP interrupt when transfer is complete
|
||||||
UDP->UDP_IER &= ~(1 << epnum);
|
if (epnum != 0) UDP->UDP_IDR |= (1 << epnum);
|
||||||
|
|
||||||
dcd_event_xfer_complete(rhport, epnum, xact_len, XFER_RESULT_SUCCESS, true);
|
dcd_event_xfer_complete(rhport, epnum, xact_len, XFER_RESULT_SUCCESS, true);
|
||||||
|
// xfer_end(xfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear DATA Bank0 bit
|
// Clear DATA Bank0 bit
|
||||||
UDP->UDP_CSR[epnum] &= ~UDP_CSR_RX_DATA_BK0_Msk;
|
UDP->UDP_CSR[epnum] &= ~(UDP_CSR_RX_DATA_BK0_Msk | UDP_CSR_RX_DATA_BK1_Msk);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stall sent to host
|
// Stall sent to host
|
||||||
|
|
Loading…
Reference in New Issue