summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2021-05-22 22:56:17 +0700
committerGitHub <[email protected]>2021-05-22 22:56:17 +0700
commit56577d9fcab58680b22d86be6ecac0a16f96f659 (patch)
tree445278bc5e2aba1e9fbdc8cd064c5e4f09ee8ac2 /src/device
parentcdb063f007f16f5cfad7b4c05fc117da5f251b26 (diff)
parentf13a3c04f790a865472a7ed0b57182f401189977 (diff)
Merge pull request #834 from hathach/host-hid
Rework Host hid
Diffstat (limited to 'src/device')
-rw-r--r--src/device/usbd.c28
-rw-r--r--src/device/usbd.h6
-rw-r--r--src/device/usbd_pvt.h2
3 files changed, 26 insertions, 10 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 2853b619b..9fddbc299 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -44,6 +44,10 @@
//--------------------------------------------------------------------+
// Device Data
//--------------------------------------------------------------------+
+
+// Invalid driver ID in itf2drv[] ep2drv[][] mapping
+enum { DRVID_INVALID = 0xFFu };
+
typedef struct
{
struct TU_ATTR_PACKED
@@ -76,9 +80,6 @@ typedef struct
static usbd_device_t _usbd_dev;
-// Invalid driver ID in itf2drv[] ep2drv[][] mapping
-enum { DRVID_INVALID = 0xFFu };
-
//--------------------------------------------------------------------+
// Class Driver
//--------------------------------------------------------------------+
@@ -241,6 +242,8 @@ static inline usbd_class_driver_t const * get_driver(uint8_t drvid)
// DCD Event
//--------------------------------------------------------------------+
+static bool _usbd_initialized = false;
+
// Event queue
// OPT_MODE_DEVICE is used by OS NONE for mutex (disable usb isr)
OSAL_QUEUE_DEF(OPT_MODE_DEVICE, _usbd_qdef, CFG_TUD_TASK_QUEUE_SZ, dcd_event_t);
@@ -368,8 +371,16 @@ bool tud_connect(void)
//--------------------------------------------------------------------+
// USBD Task
//--------------------------------------------------------------------+
-bool tud_init (void)
+bool tud_inited(void)
+{
+ return _usbd_initialized;
+}
+
+bool tud_init (uint8_t rhport)
{
+ // skip if already initialized
+ if (_usbd_initialized) return _usbd_initialized;
+
TU_LOG2("USBD init\r\n");
tu_varclr(&_usbd_dev);
@@ -399,8 +410,10 @@ bool tud_init (void)
}
// Init device controller driver
- dcd_init(TUD_OPT_RHPORT);
- dcd_int_enable(TUD_OPT_RHPORT);
+ dcd_init(rhport);
+ dcd_int_enable(rhport);
+
+ _usbd_initialized = true;
return true;
}
@@ -1077,7 +1090,7 @@ void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_
}
//--------------------------------------------------------------------+
-// Helper
+// USBD API For Class Driver
//--------------------------------------------------------------------+
// Parse consecutive endpoint descriptors (IN & OUT)
@@ -1171,7 +1184,6 @@ bool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr)
#if CFG_TUSB_OS != OPT_OS_NONE
// pre-check to help reducing mutex lock
TU_VERIFY((_usbd_dev.ep_status[epnum][dir].busy == 0) && (_usbd_dev.ep_status[epnum][dir].claimed == 0));
-
osal_mutex_lock(_usbd_mutex, OSAL_TIMEOUT_WAIT_FOREVER);
#endif
diff --git a/src/device/usbd.h b/src/device/usbd.h
index 7c50a6db0..c707cecfc 100644
--- a/src/device/usbd.h
+++ b/src/device/usbd.h
@@ -41,7 +41,10 @@ extern "C" {
//--------------------------------------------------------------------+
// Init device stack
-bool tud_init (void);
+bool tud_init (uint8_t rhport);
+
+// Check if device stack is already initialized
+bool tud_inited(void);
// Task function should be called in main/rtos loop
void tud_task (void);
@@ -67,6 +70,7 @@ bool tud_mounted(void);
bool tud_suspended(void);
// Check if device is ready to transfer
+TU_ATTR_ALWAYS_INLINE
static inline bool tud_ready(void)
{
return tud_mounted() && !tud_suspended();
diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h
index 412a97a5d..44310f022 100644
--- a/src/device/usbd_pvt.h
+++ b/src/device/usbd_pvt.h
@@ -47,7 +47,7 @@ typedef struct
void (* reset ) (uint8_t rhport);
uint16_t (* open ) (uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t max_len);
bool (* control_xfer_cb ) (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
- bool (* xfer_cb ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
+ bool (* xfer_cb ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
void (* sof ) (uint8_t rhport); /* optional */
} usbd_class_driver_t;