summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2020-03-24 11:57:20 +0700
committerGitHub <[email protected]>2020-03-24 11:57:20 +0700
commit95009a9e790c4194d7349300fed2f07f032546ea (patch)
treedfe77688c6c06ee1a3d0df416507be24cf524e3e /src/device
parentb4a9a6e99a264cdcb886a1cc04818c086fbd7496 (diff)
parent7e78e47444c29b4d0c804877b28aa778fa0576c3 (diff)
Merge pull request #194 from cr1901/msp430f5529
[WIP] MSP430 Support
Diffstat (limited to 'src/device')
-rw-r--r--src/device/usbd.c19
-rw-r--r--src/device/usbd_control.c2
2 files changed, 19 insertions, 2 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 335c68e8e..ddd99d7f1 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -44,6 +44,7 @@ typedef struct {
struct TU_ATTR_PACKED
{
volatile uint8_t connected : 1;
+ volatile uint8_t addressed : 1;
volatile uint8_t configured : 1;
volatile uint8_t suspended : 1;
@@ -526,6 +527,7 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
usbd_control_set_request(p_request); // set request since DCD has no access to tud_control_status() API
dcd_set_address(rhport, (uint8_t) p_request->wValue);
// skip tud_control_status()
+ _usbd_dev.addressed = 1;
break;
case TUSB_REQ_GET_CONFIGURATION:
@@ -793,7 +795,21 @@ static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const
switch(desc_type)
{
case TUSB_DESC_DEVICE:
- return tud_control_xfer(rhport, p_request, (void*) tud_descriptor_device_cb(), sizeof(tusb_desc_device_t));
+ {
+ uint16_t len = sizeof(tusb_desc_device_t);
+
+ // Only send up to EP0 Packet Size if not addressed
+ // This only happens with the very first get device descriptor and EP0 size = 8 or 16.
+ if ((CFG_TUD_ENDPOINT0_SIZE < sizeof(tusb_desc_device_t)) && !_usbd_dev.addressed)
+ {
+ len = CFG_TUD_ENDPOINT0_SIZE;
+
+ // Hack here: we modify the request length to prevent usbd_control response with zlp
+ ((tusb_control_request_t*) p_request)->wLength = CFG_TUD_ENDPOINT0_SIZE;
+ }
+
+ return tud_control_xfer(rhport, p_request, (void*) tud_descriptor_device_cb(), len);
+ }
break;
case TUSB_DESC_BOS:
@@ -859,6 +875,7 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr)
{
case DCD_EVENT_UNPLUGGED:
_usbd_dev.connected = 0;
+ _usbd_dev.addressed = 0;
_usbd_dev.configured = 0;
_usbd_dev.suspended = 0;
osal_queue_send(_usbd_q, event, in_isr);
diff --git a/src/device/usbd_control.c b/src/device/usbd_control.c
index 7c35fe768..4fd40c440 100644
--- a/src/device/usbd_control.c
+++ b/src/device/usbd_control.c
@@ -1,4 +1,4 @@
-/*
+/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Ha Thach (tinyusb.org)