summaryrefslogtreecommitdiff
path: root/src/portable/microchip
diff options
context:
space:
mode:
authorhathach <[email protected]>2019-11-28 13:39:29 +0700
committerhathach <[email protected]>2019-11-28 13:39:29 +0700
commitd7558e8a0f12c685f2690c985e5f75df0777065b (patch)
tree2bc43b629a9e184319592afbd65e49fadb3280da /src/portable/microchip
parentac701c398b4e9a43eefe0ee0be38579ca17535df (diff)
use dcd_edpt0_status_complete() to set address without blocking for samd21/samd51/stm32_fsdev
Diffstat (limited to 'src/portable/microchip')
-rw-r--r--src/portable/microchip/samd21/dcd_samd21.c25
-rw-r--r--src/portable/microchip/samd51/dcd_samd51.c23
-rw-r--r--src/portable/microchip/samg/dcd_samg.c5
3 files changed, 41 insertions, 12 deletions
diff --git a/src/portable/microchip/samd21/dcd_samd21.c b/src/portable/microchip/samd21/dcd_samd21.c
index 231abc7d0..3ffaabf09 100644
--- a/src/portable/microchip/samd21/dcd_samd21.c
+++ b/src/portable/microchip/samd21/dcd_samd21.c
@@ -98,13 +98,13 @@ void dcd_int_disable(uint8_t rhport)
void dcd_set_address (uint8_t rhport, uint8_t dev_addr)
{
- // Response with status first before changing device address
- dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0);
+ (void) dev_addr;
- // Wait for EP0 to finish before switching the address.
- while (USB->DEVICE.DeviceEndpoint[0].EPSTATUS.bit.BK1RDY == 1) {}
+ // Response with zlp status
+ dcd_edpt_xfer(rhport, 0x80, NULL, 0);
- USB->DEVICE.DADD.reg = USB_DEVICE_DADD_DADD(dev_addr) | USB_DEVICE_DADD_ADDEN;
+ // DCD can only set address after status for this request is complete
+ // do it at dcd_edpt0_status_complete()
// Enable SUSPEND interrupt since the bus signal D+/D- are stable now.
USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTENCLR_SUSPEND; // clear pending
@@ -116,7 +116,6 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num)
(void) rhport;
(void) config_num;
// Nothing to do
-
}
void dcd_remote_wakeup(uint8_t rhport)
@@ -130,6 +129,20 @@ void dcd_remote_wakeup(uint8_t rhport)
/* DCD Endpoint port
*------------------------------------------------------------------*/
+// Invoked when a control transfer's status stage is complete.
+// May help DCD to prepare for next control transfer, this API is optional.
+void dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)
+{
+ (void) rhport;
+
+ if (request->bRequest == TUSB_REQ_SET_ADDRESS)
+ {
+ uint8_t const dev_addr = (uint8_t) request->wValue;
+ USB->DEVICE.DADD.reg = USB_DEVICE_DADD_DADD(dev_addr) | USB_DEVICE_DADD_ADDEN;
+ }
+}
+
+
bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)
{
(void) rhport;
diff --git a/src/portable/microchip/samd51/dcd_samd51.c b/src/portable/microchip/samd51/dcd_samd51.c
index f58e7cbc7..1af247702 100644
--- a/src/portable/microchip/samd51/dcd_samd51.c
+++ b/src/portable/microchip/samd51/dcd_samd51.c
@@ -104,13 +104,13 @@ void dcd_int_disable(uint8_t rhport)
void dcd_set_address (uint8_t rhport, uint8_t dev_addr)
{
- // Response with status first before changing device address
- dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0);
+ (void) dev_addr;
- // Wait for EP0 to finish before switching the address.
- while (USB->DEVICE.DeviceEndpoint[0].EPSTATUS.bit.BK1RDY == 1) {}
+ // Response with zlp status
+ dcd_edpt_xfer(rhport, 0x80, NULL, 0);
- USB->DEVICE.DADD.reg = USB_DEVICE_DADD_DADD(dev_addr) | USB_DEVICE_DADD_ADDEN;
+ // DCD can only set address after status for this request is complete
+ // do it at dcd_edpt0_status_complete()
// Enable SUSPEND interrupt since the bus signal D+/D- are stable now.
USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTENCLR_SUSPEND; // clear pending
@@ -135,6 +135,19 @@ void dcd_remote_wakeup(uint8_t rhport)
/* DCD Endpoint port
*------------------------------------------------------------------*/
+// Invoked when a control transfer's status stage is complete.
+// May help DCD to prepare for next control transfer, this API is optional.
+void dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)
+{
+ (void) rhport;
+
+ if (request->bRequest == TUSB_REQ_SET_ADDRESS)
+ {
+ uint8_t const dev_addr = (uint8_t) request->wValue;
+ USB->DEVICE.DADD.reg = USB_DEVICE_DADD_DADD(dev_addr) | USB_DEVICE_DADD_ADDEN;
+ }
+}
+
bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)
{
(void) rhport;
diff --git a/src/portable/microchip/samg/dcd_samg.c b/src/portable/microchip/samg/dcd_samg.c
index c38621e00..122dc04b7 100644
--- a/src/portable/microchip/samg/dcd_samg.c
+++ b/src/portable/microchip/samg/dcd_samg.c
@@ -120,7 +120,10 @@ void dcd_set_address (uint8_t rhport, uint8_t dev_addr)
(void) rhport;
(void) dev_addr;
- // SAMG can only set address after status for this request is complete
+ // Response with zlp status
+ dcd_edpt_xfer(rhport, 0x80, NULL, 0);
+
+ // DCD can only set address after status for this request is complete.
// do it at dcd_edpt0_status_complete()
}