replace dcd_xfer_complete by dcd_xfer_complete()
This commit is contained in:
parent
e7a63324dd
commit
55427606ef
|
@ -304,7 +304,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u
|
||||||
// Complete IN while waiting for CMD is usually Status of previous SCSI op, ignore it
|
// Complete IN while waiting for CMD is usually Status of previous SCSI op, ignore it
|
||||||
if(ep_addr != p_msc->ep_out) return TUSB_ERROR_NONE;
|
if(ep_addr != p_msc->ep_out) return TUSB_ERROR_NONE;
|
||||||
|
|
||||||
TU_ASSERT( event == TUSB_EVENT_XFER_COMPLETE &&
|
TU_ASSERT( event == DCD_XFER_SUCCESS &&
|
||||||
xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE, TUSB_ERROR_INVALID_PARA );
|
xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE, TUSB_ERROR_INVALID_PARA );
|
||||||
|
|
||||||
p_csw->signature = MSC_CSW_SIGNATURE;
|
p_csw->signature = MSC_CSW_SIGNATURE;
|
||||||
|
@ -434,7 +434,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u
|
||||||
}
|
}
|
||||||
|
|
||||||
// simulate an transfer complete with adjusted parameters --> this driver callback will fired again
|
// simulate an transfer complete with adjusted parameters --> this driver callback will fired again
|
||||||
dcd_xfer_complete(rhport, p_msc->ep_out, xferred_bytes-nbytes, true);
|
dcd_event_xfer_complete(rhport, p_msc->ep_out, xferred_bytes-nbytes, DCD_XFER_SUCCESS, false);
|
||||||
|
|
||||||
return TUSB_ERROR_NONE; // skip the rest
|
return TUSB_ERROR_NONE; // skip the rest
|
||||||
}
|
}
|
||||||
|
@ -483,7 +483,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u
|
||||||
if ( dcd_edpt_stalled(rhport, p_msc->ep_in) || dcd_edpt_stalled(rhport, p_msc->ep_out) )
|
if ( dcd_edpt_stalled(rhport, p_msc->ep_in) || dcd_edpt_stalled(rhport, p_msc->ep_out) )
|
||||||
{
|
{
|
||||||
// simulate an transfer complete with adjusted parameters --> this driver callback will fired again
|
// simulate an transfer complete with adjusted parameters --> this driver callback will fired again
|
||||||
dcd_xfer_complete(rhport, p_msc->ep_out, 0, true);
|
dcd_event_xfer_complete(rhport, p_msc->ep_out, 0, DCD_XFER_SUCCESS, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -545,7 +545,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
|
||||||
else if ( nbytes == 0 )
|
else if ( nbytes == 0 )
|
||||||
{
|
{
|
||||||
// zero means not ready -> simulate an transfer complete so that this driver callback will fired again
|
// zero means not ready -> simulate an transfer complete so that this driver callback will fired again
|
||||||
dcd_xfer_complete(rhport, p_msc->ep_in, 0, true);
|
dcd_event_xfer_complete(rhport, p_msc->ep_in, 0, DCD_XFER_SUCCESS, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -197,9 +197,6 @@ typedef enum
|
||||||
TUSB_EVENT_XFER_COMPLETE,
|
TUSB_EVENT_XFER_COMPLETE,
|
||||||
TUSB_EVENT_XFER_ERROR,
|
TUSB_EVENT_XFER_ERROR,
|
||||||
TUSB_EVENT_XFER_STALLED,
|
TUSB_EVENT_XFER_STALLED,
|
||||||
|
|
||||||
TUSB_EVENT_BUS_RESET, // TODO refractor
|
|
||||||
TUSB_EVENT_SETUP_RECEIVED,
|
|
||||||
}tusb_event_t;
|
}tusb_event_t;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -49,6 +49,13 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DCD_XFER_SUCCESS = 0,
|
||||||
|
DCD_XFER_FAILED,
|
||||||
|
DCD_XFER_STALLED
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
DCD_EVENT_BUS_RESET = 1,
|
DCD_EVENT_BUS_RESET = 1,
|
||||||
|
@ -103,16 +110,23 @@ void dcd_disconnect (uint8_t rhport) ATTR_WEAK;
|
||||||
/* Event Function
|
/* Event Function
|
||||||
* Called by DCD to notify USBD
|
* Called by DCD to notify USBD
|
||||||
*------------------------------------------------------------------*/
|
*------------------------------------------------------------------*/
|
||||||
void dcd_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded);
|
|
||||||
|
|
||||||
static inline void dcd_control_complete(uint8_t rhport, uint32_t xferred_bytes)
|
|
||||||
{
|
|
||||||
// all control complete is successful !!
|
|
||||||
dcd_xfer_complete(rhport, 0, xferred_bytes, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dcd_event_handler(dcd_event_t const * event, bool in_isr);
|
void dcd_event_handler(dcd_event_t const * event, bool in_isr);
|
||||||
|
|
||||||
|
static inline void dcd_event_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
|
||||||
|
{
|
||||||
|
dcd_event_t event =
|
||||||
|
{
|
||||||
|
.rhport = 0,
|
||||||
|
.event_id = DCD_EVENT_XFER_COMPLETE,
|
||||||
|
};
|
||||||
|
|
||||||
|
event.xfer_complete.ep_addr = ep_addr;
|
||||||
|
event.xfer_complete.len = xferred_bytes;
|
||||||
|
event.xfer_complete.result = result;
|
||||||
|
|
||||||
|
dcd_event_handler(&event, true);
|
||||||
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
/* Endpoint API
|
/* Endpoint API
|
||||||
*------------------------------------------------------------------*/
|
*------------------------------------------------------------------*/
|
||||||
|
|
|
@ -164,7 +164,7 @@ static osal_queue_t _usbd_q;
|
||||||
|
|
||||||
/*------------- control transfer semaphore -------------*/
|
/*------------- control transfer semaphore -------------*/
|
||||||
static osal_semaphore_def_t _usbd_sem_def;
|
static osal_semaphore_def_t _usbd_sem_def;
|
||||||
/*static*/ osal_semaphore_t _usbd_ctrl_sem;
|
osal_semaphore_t _usbd_ctrl_sem;
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// INTERNAL FUNCTION
|
// INTERNAL FUNCTION
|
||||||
|
@ -532,34 +532,6 @@ static void mark_interface_endpoint(uint8_t const* p_desc, uint16_t desc_len, ui
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// USBD-DCD Callback API
|
// USBD-DCD Callback API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
void dcd_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded)
|
|
||||||
{
|
|
||||||
if (ep_addr == 0 )
|
|
||||||
{
|
|
||||||
// Control Transfer
|
|
||||||
(void) rhport;
|
|
||||||
(void) succeeded;
|
|
||||||
|
|
||||||
// only signal data stage, skip status (zero byte)
|
|
||||||
if (xferred_bytes) osal_semaphore_post( _usbd_ctrl_sem, true);
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
dcd_event_t event =
|
|
||||||
{
|
|
||||||
.rhport = rhport,
|
|
||||||
.event_id = DCD_EVENT_XFER_COMPLETE,
|
|
||||||
};
|
|
||||||
|
|
||||||
event.xfer_complete.ep_addr = ep_addr;
|
|
||||||
event.xfer_complete.len = xferred_bytes;
|
|
||||||
event.xfer_complete.result = succeeded ? TUSB_EVENT_XFER_COMPLETE : TUSB_EVENT_XFER_ERROR;
|
|
||||||
|
|
||||||
osal_queue_send(_usbd_q, &event, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
TU_ASSERT(succeeded, );
|
|
||||||
}
|
|
||||||
|
|
||||||
void dcd_event_handler(dcd_event_t const * event, bool in_isr)
|
void dcd_event_handler(dcd_event_t const * event, bool in_isr)
|
||||||
{
|
{
|
||||||
uint8_t const rhport = event->rhport;
|
uint8_t const rhport = event->rhport;
|
||||||
|
@ -603,6 +575,22 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr)
|
||||||
osal_queue_send(_usbd_q, event, in_isr);
|
osal_queue_send(_usbd_q, event, in_isr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DCD_EVENT_XFER_COMPLETE:
|
||||||
|
if (event->xfer_complete.ep_addr == 0)
|
||||||
|
{
|
||||||
|
// only signal data stage, skip status (zero byte)
|
||||||
|
if (event->xfer_complete.len)
|
||||||
|
{
|
||||||
|
(void) event->xfer_complete.result; // TODO handle control error/stalled
|
||||||
|
osal_semaphore_post( _usbd_ctrl_sem, true);
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
osal_queue_send(_usbd_q, event, true);
|
||||||
|
}
|
||||||
|
TU_ASSERT(event->xfer_complete.result == DCD_XFER_SUCCESS,);
|
||||||
|
break;
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -414,14 +414,12 @@ void USBD_IRQHandler(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dcd_event_t event = { .rhport = 0 };
|
|
||||||
|
|
||||||
/*------------- Interrupt Processing -------------*/
|
/*------------- Interrupt Processing -------------*/
|
||||||
if ( int_status & USBD_INTEN_USBRESET_Msk )
|
if ( int_status & USBD_INTEN_USBRESET_Msk )
|
||||||
{
|
{
|
||||||
bus_reset();
|
bus_reset();
|
||||||
|
|
||||||
event.event_id = DCD_EVENT_BUS_RESET;
|
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_BUS_RESET };
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,7 +437,7 @@ void USBD_IRQHandler(void)
|
||||||
NRF_USBD->WINDEXL , NRF_USBD->WINDEXH , NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH
|
NRF_USBD->WINDEXL , NRF_USBD->WINDEXH , NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH
|
||||||
};
|
};
|
||||||
|
|
||||||
event.event_id = DCD_EVENT_SETUP_RECEIVED;
|
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SETUP_RECEIVED };
|
||||||
memcpy(&event.setup_received, setup, 8);
|
memcpy(&event.setup_received, setup, 8);
|
||||||
|
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
|
@ -461,7 +459,7 @@ void USBD_IRQHandler(void)
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
// Control IN complete
|
// Control IN complete
|
||||||
dcd_control_complete(0, _dcd.control.actual_len);
|
dcd_event_xfer_complete(0, 0, _dcd.control.actual_len, DCD_XFER_SUCCESS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -475,7 +473,7 @@ void USBD_IRQHandler(void)
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
// Control OUT complete
|
// Control OUT complete
|
||||||
dcd_control_complete(0, _dcd.control.actual_len);
|
dcd_event_xfer_complete(0, 0, _dcd.control.actual_len, DCD_XFER_SUCCESS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -506,7 +504,7 @@ void USBD_IRQHandler(void)
|
||||||
xfer->total_len = xfer->actual_len;
|
xfer->total_len = xfer->actual_len;
|
||||||
|
|
||||||
// BULK/INT OUT complete
|
// BULK/INT OUT complete
|
||||||
dcd_xfer_complete(0, epnum, xfer->actual_len, true);
|
dcd_event_xfer_complete(0, epnum, xfer->actual_len, DCD_XFER_SUCCESS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,7 +533,7 @@ void USBD_IRQHandler(void)
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
// Bulk/Int IN complete
|
// Bulk/Int IN complete
|
||||||
dcd_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, true);
|
dcd_event_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, DCD_XFER_SUCCESS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -563,7 +561,7 @@ void USBD_IRQHandler(void)
|
||||||
// SOF interrupt
|
// SOF interrupt
|
||||||
if ( int_status & USBD_INTEN_SOF_Msk )
|
if ( int_status & USBD_INTEN_SOF_Msk )
|
||||||
{
|
{
|
||||||
event.event_id = DCD_EVENT_SOF;
|
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SOF };
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -398,10 +398,11 @@ void xfer_complete_isr(uint8_t rhport, uint32_t reg_complete)
|
||||||
|
|
||||||
if (p_qtd->int_on_complete)
|
if (p_qtd->int_on_complete)
|
||||||
{
|
{
|
||||||
bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true;
|
uint8_t result = p_qtd->halted ? DCD_XFER_STALLED :
|
||||||
|
( p_qtd->xact_err ||p_qtd->buffer_err ) ? DCD_XFER_FAILED : DCD_XFER_SUCCESS;
|
||||||
|
|
||||||
uint8_t ep_addr = edpt_phy2addr(ep_idx);
|
uint8_t ep_addr = edpt_phy2addr(ep_idx);
|
||||||
dcd_xfer_complete(rhport, ep_addr, p_qtd->expected_bytes - p_qtd->total_bytes, succeeded); // only number of bytes in the IOC qtd
|
dcd_event_xfer_complete(rhport, ep_addr, p_qtd->expected_bytes - p_qtd->total_bytes, result, true); // only number of bytes in the IOC qtd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -418,13 +419,12 @@ void hal_dcd_isr(uint8_t rhport)
|
||||||
|
|
||||||
if (int_status == 0) return;// disabled interrupt sources
|
if (int_status == 0) return;// disabled interrupt sources
|
||||||
|
|
||||||
dcd_event_t event = { .rhport = rhport };
|
|
||||||
|
|
||||||
if (int_status & INT_MASK_RESET)
|
if (int_status & INT_MASK_RESET)
|
||||||
{
|
{
|
||||||
bus_reset(rhport);
|
bus_reset(rhport);
|
||||||
|
|
||||||
event.event_id = DCD_EVENT_BUS_RESET;
|
dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_BUS_RESET };
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ void hal_dcd_isr(uint8_t rhport)
|
||||||
{ // Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration.
|
{ // Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration.
|
||||||
if ((lpc_usb->DEVICEADDR >> 25) & 0x0f)
|
if ((lpc_usb->DEVICEADDR >> 25) & 0x0f)
|
||||||
{
|
{
|
||||||
event.event_id = DCD_EVENT_SUSPENDED;
|
dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SUSPENDED };
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -445,7 +445,7 @@ void hal_dcd_isr(uint8_t rhport)
|
||||||
// {
|
// {
|
||||||
// if ( !(lpc_usb->PORTSC1_D & PORTSC_CURRENT_CONNECT_STATUS_MASK) )
|
// if ( !(lpc_usb->PORTSC1_D & PORTSC_CURRENT_CONNECT_STATUS_MASK) )
|
||||||
// {
|
// {
|
||||||
// event.event_id = DCD_EVENT_UNPLUGGED;
|
// dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_UNPLUGGED };
|
||||||
// dcd_event_handler(&event, true);
|
// dcd_event_handler(&event, true);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
@ -463,7 +463,7 @@ void hal_dcd_isr(uint8_t rhport)
|
||||||
// 23.10.10.2 Operational model for setup transfers
|
// 23.10.10.2 Operational model for setup transfers
|
||||||
lpc_usb->ENDPTSETUPSTAT = lpc_usb->ENDPTSETUPSTAT;// acknowledge
|
lpc_usb->ENDPTSETUPSTAT = lpc_usb->ENDPTSETUPSTAT;// acknowledge
|
||||||
|
|
||||||
event.event_id = DCD_EVENT_SETUP_RECEIVED;
|
dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SETUP_RECEIVED };
|
||||||
event.setup_received = p_dcd->qhd[0].setup_request;
|
event.setup_received = p_dcd->qhd[0].setup_request;
|
||||||
|
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
|
@ -480,10 +480,10 @@ void hal_dcd_isr(uint8_t rhport)
|
||||||
|
|
||||||
if ( p_qtd->int_on_complete )
|
if ( p_qtd->int_on_complete )
|
||||||
{
|
{
|
||||||
bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true;
|
uint8_t result = p_qtd->halted ? DCD_XFER_STALLED :
|
||||||
(void) succeeded;
|
( p_qtd->xact_err ||p_qtd->buffer_err ) ? DCD_XFER_FAILED : DCD_XFER_SUCCESS;
|
||||||
|
|
||||||
dcd_control_complete(rhport, p_qtd->expected_bytes - p_qtd->total_bytes);
|
dcd_event_xfer_complete(rhport, 0, p_qtd->expected_bytes - p_qtd->total_bytes, result, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,7 +496,7 @@ void hal_dcd_isr(uint8_t rhport)
|
||||||
|
|
||||||
if (int_status & INT_MASK_SOF)
|
if (int_status & INT_MASK_SOF)
|
||||||
{
|
{
|
||||||
event.event_id = DCD_EVENT_SOF;
|
dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SOF };
|
||||||
dcd_event_handler(&event, true);
|
dcd_event_handler(&event, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue