summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2022-04-26 13:08:03 +0700
committerhathach <[email protected]>2022-04-26 13:08:03 +0700
commit4d11c658fffa810f271fdafb6453eff1f2b77b3f (patch)
tree18bdb63b1788c553539497fa33669277f9758cc3
parent26a25279bc7196d93ca074203ac35260298df472 (diff)
improve pio usb endpoint handler
-rw-r--r--src/portable/raspberrypi/pio_usb/dcd_pio_usb.c38
-rw-r--r--src/portable/raspberrypi/pio_usb/hcd_pio_usb.c42
2 files changed, 21 insertions, 59 deletions
diff --git a/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c b/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c
index 09be69afa..77f34238a 100644
--- a/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c
+++ b/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c
@@ -152,32 +152,8 @@ void dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)
//
//--------------------------------------------------------------------+
-static void __no_inline_not_in_flash_func(handle_endpoint_irq)(root_port_t* rport, uint32_t flag)
+static void __no_inline_not_in_flash_func(handle_endpoint_irq)(root_port_t* rport, xfer_result_t result, volatile uint32_t* ep_reg)
{
- volatile uint32_t* ep_reg;
- xfer_result_t result;
-
- if ( flag == PIO_USB_INTS_ENDPOINT_COMPLETE_BITS )
- {
- ep_reg = &rport->ep_complete;
- result = XFER_RESULT_SUCCESS;
- }
- else if ( flag == PIO_USB_INTS_ENDPOINT_ERROR_BITS )
- {
- ep_reg = &rport->ep_error;
- result = XFER_RESULT_FAILED;
- }
- else if ( flag == PIO_USB_INTS_ENDPOINT_STALLED_BITS )
- {
- ep_reg = &rport->ep_stalled;
- result = XFER_RESULT_STALLED;
- }
- else
- {
- // something wrong
- return;
- }
-
const uint32_t ep_all = *ep_reg;
for(uint8_t ep_idx = 0; ep_idx < PIO_USB_EP_POOL_CNT; ep_idx++)
@@ -215,7 +191,17 @@ void __no_inline_not_in_flash_func(pio_usb_device_irq_handler)(uint8_t root_id)
if ( ints & PIO_USB_INTS_ENDPOINT_COMPLETE_BITS )
{
- handle_endpoint_irq(rport, PIO_USB_INTS_ENDPOINT_COMPLETE_BITS);
+ handle_endpoint_irq(rport, XFER_RESULT_SUCCESS, &rport->ep_complete);
+ }
+
+ if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS )
+ {
+ handle_endpoint_irq(rport, XFER_RESULT_STALLED, &rport->ep_stalled);
+ }
+
+ if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS )
+ {
+ handle_endpoint_irq(rport, XFER_RESULT_FAILED, &rport->ep_error);
}
// clear all
diff --git a/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c b/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c
index 2b3d72df8..8101fb2d3 100644
--- a/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c
+++ b/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c
@@ -157,32 +157,8 @@ bool hcd_edpt_clear_stall(uint8_t dev_addr, uint8_t ep_addr)
return true;
}
-static void __no_inline_not_in_flash_func(handle_endpoint_irq)(root_port_t* port, uint32_t flag)
+static void __no_inline_not_in_flash_func(handle_endpoint_irq)(root_port_t* port, xfer_result_t result, volatile uint32_t* ep_reg)
{
- volatile uint32_t* ep_reg;
- xfer_result_t result;
-
- if ( flag == PIO_USB_INTS_ENDPOINT_COMPLETE_BITS )
- {
- ep_reg = &port->ep_complete;
- result = XFER_RESULT_SUCCESS;
- }
- else if ( flag == PIO_USB_INTS_ENDPOINT_ERROR_BITS )
- {
- ep_reg = &port->ep_error;
- result = XFER_RESULT_FAILED;
- }
- else if ( flag == PIO_USB_INTS_ENDPOINT_STALLED_BITS )
- {
- ep_reg = &port->ep_stalled;
- result = XFER_RESULT_STALLED;
- }
- else
- {
- // something wrong
- return;
- }
-
const uint32_t ep_all = *ep_reg;
for(uint8_t ep_idx = 0; ep_idx < PIO_USB_EP_POOL_CNT; ep_idx++)
@@ -204,8 +180,8 @@ static void __no_inline_not_in_flash_func(handle_endpoint_irq)(root_port_t* port
void __no_inline_not_in_flash_func(pio_usb_host_irq_handler)(uint8_t root_id)
{
uint8_t const tu_rhport = root_id + 1;
- root_port_t* port = PIO_USB_ROOT_PORT(root_id);
- uint32_t const ints = port->ints;
+ root_port_t* rport = PIO_USB_ROOT_PORT(root_id);
+ uint32_t const ints = rport->ints;
if ( ints & PIO_USB_INTS_CONNECT_BITS )
{
@@ -219,21 +195,21 @@ void __no_inline_not_in_flash_func(pio_usb_host_irq_handler)(uint8_t root_id)
if ( ints & PIO_USB_INTS_ENDPOINT_COMPLETE_BITS )
{
- handle_endpoint_irq(port, PIO_USB_INTS_ENDPOINT_COMPLETE_BITS);
+ handle_endpoint_irq(rport, XFER_RESULT_SUCCESS, &rport->ep_complete);
}
- if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS )
+ if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS )
{
- handle_endpoint_irq(port, PIO_USB_INTS_ENDPOINT_ERROR_BITS);
+ handle_endpoint_irq(rport, XFER_RESULT_STALLED, &rport->ep_stalled);
}
- if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS )
+ if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS )
{
- handle_endpoint_irq(port, PIO_USB_INTS_ENDPOINT_STALLED_BITS);
+ handle_endpoint_irq(rport, XFER_RESULT_FAILED, &rport->ep_error);
}
// clear all
- port->ints &= ~ints;
+ rport->ints &= ~ints;
}
#endif