summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-07-28 22:08:11 +0800
committersakumisu <[email protected]>2025-07-28 22:08:20 +0800
commit1f065cec44f7e09b340f9b1392188956fa11bd2e (patch)
tree6b79de6a790cad6030daf71d116b981ba15d40a1
parent3b1853ceb55d6929c2fedfb4f3adac1c89e7c11b (diff)
update(port/musb/usb_hc_musb): check urb for iso to support iso later
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--port/musb/usb_hc_musb.c58
1 files changed, 31 insertions, 27 deletions
diff --git a/port/musb/usb_hc_musb.c b/port/musb/usb_hc_musb.c
index c2ac9bb9..263b3f9a 100644
--- a/port/musb/usb_hc_musb.c
+++ b/port/musb/usb_hc_musb.c
@@ -122,7 +122,7 @@
#define MUSB_RXHUBADDRx_OFFSET 0x8E
#define MUSB_RXHUBPORTx_OFFSET 0x8F
-#define MUSB_TXMAP0_OFFSET 0x100
+#define MUSB_TXMAP0_OFFSET 0x100
// do not use EPIDX
#define USB_TXMAP_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx)
@@ -1052,23 +1052,25 @@ void USBH_IRQHandler(uint8_t busid)
urb->errorcode = -USB_ERR_STALL;
musb_urb_waitup(urb);
} else {
- uint32_t size = urb->transfer_buffer_length;
+ if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
+ uint32_t size = urb->transfer_buffer_length;
- if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) {
- size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
- }
+ if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) {
+ size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
+ }
- urb->transfer_buffer += size;
- urb->transfer_buffer_length -= size;
- urb->actual_length += size;
+ urb->transfer_buffer += size;
+ urb->transfer_buffer_length -= size;
+ urb->actual_length += size;
- if (urb->transfer_buffer_length == 0) {
- //HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << ep_idx);
- urb->errorcode = 0;
- musb_urb_waitup(urb);
- } else {
- musb_write_packet(bus, ep_idx, urb->transfer_buffer, MIN(urb->transfer_buffer_length, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)));
- HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY;
+ if (urb->transfer_buffer_length == 0) {
+ //HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << ep_idx);
+ urb->errorcode = 0;
+ musb_urb_waitup(urb);
+ } else {
+ musb_write_packet(bus, ep_idx, urb->transfer_buffer, MIN(urb->transfer_buffer_length, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)));
+ HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY;
+ }
}
}
}
@@ -1099,22 +1101,24 @@ void USBH_IRQHandler(uint8_t busid)
urb->errorcode = -USB_ERR_STALL;
musb_urb_waitup(urb);
} else if (ep_csrl_status & USB_RXCSRL1_RXRDY) {
- size = HWREGH(USB_RXCOUNT_BASE(ep_idx));
+ if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
+ size = HWREGH(USB_RXCOUNT_BASE(ep_idx));
- musb_read_packet(bus, ep_idx, urb->transfer_buffer, size);
+ musb_read_packet(bus, ep_idx, urb->transfer_buffer, size);
- HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_RXRDY;
+ HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_RXRDY;
- urb->transfer_buffer += size;
- urb->transfer_buffer_length -= size;
- urb->actual_length += size;
+ urb->transfer_buffer += size;
+ urb->transfer_buffer_length -= size;
+ urb->actual_length += size;
- if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) {
- //HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << ep_idx);
- urb->errorcode = 0;
- musb_urb_waitup(urb);
- } else {
- HWREGB(USB_RXCSRL_BASE(ep_idx)) = USB_RXCSRL1_REQPKT;
+ if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) {
+ //HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << ep_idx);
+ urb->errorcode = 0;
+ musb_urb_waitup(urb);
+ } else {
+ HWREGB(USB_RXCSRL_BASE(ep_idx)) = USB_RXCSRL1_REQPKT;
+ }
}
}
}