summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2020-04-16 23:10:36 +0700
committerGitHub <[email protected]>2020-04-16 23:10:36 +0700
commit33610751d7d0157c68a799961b6a7cacfa4c9b38 (patch)
tree50e5d93811bee232b9166c7e578885fa0c9510d2 /src/device
parentbfec3b44795e92469f5d4ff16f1caf131114d54f (diff)
parent2994d100cd6198a4c90dce667f52fde07fe4a073 (diff)
Merge pull request #336 from pigrew/edpt_close
> If you notice my chain of events above, the bulk transfer was started BEFORE the SET_INTERFACE call. The USB device hardware swaps the order of them being delivered. On STM32, it gives priority to the lower-numbered EP index. It shouldn't be a matter, control is 2+ stage, before sending the setup. Host should stop all communication to the endpoint that It wants to close.
Diffstat (limited to 'src/device')
-rw-r--r--src/device/dcd.h4
-rw-r--r--src/device/usbd.c16
-rw-r--r--src/device/usbd_pvt.h1
3 files changed, 21 insertions, 0 deletions
diff --git a/src/device/dcd.h b/src/device/dcd.h
index 08b217fa9..6554be2c8 100644
--- a/src/device/dcd.h
+++ b/src/device/dcd.h
@@ -123,6 +123,10 @@ void dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * re
// Configure endpoint's registers according to descriptor
bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc);
+// Close an endpoint.
+// Since it is weak, caller must TU_ASSERT this function's existence before calling it.
+void dcd_edpt_close (uint8_t rhport, uint8_t ep_addr) TU_ATTR_WEAK;
+
// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack
bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes);
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 29845ff36..21d520bde 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -1011,4 +1011,20 @@ bool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr)
return _usbd_dev.ep_status[epnum][dir].stalled;
}
+/**
+ * usbd_edpt_close will disable an endpoint.
+ *
+ * In progress transfers on this EP may be delivered after this call.
+ *
+ */
+void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr)
+{
+ TU_ASSERT(dcd_edpt_close, /**/);
+ TU_LOG2(" CLOSING Endpoint: 0x%02X\r\n", ep_addr);
+
+ dcd_edpt_close(rhport, ep_addr);
+
+ return;
+}
+
#endif
diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h
index b9947044b..26b9700e8 100644
--- a/src/device/usbd_pvt.h
+++ b/src/device/usbd_pvt.h
@@ -38,6 +38,7 @@
//--------------------------------------------------------------------+
//bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc);
+void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr);
// Submit a usb transfer
bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes);