summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2026-01-08 15:42:08 +0700
committerhathach <[email protected]>2026-01-08 15:42:08 +0700
commitd7e715d5c238e9b05ef711a1a73d54c40b37729e (patch)
treefb3f807d72593ac7e52fc9be5d62ffdf18484599 /src
parent07416f704f1a55b286d5c9b082e6f1e3e51ce9b0 (diff)
fix hcd force_single mistake by refactor
Diffstat (limited to 'src')
-rw-r--r--src/portable/raspberrypi/rp2040/hcd_rp2040.c42
-rw-r--r--src/portable/raspberrypi/rp2040/rp2040_usb.c5
2 files changed, 16 insertions, 31 deletions
diff --git a/src/portable/raspberrypi/rp2040/hcd_rp2040.c b/src/portable/raspberrypi/rp2040/hcd_rp2040.c
index c4eba0d5f..db3a81c87 100644
--- a/src/portable/raspberrypi/rp2040/hcd_rp2040.c
+++ b/src/portable/raspberrypi/rp2040/hcd_rp2040.c
@@ -110,35 +110,24 @@ static void __tusb_irq_path_func(_handle_buff_status_bit)(uint bit, struct hw_en
}
}
-static void __tusb_irq_path_func(hw_handle_buff_status)(void)
-{
+static void __tusb_irq_path_func(handle_hwbuf_status)(void) {
uint32_t remaining_buffers = usb_hw->buf_status;
pico_trace("buf_status 0x%08lx\n", remaining_buffers);
// Check EPX first
uint bit = 0b1;
- if ( remaining_buffers & bit )
- {
+ if (remaining_buffers & bit) {
remaining_buffers &= ~bit;
struct hw_endpoint * ep = &epx;
- uint32_t ep_ctrl = *hwep_ctrl_reg_host(ep);
- if ( ep_ctrl & EP_CTRL_DOUBLE_BUFFERED_BITS )
- {
- TU_LOG(3, "Double Buffered: ");
- }
- else
- {
- TU_LOG(3, "Single Buffered: ");
- }
- TU_LOG_HEX(3, ep_ctrl);
+ // uint32_t ep_ctrl = *hwep_ctrl_reg_host(ep);
+ // TU_LOG_HEX(3, ep_ctrl);
_handle_buff_status_bit(bit, ep);
}
// Check "interrupt" (asynchronous) endpoints for both IN and OUT
- for ( uint i = 1; i <= USB_HOST_INTERRUPT_ENDPOINTS && remaining_buffers; i++ )
- {
+ for (uint i = 1; i <= USB_HOST_INTERRUPT_ENDPOINTS && remaining_buffers; i++) {
// EPX is bit 0 & 1
// IEP1 IN is bit 2
// IEP1 OUT is bit 3
@@ -147,19 +136,16 @@ static void __tusb_irq_path_func(hw_handle_buff_status)(void)
// IEP3 IN is bit 6
// IEP3 OUT is bit 7
// etc
- for ( uint j = 0; j < 2; j++ )
- {
+ for (uint j = 0; j < 2; j++) {
bit = 1 << (i * 2 + j);
- if ( remaining_buffers & bit )
- {
+ if (remaining_buffers & bit) {
remaining_buffers &= ~bit;
_handle_buff_status_bit(bit, &ep_pool[i]);
}
}
}
- if ( remaining_buffers )
- {
+ if (remaining_buffers) {
panic("Unhandled buffer %d\n", remaining_buffers);
}
}
@@ -220,7 +206,7 @@ static void __tusb_irq_path_func(hcd_rp2040_irq)(void)
{
handled |= USB_INTS_BUFF_STATUS_BITS;
TU_LOG(2, "Buffer complete\r\n");
- hw_handle_buff_status();
+ handle_hwbuf_status();
}
if ( status & USB_INTS_TRANS_COMPLETE_BITS )
@@ -240,8 +226,8 @@ static void __tusb_irq_path_func(hcd_rp2040_irq)(void)
if ( status & USB_INTS_ERROR_DATA_SEQ_BITS )
{
usb_hw_clear->sie_status = USB_SIE_STATUS_DATA_SEQ_ERROR_BITS;
- TU_LOG(3, " Seq Error: [0] = 0x%04u [1] = 0x%04x\r\n", tu_u32_low16(*hw_endpoint_get_buf_ctrl(&epx)),
- tu_u32_high16(*hw_endpoint_get_buf_ctrl(&epx)));
+ TU_LOG(3, " Seq Error: [0] = 0x%04u [1] = 0x%04x\r\n", tu_u32_low16(*hwbuf_ctrl_reg_host(&epx)),
+ tu_u32_high16(*hwbuf_ctrl_reg_host(&epx)));
panic("Data Seq Error \n");
}
@@ -322,10 +308,8 @@ static void _hw_endpoint_init(struct hw_endpoint *ep, uint8_t dev_addr, uint8_t
assert(!(dpram_offset & 0b111111));
// Fill in endpoint control register with buffer offset
- uint32_t ep_reg = EP_CTRL_ENABLE_BITS
- | EP_CTRL_INTERRUPT_PER_BUFFER
- | (ep->transfer_type << EP_CTRL_BUFFER_TYPE_LSB)
- | dpram_offset;
+ uint32_t ep_reg = EP_CTRL_ENABLE_BITS | EP_CTRL_INTERRUPT_PER_BUFFER |
+ ((uint)transfer_type << EP_CTRL_BUFFER_TYPE_LSB) | dpram_offset;
if ( bmInterval )
{
ep_reg |= (uint32_t) ((bmInterval - 1) << EP_CTRL_HOST_INTERRUPT_INTERVAL_LSB);
diff --git a/src/portable/raspberrypi/rp2040/rp2040_usb.c b/src/portable/raspberrypi/rp2040/rp2040_usb.c
index 798129e0c..9c9255518 100644
--- a/src/portable/raspberrypi/rp2040/rp2040_usb.c
+++ b/src/portable/raspberrypi/rp2040/rp2040_usb.c
@@ -156,11 +156,12 @@ void __tusb_irq_path_func(hw_endpoint_start_next_buffer)(struct hw_endpoint* ep)
const tusb_dir_t dir = tu_edpt_dir(ep->ep_addr);
bool is_rx;
+ bool is_host = false;
io_rw_32 *ep_ctrl_reg;
io_rw_32 *buf_ctrl_reg;
#if CFG_TUH_ENABLED
- const bool is_host = rp2usb_is_host_mode();
+ is_host = rp2usb_is_host_mode();
if (is_host) {
buf_ctrl_reg = hwbuf_ctrl_reg_host(ep);
ep_ctrl_reg = hwep_ctrl_reg_host(ep);
@@ -185,7 +186,7 @@ void __tusb_irq_path_func(hw_endpoint_start_next_buffer)(struct hw_endpoint* ep)
// NOTE: this could happen to Host mode IN endpoint Also, Host mode "interrupt" endpoint hardware is only single
// buffered,
// NOTE2: Currently Host bulk is implemented using "interrupt" endpoint
- const bool force_single = is_rx;
+ const bool force_single = (!is_host && is_rx) || (is_host && tu_edpt_number(ep->ep_addr) != 0);
if (ep->remaining_len && !force_single) {
// Use buffer 1 (double buffered) if there is still data