Explorar o código

add tuh_inited() and tud_inited()

hathach %!s(int64=4) %!d(string=hai) anos
pai
achega
2666e1efec
Modificáronse 4 ficheiros con 36 adicións e 3 borrados
  1. 16 3
      src/device/usbd.c
  2. 3 0
      src/device/usbd.h
  3. 14 0
      src/host/usbh.c
  4. 3 0
      src/host/usbh.h

+ 16 - 3
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 _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_inited(void)
+{
+  return _initialized;
+}
+
 bool tud_init (void)
 {
+  // skip if already initialized
+  if (_initialized) return _initialized;
+
   TU_LOG2("USBD init\r\n");
 
   tu_varclr(&_usbd_dev);
@@ -402,6 +413,8 @@ bool tud_init (void)
   dcd_init(TUD_OPT_RHPORT);
   dcd_int_enable(TUD_OPT_RHPORT);
 
+  _initialized = true;
+
   return true;
 }
 

+ 3 - 0
src/device/usbd.h

@@ -43,6 +43,9 @@ extern "C" {
 // Init device stack
 bool tud_init (void);
 
+// Check if device stack is already initialized
+bool tud_inited(void);
+
 // Task function should be called in main/rtos loop
 void tud_task (void);
 

+ 14 - 0
src/host/usbh.c

@@ -121,6 +121,8 @@ enum { CONFIG_NUM = 1 }; // default to use configuration 1
 // INTERNAL OBJECT & FUNCTION DECLARATION
 //--------------------------------------------------------------------+
 
+static bool _initialized = false;
+
 // including zero-address
 CFG_TUSB_MEM_SECTION usbh_device_t _usbh_devices[CFG_TUSB_HOST_DEVICE_MAX+1];
 
@@ -170,8 +172,19 @@ void osal_task_delay(uint32_t msec)
 //--------------------------------------------------------------------+
 // CLASS-USBD API (don't require to verify parameters)
 //--------------------------------------------------------------------+
+
+bool tuh_inited(void)
+{
+  return _initialized;
+}
+
 bool tuh_init(void)
 {
+  // skip if already initialized
+  if (_initialized) return _initialized;
+
+  TU_LOG2("USBH init\r\n");
+
   tu_memclr(_usbh_devices, sizeof(usbh_device_t)*(CFG_TUSB_HOST_DEVICE_MAX+1));
 
   //------------- Enumeration & Reporter Task init -------------//
@@ -202,6 +215,7 @@ bool tuh_init(void)
   TU_ASSERT(hcd_init(TUH_OPT_RHPORT));
   hcd_int_enable(TUH_OPT_RHPORT);
 
+  _initialized = true;
   return true;
 }
 

+ 3 - 0
src/host/usbh.h

@@ -78,6 +78,9 @@ typedef bool (*tuh_control_complete_cb_t)(uint8_t dev_addr, tusb_control_request
 // Init host stack
 bool tuh_init(void);
 
+// Check if host stack is already initialized
+bool tuh_inited(void);
+
 // Task function should be called in main/rtos loop
 void tuh_task(void);