summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorHiFiPhile <[email protected]>2025-11-21 00:07:22 +0100
committerHiFiPhile <[email protected]>2025-12-14 18:49:23 +0100
commit86af966d2b27739df5df0c5e51af1201f9e4f6b5 (patch)
treec72d14fa519eb58e6ed3e1d859d88f7795d47c85 /src/device
parentad5fe66f19e8fb633f175affcfa27b8376e40639 (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.c11
-rw-r--r--src/device/usbd_pvt.h3
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