improve pio usb endpoint handler
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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); | ||||
|   } | ||||
|  | ||||
|   if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS ) | ||||
|   { | ||||
|     handle_endpoint_irq(port, PIO_USB_INTS_ENDPOINT_ERROR_BITS); | ||||
|     handle_endpoint_irq(rport, XFER_RESULT_SUCCESS, &rport->ep_complete); | ||||
|   } | ||||
|  | ||||
|   if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS ) | ||||
|   { | ||||
|     handle_endpoint_irq(port, 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 | ||||
|   port->ints &= ~ints; | ||||
|   rport->ints &= ~ints; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach