diff options
| author | hathach <[email protected]> | 2018-04-16 13:46:28 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-04-16 13:46:28 +0700 |
| commit | 6f7c4346c39bd57014e95b577255c3870a5979c6 (patch) | |
| tree | e8a3f3a039637934aa5c9916725c8d1e3c1cba1c /tinyusb | |
| parent | 29071c10b1e2f2574afb310a7197d599a25cd362 (diff) | |
add tud_set_descriptors
Diffstat (limited to 'tinyusb')
| -rw-r--r-- | tinyusb/common/tusb_common.h | 9 | ||||
| -rw-r--r-- | tinyusb/common/tusb_verify.h | 13 | ||||
| -rw-r--r-- | tinyusb/device/usbd.c | 54 | ||||
| -rw-r--r-- | tinyusb/device/usbd.h | 29 | ||||
| -rw-r--r-- | tinyusb/portable/nordic/nrf5x/dcd_nrf5x.c | 2 | ||||
| -rw-r--r-- | tinyusb/tusb.h | 2 |
6 files changed, 66 insertions, 43 deletions
diff --git a/tinyusb/common/tusb_common.h b/tinyusb/common/tusb_common.h index b45027c44..2ac0e2e8b 100644 --- a/tinyusb/common/tusb_common.h +++ b/tinyusb/common/tusb_common.h @@ -106,13 +106,10 @@ // INLINE FUNCTION
//--------------------------------------------------------------------+
#define memclr_(buffer, size) memset((buffer), 0, (size))
+#define varclr_(_var) memclr_(_var, sizeof(*(_var)))
+#define arrclr_(_arr) memclr_(_arr, sizeof(_arr))
-
-#define memclr(buffer, size) memset(buffer, 0, size)
-#define varclr(_var) memclr(_var, sizeof(*(_var)))
-#define arrclr(_arr) memclr(_arr, sizeof(_arr))
-
-#define arrcount(_arr) ( sizeof(_arr) / sizeof(_arr[0]) )
+#define arrcount_(_arr) ( sizeof(_arr) / sizeof(_arr[0]) )
static inline uint8_t const * descriptor_next(uint8_t const p_desc[])
{
diff --git a/tinyusb/common/tusb_verify.h b/tinyusb/common/tusb_verify.h index 6e530fe79..0a7d22419 100644 --- a/tinyusb/common/tusb_verify.h +++ b/tinyusb/common/tusb_verify.h @@ -71,14 +71,11 @@ // Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7 #if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) -static inline void verify_breakpoint(void) -{ - // Cortex M CoreDebug->DHCSR - volatile uint32_t* ARM_CM_DHCSR = ((volatile uint32_t*) 0xE000EDF0UL); - - // Only halt mcu if debugger is attached - if ( (*ARM_CM_DHCSR) & 1UL ) __asm("BKPT #0\n"); -} +#define verify_breakpoint() \ + do {\ + volatile uint32_t* ARM_CM_DHCSR = ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \ + if ( (*ARM_CM_DHCSR) & 1UL ) __asm("BKPT #0\n"); /* Only halt mcu if debugger is attached */\ + } while(0) #else #define verify_breakpoint() diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 069837058..efe2e199a 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -42,14 +42,13 @@ #define _TINY_USB_SOURCE_FILE_
-//--------------------------------------------------------------------+
-// INCLUDE
-//--------------------------------------------------------------------+
#include "tusb.h"
#include "usbd.h"
#include "device/usbd_pvt.h"
-
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
typedef struct {
void (* init) (void);
tusb_error_t (* open)(uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t* p_length);
@@ -72,11 +71,15 @@ typedef struct { }usbd_device_info_t;
//--------------------------------------------------------------------+
-// MACRO CONSTANT TYPEDEF
+// INTERNAL VARIABLE
//--------------------------------------------------------------------+
-usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER];
CFG_TUSB_ATTR_USBRAM CFG_TUSB_MEM_ALIGN uint8_t usbd_enum_buffer[CFG_TUD_ENUM_BUFFER_SIZE];
+tud_desc_init_t _usbd_descs[CONTROLLER_DEVICE_NUMBER];
+usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER];
+
+
+
static usbd_class_driver_t const usbd_class_drivers[] =
{
#if DEVICE_CLASS_HID
@@ -130,19 +133,26 @@ enum { USBD_CLASS_DRIVER_COUNT = sizeof(usbd_class_drivers) / sizeof(usbd_class_ //};
//--------------------------------------------------------------------+
-// INTERNAL OBJECT & FUNCTION DECLARATION
+// INTERNAL FUNCTION
//--------------------------------------------------------------------+
static tusb_error_t proc_set_config_req(uint8_t rhport, uint8_t config_number);
static uint16_t get_descriptor(uint8_t rhport, tusb_control_request_t const * const p_request, uint8_t const ** pp_buffer);
//--------------------------------------------------------------------+
-// APPLICATION INTERFACE
+// APPLICATION API
//--------------------------------------------------------------------+
bool tud_n_mounted(uint8_t rhport)
{
- return usbd_devices[rhport].state == TUSB_DEVICE_STATE_CONFIGURED;
+ return usbd_devices[rhport].state == TUSB_DEVICE_STATE_CONFIGURED;
}
+bool tud_n_set_descriptors(uint8_t rhport, tud_desc_init_t const* desc_cfg)
+{
+ _usbd_descs[rhport] = *desc_cfg;
+ return true;
+}
+
+
//--------------------------------------------------------------------+
// IMPLEMENTATION
//--------------------------------------------------------------------+
@@ -213,8 +223,8 @@ tusb_error_t usbd_init (void) osal_task_create(usbd_task, "usbd", CFG_TUD_TASK_STACKSIZE, NULL, CFG_TUD_TASK_PRIO);
- //------------- Descriptor Check -------------//
- TU_ASSERT(tusbd_descriptor_pointers.p_device != NULL && tusbd_descriptor_pointers.p_configuration != NULL, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
+ //------------- Core init -------------//
+ arrclr_( _usbd_descs );
//------------- class init -------------//
for (uint8_t class_code = TUSB_CLASS_AUDIO; class_code < USBD_CLASS_DRIVER_COUNT; class_code++)
@@ -390,12 +400,14 @@ static tusb_error_t proc_set_config_req(uint8_t rhport, uint8_t config_number) usbd_devices[rhport].config_num = config_number;
//------------- parse configuration & open drivers -------------//
- uint8_t const * p_desc_config = tusbd_descriptor_pointers.p_configuration;
+ uint8_t const * p_desc_config = _usbd_descs[rhport].configuration;
+ TU_ASSERT(p_desc_config != NULL, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
+
uint8_t const * p_desc = p_desc_config + sizeof(tusb_desc_configuration_t);
- uint16_t const config_total_length = ((tusb_desc_configuration_t*)p_desc_config)->wTotalLength;
+ uint16_t const config_len = ((tusb_desc_configuration_t*)p_desc_config)->wTotalLength;
- while( p_desc < p_desc_config + config_total_length )
+ while( p_desc < p_desc_config + config_len )
{
if ( TUSB_DESC_INTERFACE_ASSOCIATION == p_desc[DESCRIPTOR_OFFSET_TYPE])
{
@@ -436,23 +448,26 @@ static uint16_t get_descriptor(uint8_t rhport, tusb_control_request_t const * co uint8_t const * desc_data = NULL ;
uint16_t len = 0;
+ //------------- Descriptor Check -------------//
+ tud_desc_init_t const* descs = &_usbd_descs[rhport];
+
switch(desc_type)
{
case TUSB_DESC_DEVICE:
- desc_data = tusbd_descriptor_pointers.p_device;
+ desc_data = descs->device;
len = sizeof(tusb_desc_device_t);
break;
case TUSB_DESC_CONFIGURATION:
- desc_data = tusbd_descriptor_pointers.p_configuration;
- len = ((tusb_desc_configuration_t*)tusbd_descriptor_pointers.p_configuration)->wTotalLength;
+ desc_data = descs->configuration;
+ len = ((tusb_desc_configuration_t*)descs->configuration)->wTotalLength;
break;
case TUSB_DESC_STRING:
// windows sometimes ask for string at index 238 !!!
if ( !(desc_index < 100) ) return 0;
- desc_data = tusbd_descriptor_pointers.p_string_arr[desc_index];
+ desc_data = descs->string_arr[desc_index];
VERIFY( desc_data != NULL, 0 );
len = desc_data[0]; // first byte of descriptor is its size
@@ -467,10 +482,13 @@ static uint16_t get_descriptor(uint8_t rhport, tusb_control_request_t const * co default: return 0;
}
+ TU_ASSERT( desc_data != NULL, 0);
+
// up to Host's length
len = min16_of(p_request->wLength, len );
TU_ASSERT( len <= CFG_TUD_ENUM_BUFFER_SIZE, 0);
+ // FIXME copy data to enum buffer
memcpy(usbd_enum_buffer, desc_data, len);
(*pp_buffer) = usbd_enum_buffer;
diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h index d6955ffc7..8e4d9f1a0 100644 --- a/tinyusb/device/usbd.h +++ b/tinyusb/device/usbd.h @@ -59,29 +59,38 @@ /// \brief Descriptor pointer collector to all the needed.
typedef struct {
- uint8_t const * p_device; ///< pointer to device descritpor \ref tusb_desc_device_t
- uint8_t const * p_configuration; ///< pointer to the whole configuration descriptor, starting by \ref tusb_desc_configuration_t
- uint8_t const** p_string_arr; ///< a array of pointers to string descriptors
+ uint8_t const * device; ///< pointer to device descriptor \ref tusb_desc_device_t
+ uint8_t const * configuration; ///< pointer to the whole configuration descriptor, starting by \ref tusb_desc_configuration_t
+ uint8_t const** string_arr; ///< a array of pointers to string descriptors
- uint8_t const * p_hid_keyboard_report; ///< pointer to HID report descriptor of Keybaord interface. Only needed if CFG_TUD_HID_KEYBOARD is enabled
+ uint8_t const * p_hid_keyboard_report; ///< pointer to HID report descriptor of Keyboard interface. Only needed if CFG_TUD_HID_KEYBOARD is enabled
uint8_t const * p_hid_mouse_report; ///< pointer to HID report descriptor of Mouse interface. Only needed if CFG_TUD_HID_MOUSE is enabled
-}tusbd_descriptor_pointer_t;
-
-// define by application
-extern tusbd_descriptor_pointer_t tusbd_descriptor_pointers;
+}tud_desc_init_t;
//--------------------------------------------------------------------+
-// APPLICATION API
+// APPLICATION API (Multiple Root Ports)
+// Should be used only with MCU that support more than 1 ports
//--------------------------------------------------------------------+
bool tud_n_mounted(uint8_t rhport);
+bool tud_n_set_descriptors(uint8_t rhport, tud_desc_init_t const* desc_cfg);
+//--------------------------------------------------------------------+
+// APPLICATION API (Single Port)
+// Should be used with MCU supporting only 1 USB port for code simplicity
+//--------------------------------------------------------------------+
static inline bool tud_mounted(void)
{
return tud_n_mounted(0);
}
+static inline bool tud_set_descriptors(tud_desc_init_t const* desc_cfg)
+{
+ return tud_n_set_descriptors(0, desc_cfg);
+}
-/*------------- Callback -------------*/
+//--------------------------------------------------------------------+
+// APPLICATION CALLBACK
+//--------------------------------------------------------------------+
/** \brief Callback function that will be invoked device is mounted (configured) by USB host
* \param[in] rhport USB Controller ID of the interface
* \note This callback should be used by Application to \b set-up application data
diff --git a/tinyusb/portable/nordic/nrf5x/dcd_nrf5x.c b/tinyusb/portable/nordic/nrf5x/dcd_nrf5x.c index 3c805d08d..02288b707 100644 --- a/tinyusb/portable/nordic/nrf5x/dcd_nrf5x.c +++ b/tinyusb/portable/nordic/nrf5x/dcd_nrf5x.c @@ -103,7 +103,7 @@ void bus_reset(void) NRF_USBD->TASKS_STARTISOIN = 0; NRF_USBD->TASKS_STARTISOOUT = 0; - varclr(&_dcd); + varclr_(&_dcd); } /*------------------------------------------------------------------*/ diff --git a/tinyusb/tusb.h b/tinyusb/tusb.h index f719e159d..c74fb2e6d 100644 --- a/tinyusb/tusb.h +++ b/tinyusb/tusb.h @@ -113,6 +113,8 @@ tusb_error_t tusb_init(void); your_init_code();
tusb_init();
+ // other config code
+
while(1) // the mainloop
{
your_application_code();
|
