From 1174949308bb7595e99fd5789ebf3466cf2ab123 Mon Sep 17 00:00:00 2001 From: hathach Date: Sun, 12 May 2019 15:38:15 +0700 Subject: [PATCH] change tud_descriptor_string_cb() to be consistent with other descriptor callback --- .../device/cdc_msc_hid/src/usb_descriptors.c | 32 +++++++++++-------- .../src/usb_descriptors.c | 32 +++++++++++-------- .../hid_generic_inout/src/usb_descriptors.c | 32 +++++++++++-------- .../device/msc_dual_lun/src/usb_descriptors.c | 32 +++++++++++-------- src/class/hid/hid_device.h | 5 ++- src/common/tusb_types.h | 4 +-- src/device/usbd.c | 13 +++----- src/device/usbd.h | 14 ++++---- 8 files changed, 90 insertions(+), 74 deletions(-) diff --git a/examples/device/cdc_msc_hid/src/usb_descriptors.c b/examples/device/cdc_msc_hid/src/usb_descriptors.c index bb830ca27..73c8e7ce1 100644 --- a/examples/device/cdc_msc_hid/src/usb_descriptors.c +++ b/examples/device/cdc_msc_hid/src/usb_descriptors.c @@ -174,30 +174,36 @@ char const* string_desc_arr [] = "TinyUSB HID" // 6: HID }; -// Invoked when received GET_STRING_DESC request -// max_char is CFG_TUD_ENDOINT0_SIZE/2 -1, typically max_char = 31 if Endpoint0 size is 64 -// Return number of characters. Note usb string is in 16-bits unicode format -uint8_t tud_descriptor_string_cb(uint8_t index, uint16_t* desc, uint8_t max_char) +static uint16_t _desc_str[32]; + +// Invoked when received GET STRING DESCRIPTOR request +// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete +uint16_t const* tud_descriptor_string_cb(uint8_t index) { + uint8_t chr_count; + if ( index == 0) { - memcpy(desc, string_desc_arr[0], 2); - return 1; + memcpy(&_desc_str[1], string_desc_arr[0], 2); + chr_count = 1; }else { - if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return 0; + if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return NULL; const char* str = string_desc_arr[index]; // Cap at max char - uint8_t count = strlen(str); - if ( count > max_char ) count = max_char; + chr_count = strlen(str); + if ( chr_count > 31 ) chr_count = 31; - for(uint8_t i=0; i max_char ) count = max_char; + chr_count = strlen(str); + if ( chr_count > 31 ) chr_count = 31; - for(uint8_t i=0; i max_char ) count = max_char; + chr_count = strlen(str); + if ( chr_count > 31 ) chr_count = 31; - for(uint8_t i=0; i max_char ) count = max_char; + chr_count = strlen(str); + if ( chr_count > 31 ) chr_count = 31; - for(uint8_t i=0; i 0); - - // first byte of descriptor is size, second byte is string type - len += 2; // header len - desc_str[0] = tu_u16_from_u8(TUSB_DESC_STRING, len); - - return usbd_control_xfer(rhport, p_request, desc_str, len); + // first byte of descriptor is its size + return usbd_control_xfer(rhport, p_request, (void*) desc_str, desc_str[0]); } break; diff --git a/src/device/usbd.h b/src/device/usbd.h index f8485166d..8193c4ce0 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -63,19 +63,17 @@ bool tud_remote_wakeup(void); // Application Callbacks (WEAK is optional) //--------------------------------------------------------------------+ -// Invoked when received GET DEVICE DESCRIPTOR +// Invoked when received GET DEVICE DESCRIPTOR request // Application return pointer to descriptor uint8_t const * tud_descriptor_device_cb(void); -// Invoked when received GET CONFIGURATION DESCRIPTOR -// Application return pointer to descriptor -// Descriptor contents must exist long enough for transfer to complete +// Invoked when received GET CONFIGURATION DESCRIPTOR request +// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete uint8_t const * tud_descriptor_configuration_cb(void); -// Invoked when received GET STRING DESC request -// max_char is CFG_TUD_ENDOINT0_SIZE/2 -1, typically max_char = 31 if Endpoint0 size is 64 -// Return number of characters. Note usb string is in UTF-16 format -uint8_t tud_descriptor_string_cb(uint8_t index, uint16_t* desc, uint8_t max_char); +// Invoked when received GET STRING DESCRIPTOR request +// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete +uint16_t const* tud_descriptor_string_cb(uint8_t index); // Invoked when device is mounted (configured) ATTR_WEAK void tud_mount_cb(void);