diff options
| author | HiFiPhile <[email protected]> | 2025-11-21 00:07:22 +0100 |
|---|---|---|
| committer | HiFiPhile <[email protected]> | 2025-12-14 18:49:23 +0100 |
| commit | 86af966d2b27739df5df0c5e51af1201f9e4f6b5 (patch) | |
| tree | c72d14fa519eb58e6ed3e1d859d88f7795d47c85 /src/device | |
| parent | ad5fe66f19e8fb633f175affcfa27b8376e40639 (diff) | |
usbd: add ep0 buffer direct access
Signed-off-by: HiFiPhile <[email protected]>
Diffstat (limited to 'src/device')
| -rw-r--r-- | src/device/usbd_control.c | 11 | ||||
| -rw-r--r-- | src/device/usbd_pvt.h | 3 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/device/usbd_control.c b/src/device/usbd_control.c index 47d58a1f9..49fdce214 100644 --- a/src/device/usbd_control.c +++ b/src/device/usbd_control.c @@ -93,7 +93,7 @@ static bool data_stage_xact(uint8_t rhport) { if (_ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_IN) { ep_addr = EDPT_CTRL_IN; - if (0u != xact_len) { + if (0u != xact_len && _ctrl_xfer.buffer != _ctrl_epbuf.buf) { TU_VERIFY(0 == tu_memcpy_s(_ctrl_epbuf.buf, CFG_TUD_ENDPOINT0_BUFSIZE, _ctrl_xfer.buffer, xact_len)); } } @@ -121,6 +121,11 @@ bool tud_control_xfer(uint8_t rhport, const tusb_control_request_t* request, voi return true; } +// Get control transfer endpoint buffer +uint8_t* usbd_control_get_buffer(void) { + return _ctrl_epbuf.buf; +} + //--------------------------------------------------------------------+ // USBD API //--------------------------------------------------------------------+ @@ -169,7 +174,9 @@ bool usbd_control_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, if (_ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_OUT) { TU_VERIFY(_ctrl_xfer.buffer); - memcpy(_ctrl_xfer.buffer, _ctrl_epbuf.buf, xferred_bytes); + if (_ctrl_xfer.buffer != _ctrl_epbuf.buf) { + memcpy(_ctrl_xfer.buffer, _ctrl_epbuf.buf, xferred_bytes); + } TU_LOG_MEM(CFG_TUD_LOG_LEVEL, _ctrl_xfer.buffer, xferred_bytes, 2); } diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h index 72323ac80..f556b556b 100644 --- a/src/device/usbd_pvt.h +++ b/src/device/usbd_pvt.h @@ -72,6 +72,9 @@ void usbd_int_set(bool enabled); void usbd_spin_lock(bool in_isr); void usbd_spin_unlock(bool in_isr); +// Get control transfer endpoint buffer +uint8_t* usbd_control_get_buffer(void); + //--------------------------------------------------------------------+ // USBD Endpoint API // Note: rhport should be 0 since device stack only support 1 rhport for now |
