add dcd event helper setup_recieved and bus_signal

This commit is contained in:
hathach 2018-10-25 15:02:43 +07:00
parent 8144be262b
commit b2f18744fe
2 changed files with 27 additions and 19 deletions

View File

@ -68,7 +68,7 @@ typedef enum
DCD_EVENT_XFER_COMPLETE, DCD_EVENT_XFER_COMPLETE,
USBD_EVT_FUNC_CALL USBD_EVT_FUNC_CALL
}usbd_eventid_t; } dcd_eventid_t;
typedef struct ATTR_ALIGNED(4) typedef struct ATTR_ALIGNED(4)
{ {
@ -112,21 +112,35 @@ void dcd_disconnect (uint8_t rhport) ATTR_WEAK;
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
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) // helper to send bus signal event
static inline void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr)
{ {
dcd_event_t event = dcd_event_t event = { .rhport = 0, .event_id = eid, };
{ dcd_event_handler(&event, in_isr);
.rhport = 0, }
.event_id = DCD_EVENT_XFER_COMPLETE,
}; // helper to send setup received
static inline void dcd_event_setup_recieved(uint8_t rhport, uint8_t const * setup, bool in_isr)
{
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SETUP_RECEIVED };
memcpy(&event.setup_received, setup, 8);
dcd_event_handler(&event, true);
}
// helper to send transfer complete event
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.ep_addr = ep_addr;
event.xfer_complete.len = xferred_bytes; event.xfer_complete.len = xferred_bytes;
event.xfer_complete.result = result; event.xfer_complete.result = result;
dcd_event_handler(&event, true); dcd_event_handler(&event, in_isr);
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* Endpoint API /* Endpoint API
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
@ -143,7 +157,8 @@ bool dcd_edpt_stalled (uint8_t rhport, uint8_t ep_addr);
//------------- Control Endpoint -------------// //------------- Control Endpoint -------------//
bool dcd_control_xfer (uint8_t rhport, uint8_t dir, uint8_t * buffer, uint16_t length); bool dcd_control_xfer (uint8_t rhport, uint8_t dir, uint8_t * buffer, uint16_t length);
// Note input dir is value of direction bit in setup packet (i.e DATA stage direction) // Helper to send STATUS (zero length) packet
// Note dir is value of direction bit in setup packet (i.e DATA stage direction)
static inline bool dcd_control_status(uint8_t rhport, uint8_t dir) static inline bool dcd_control_status(uint8_t rhport, uint8_t dir)
{ {
// status direction is reversed to one in the setup packet // status direction is reversed to one in the setup packet

View File

@ -418,9 +418,7 @@ void USBD_IRQHandler(void)
if ( int_status & USBD_INTEN_USBRESET_Msk ) if ( int_status & USBD_INTEN_USBRESET_Msk )
{ {
bus_reset(); bus_reset();
dcd_event_bus_signal(0, DCD_EVENT_BUS_RESET, true);
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_BUS_RESET };
dcd_event_handler(&event, true);
} }
if ( int_status & EDPT_END_ALL_MASK ) if ( int_status & EDPT_END_ALL_MASK )
@ -436,11 +434,7 @@ void USBD_IRQHandler(void)
NRF_USBD->BMREQUESTTYPE , NRF_USBD->BREQUEST, NRF_USBD->WVALUEL , NRF_USBD->WVALUEH, NRF_USBD->BMREQUESTTYPE , NRF_USBD->BREQUEST, NRF_USBD->WVALUEL , NRF_USBD->WVALUEH,
NRF_USBD->WINDEXL , NRF_USBD->WINDEXH , NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH NRF_USBD->WINDEXL , NRF_USBD->WINDEXH , NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH
}; };
dcd_event_setup_recieved(0, setup, true);
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SETUP_RECEIVED };
memcpy(&event.setup_received, setup, 8);
dcd_event_handler(&event, true);
} }
if ( int_status & USBD_INTEN_EP0DATADONE_Msk ) if ( int_status & USBD_INTEN_EP0DATADONE_Msk )
@ -561,8 +555,7 @@ void USBD_IRQHandler(void)
// SOF interrupt // SOF interrupt
if ( int_status & USBD_INTEN_SOF_Msk ) if ( int_status & USBD_INTEN_SOF_Msk )
{ {
dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SOF }; dcd_event_bus_signal(0, DCD_EVENT_SOF, true);
dcd_event_handler(&event, true);
} }
} }