From e00178a1afefc9b0b2d4fc440a6db536a4bb7afe Mon Sep 17 00:00:00 2001 From: Peter Lawrence <12226419+majbthrd@users.noreply.github.com> Date: Tue, 23 Feb 2021 14:04:56 -0600 Subject: [PATCH] rp2040: don't compile in host code when in device mode --- src/portable/raspberrypi/rp2040/rp2040_usb.c | 10 ++++++++++ src/portable/raspberrypi/rp2040/rp2040_usb.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/portable/raspberrypi/rp2040/rp2040_usb.c b/src/portable/raspberrypi/rp2040/rp2040_usb.c index 339297ad..80d4c299 100644 --- a/src/portable/raspberrypi/rp2040/rp2040_usb.c +++ b/src/portable/raspberrypi/rp2040/rp2040_usb.c @@ -44,10 +44,12 @@ static inline void _hw_endpoint_lock_update(struct hw_endpoint *ep, int delta) { // sense to have worker and IRQ on same core, however I think using critsec is about equivalent. } +#ifdef RP2040_USB_HOST_MODE static inline void _hw_endpoint_update_last_buf(struct hw_endpoint *ep) { ep->last_buf = ep->len + ep->transfer_size == ep->total_len; } +#endif void rp2040_usb_init(void) { @@ -68,7 +70,9 @@ void hw_endpoint_reset_transfer(struct hw_endpoint *ep) { ep->stalled = false; ep->active = false; +#ifdef RP2040_USB_HOST_MODE ep->sent_setup = false; +#endif ep->total_len = 0; ep->len = 0; ep->transfer_size = 0; @@ -122,6 +126,7 @@ void _hw_endpoint_start_next_buffer(struct hw_endpoint *ep) val |= ep->next_pid ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID; ep->next_pid ^= 1u; +#ifdef RP2040_USB_HOST_MODE // Is this the last buffer? Only really matters for host mode. Will trigger // the trans complete irq but also stop it polling. We only really care about // trans complete for setup packets being sent @@ -130,6 +135,7 @@ void _hw_endpoint_start_next_buffer(struct hw_endpoint *ep) pico_trace("Last buf (%d bytes left)\n", ep->transfer_size); val |= USB_BUF_CTRL_LAST; } +#endif // Finally, write to buffer_control which will trigger the transfer // the next time the controller polls this dpram address @@ -156,9 +162,11 @@ void _hw_endpoint_xfer_start(struct hw_endpoint *ep, uint8_t *buffer, uint16_t t ep->transfer_size = tu_min32(total_len, ep->wMaxPacketSize); ep->active = true; ep->user_buf = buffer; +#ifdef RP2040_USB_HOST_MODE // Recalculate if this is the last buffer _hw_endpoint_update_last_buf(ep); ep->buf_sel = 0; +#endif _hw_endpoint_start_next_buffer(ep); _hw_endpoint_lock_update(ep, -1); @@ -232,7 +240,9 @@ bool _hw_endpoint_xfer_continue(struct hw_endpoint *ep) // Now we have synced our state with the hardware. Is there more data to transfer? uint remaining_bytes = ep->total_len - ep->len; ep->transfer_size = tu_min32(remaining_bytes, ep->wMaxPacketSize); +#ifdef RP2040_USB_HOST_MODE _hw_endpoint_update_last_buf(ep); +#endif // Can happen because of programmer error so check for it if (ep->len > ep->total_len) diff --git a/src/portable/raspberrypi/rp2040/rp2040_usb.h b/src/portable/raspberrypi/rp2040/rp2040_usb.h index 7c3234e8..db984549 100644 --- a/src/portable/raspberrypi/rp2040/rp2040_usb.h +++ b/src/portable/raspberrypi/rp2040/rp2040_usb.h @@ -71,11 +71,13 @@ struct hw_endpoint uint len; // Amount of data with the hardware uint transfer_size; +#ifdef RP2040_USB_HOST_MODE // Only needed for host mode bool last_buf; // HOST BUG. Host will incorrect write status to top half of buffer // control register when doing transfers > 1 packet uint8_t buf_sel; +#endif // User buffer in main memory uint8_t *user_buf; @@ -84,11 +86,13 @@ struct hw_endpoint // Interrupt, bulk, etc uint8_t transfer_type; +#ifdef RP2040_USB_HOST_MODE // Only needed for host uint8_t dev_addr; bool sent_setup; // If interrupt endpoint uint8_t interrupt_num; +#endif }; void rp2040_usb_init(void);