summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2020-07-08 19:47:24 +0700
committerGitHub <[email protected]>2020-07-08 19:47:24 +0700
commitdbced9911d67fb2063b6eff9e51d463b9062687a (patch)
tree224b6dbe4455e72227174a07c8755acfb4ae3838 /src/device
parent0c9932440b794fbdc699df6f0601f6febddedfe5 (diff)
parent0fd074afd85d84f162ddebbc9b8e009f9136809b (diff)
Merge pull request #447 from hathach/add-stm-hs
Add support for STM32 OTG HS core
Diffstat (limited to 'src/device')
-rw-r--r--src/device/dcd.h15
-rw-r--r--src/device/usbd.c27
2 files changed, 35 insertions, 7 deletions
diff --git a/src/device/dcd.h b/src/device/dcd.h
index 68798c259..a4635346b 100644
--- a/src/device/dcd.h
+++ b/src/device/dcd.h
@@ -60,11 +60,17 @@ typedef struct TU_ATTR_ALIGNED(4)
uint8_t rhport;
uint8_t event_id;
- union {
- // USBD_EVT_SETUP_RECEIVED
+ union
+ {
+ // BUS RESET
+ struct {
+ tusb_speed_t speed;
+ } bus_reset;
+
+ // SETUP_RECEIVED
tusb_control_request_t setup_received;
- // USBD_EVT_XFER_COMPLETE
+ // XFER_COMPLETE
struct {
uint8_t ep_addr;
uint8_t result;
@@ -143,6 +149,9 @@ extern void dcd_event_handler(dcd_event_t const * event, bool in_isr);
// helper to send bus signal event
extern void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr);
+// helper to send bus reset event
+extern void dcd_event_bus_reset (uint8_t rhport, tusb_speed_t speed, bool in_isr);
+
// helper to send setup received
extern void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr);
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 03ef655bc..b607f5939 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -40,7 +40,8 @@
//--------------------------------------------------------------------+
// Device Data
//--------------------------------------------------------------------+
-typedef struct {
+typedef struct
+{
struct TU_ATTR_PACKED
{
volatile uint8_t connected : 1;
@@ -53,6 +54,8 @@ typedef struct {
uint8_t self_powered : 1; // configuration descriptor's attribute
};
+ uint8_t speed;
+
uint8_t itf2drv[16]; // map interface number to driver (0xff is invalid)
uint8_t ep2drv[8][2]; // map endpoint to driver ( 0xff is invalid )
@@ -390,16 +393,21 @@ void tud_task (void)
if ( !osal_queue_receive(_usbd_q, &event) ) return;
- TU_LOG2("USBD %s", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : "CORRUPTED");
- TU_LOG2("%s", (event.event_id != DCD_EVENT_XFER_COMPLETE && event.event_id != DCD_EVENT_SETUP_RECEIVED) ? "\r\n" : " ");
+#if CFG_TUSB_DEBUG >= 2
+ if (event.event_id == DCD_EVENT_SETUP_RECEIVED) TU_LOG2("\r\n"); // extra line for setup
+ TU_LOG2("USBD %s ", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : "CORRUPTED");
+#endif
switch ( event.event_id )
{
case DCD_EVENT_BUS_RESET:
+ TU_LOG2("\r\n");
usbd_reset(event.rhport);
+ _usbd_dev.speed = event.bus_reset.speed;
break;
case DCD_EVENT_UNPLUGGED:
+ TU_LOG2("\r\n");
usbd_reset(event.rhport);
// invoke callback
@@ -451,14 +459,17 @@ void tud_task (void)
break;
case DCD_EVENT_SUSPEND:
+ TU_LOG2("\r\n");
if (tud_suspend_cb) tud_suspend_cb(_usbd_dev.remote_wakeup_en);
break;
case DCD_EVENT_RESUME:
+ TU_LOG2("\r\n");
if (tud_resume_cb) tud_resume_cb();
break;
case DCD_EVENT_SOF:
+ TU_LOG2("\r\n");
for ( uint8_t i = 0; i < USBD_CLASS_DRIVER_COUNT; i++ )
{
if ( _usbd_driver[i].sof )
@@ -469,6 +480,7 @@ void tud_task (void)
break;
case USBD_EVENT_FUNC_CALL:
+ TU_LOG2("\r\n");
if ( event.func_call.func ) event.func_call.func(event.func_call.param);
break;
@@ -967,7 +979,14 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr)
void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr)
{
- dcd_event_t event = { .rhport = rhport, .event_id = eid, };
+ dcd_event_t event = { .rhport = rhport, .event_id = eid };
+ dcd_event_handler(&event, in_isr);
+}
+
+void dcd_event_bus_reset (uint8_t rhport, tusb_speed_t speed, bool in_isr)
+{
+ dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_BUS_RESET };
+ event.bus_reset.speed = speed;
dcd_event_handler(&event, in_isr);
}