| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 | /* * The MIT License (MIT) * * Copyright (c) 2015 by Sergey Fetisov <fsenok@gmail.com> *  * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *//* * version: 1.0 demo (7.02.2015) */#include "usbd_core.h"#include "usbd_desc.h"#include "usbd_conf.h"#include "usbd_rndis_core.h"#include "common_config.h"#define USB_DEVICE_DESCRIPTOR_TYPE              0x01#define USB_STRING_DESCRIPTOR_TYPE              0x03#define USB_SIZ_STRING_LANGID                   4usbd_desc_t *get_device_descriptor(void);usbd_desc_t *get_device_qualifier(void);usbd_desc_t *get_device_configuration(void);usbd_desc_t *get_device_other_speed(void);usbd_desc_t *get_device_lang_id(void);usbd_desc_t *get_device_manufacturer_string(void);usbd_desc_t *get_device_product_string(void);usbd_desc_t *get_device_serial_string(void);usbd_desc_t *get_device_config_string(void);usbd_desc_t *get_device_interface_string(void);uint16_t usbd_unicode_convert(uint8_t *string, uint8_t *unicode_buf);static void usbd_int_to_unicode (uint32_t value , uint8_t *pbuf , uint8_t len);extern usbd_core_type usb_core_dev;extern uint8_t usbd_cdc_CfgDesc[];usbd_desc_handler USR_desc ={    get_device_descriptor,    get_device_qualifier,    get_device_configuration,    get_device_other_speed,    get_device_lang_id,    get_device_manufacturer_string,    get_device_product_string,    get_device_serial_string,    get_device_interface_string,    get_device_config_string,  };#if defined ( __ICCARM__ ) /* iar compiler */  #pragma data_alignment=4#endifuint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ];#if defined ( __ICCARM__ ) /* iar compiler */  #pragma data_alignment=4#endifALIGNED_HEAD uint8_t USBD_DeviceDesc[USB_DEVICE_DESC_LEN] ALIGNED_TAIL ={	18,                                 // bLength = 18 bytes.	USB_DEVICE_DESCRIPTOR_TYPE,         // bDescriptorType = DEVICE	0x00, 0x02,                         // bcdUSB          = 1.1 0x10,0x01  2.0 0x00,0x02	0xE0,                               // bDeviceClass    = Communication Device Class	0x00,                               // bDeviceSubClass = Unused at this time.	0x00,                               // bDeviceProtocol = Unused at this time.	0x40,                               // bMaxPacketSize0 = EP0 buffer size..	LBYTE(USBD_VID), HBYTE(USBD_VID), // Vendor ID	LBYTE(USBD_PID), HBYTE(USBD_PID), // Product ID	0xFF, 0xFF,                         // bcdDevice 	USB_MFC_STRING,	USB_PRODUCT_STRING,	USB_SERIAL_STRING,	1};#if defined ( __ICCARM__ ) /* iar compiler */  #pragma data_alignment=4#endif/* USB Standard Device Descriptor */ALIGNED_HEAD uint8_t USBD_DeviceQualifierDesc[USB_DEVICE_QUALIFIER_DESC_LEN] ALIGNED_TAIL ={  USB_DEVICE_QUALIFIER_DESC_LEN,  USB_DESCIPTOR_TYPE_DEVICE_QUALIFIER,  0x00,  0x02,  0x00,  0x00,  0x00,  0x40,  0x01,  0x00,};#if defined ( __ICCARM__ ) /* iar compiler */  #pragma data_alignment=4#endif/* USB Standard Device Descriptor */ALIGNED_HEAD uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] ALIGNED_TAIL ={     USB_SIZ_STRING_LANGID,              USB_DESCIPTOR_TYPE_STRING,            LBYTE(USBD_LANGID_STRING),     HBYTE(USBD_LANGID_STRING), };/* device descriptor */usbd_desc_t device_descriptor ={  USB_DEVICE_DESC_LEN,  USBD_DeviceDesc};/* device qualifier */usbd_desc_t device_qualifier ={  USB_DEVICE_QUALIFIER_DESC_LEN,  USBD_DeviceQualifierDesc};/* langid descriptor */usbd_desc_t langid_descriptor ={  USB_SIZ_STRING_LANGID,  USBD_LangIDDesc};usbd_desc_t vp_desc;/**  * @brief  standard usb unicode convert  * @param  string: source string  * @param  unicode_buf: unicode buffer  * @retval length                          */uint16_t usbd_unicode_convert(uint8_t *string, uint8_t *unicode_buf){  uint16_t str_len = 0, id_pos = 2;  uint8_t *tmp_str = string;    while(*tmp_str != '\0')  {    str_len ++;    unicode_buf[id_pos ++] = *tmp_str ++;    unicode_buf[id_pos ++] = 0x00;  }    str_len = str_len * 2 + 2;  unicode_buf[0] = str_len;  unicode_buf[1] = USB_DESCIPTOR_TYPE_STRING;    return str_len;}/**  * @brief  usb int convert to unicode  * @param  value: int value  * @param  pbus: unicode buffer  * @param  len: length  * @retval none                          */static void usbd_int_to_unicode (uint32_t value , uint8_t *pbuf , uint8_t len){  uint8_t idx = 0;    for( idx = 0 ; idx < len ; idx ++)  {    if( ((value >> 28)) < 0xA )    {      pbuf[ 2 * idx] = (value >> 28) + '0';  }  else  {      pbuf[2 * idx] = (value >> 28) + 'A' - 10;     }        value = value << 4;        pbuf[2 * idx + 1] = 0;  }}/**  * @brief  get device descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_descriptor(void){  UDBG printf("DeviceDescriptor\r\n");    return &device_descriptor;}usbd_desc_t *get_device_qualifier(void){  UDBG printf("DeviceQulifier\r\n");    return &device_qualifier;}usbd_desc_t *get_device_configuration(void){     //return NULL;      //vp_desc.length = sizeof (usbd_cdc_CfgDesc);  //uint8_t *dara;  vp_desc.descriptor = usbd_rndis_get_cfg(0, &vp_desc.length); //vp_desc.descriptor = (uint8_t *)10; // usbd_cdc_CfgDesc[2] = sizeof(usbd_cdc_CfgDesc) & 0xFF; // usbd_cdc_CfgDesc[3] = (sizeof(usbd_cdc_CfgDesc) >> 8) & 0xFF; // vp_desc.descriptor = usbd_cdc_CfgDesc; // return NULL;    return &vp_desc;}usbd_desc_t *get_device_other_speed(void){    return NULL;}/**  * @brief  get lang id descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_lang_id(void){  UDBG printf("LangIDStrDescriptor\r\n");    return &langid_descriptor;}/**  * @brief  get product descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_product_string(void){  UDBG printf("ProductStrDescriptor\r\n");    static usbd_desc_t device_product_string_disc;    device_product_string_disc.length = usbd_unicode_convert((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc);  device_product_string_disc.descriptor = USBD_StrDesc;    return &device_product_string_disc;    //vp_desc.length = usbd_unicode_convert((uint8_t *)USBD_PRODUCT_FS_STRING, g_usbd_desc_buffer);  //vp_desc.descriptor = g_usbd_desc_buffer;  //return &vp_desc;}/**  * @brief  get manufacturer descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_manufacturer_string(void){  UDBG printf("ManufacturerStrDescriptor\r\n");    static usbd_desc_t device_manufacturer_string_disc;    device_manufacturer_string_disc.length = usbd_unicode_convert((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc);  device_manufacturer_string_disc.descriptor = USBD_StrDesc;    return &device_manufacturer_string_disc;    //vp_desc.length = usbd_unicode_convert((uint8_t *)USBD_MANUFACTURER_STRING, g_usbd_desc_buffer);  //vp_desc.descriptor = g_usbd_desc_buffer;  //return &vp_desc;}/**  * @brief  get serial descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_serial_string(void){  UDBG printf("SerialStrDescriptor\r\n");    static usbd_desc_t device_serial_string_disc;    device_serial_string_disc.length = usbd_unicode_convert((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc);  device_serial_string_disc.descriptor = USBD_StrDesc;  return &device_serial_string_disc;    //vp_desc.length = usbd_unicode_convert((uint8_t *)USBD_SERIALNUMBER_FS_STRING, g_usbd_desc_buffer);  //vp_desc.descriptor = g_usbd_desc_buffer;  //return &vp_desc;}/**  * @brief  get device config descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_config_string(void){  UDBG printf("ConfigStrDescriptor\r\n");    static usbd_desc_t device_config_string_disc;    device_config_string_disc.length = usbd_unicode_convert((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc);  device_config_string_disc.descriptor = USBD_StrDesc;  return &device_config_string_disc;    //vp_desc.length = usbd_unicode_convert((uint8_t *)USBD_CONFIGURATION_FS_STRING, g_usbd_desc_buffer);  //vp_desc.descriptor = g_usbd_desc_buffer;  //return &vp_desc;}/**  * @brief  get interface descriptor  * @param  none  * @retval usbd_desc                           */usbd_desc_t *get_device_interface_string(void){  UDBG printf("InterfaceStrDescriptor\r\n");   static usbd_desc_t device_interface_string_disc;    device_interface_string_disc.length = usbd_unicode_convert((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc);  device_interface_string_disc.descriptor = USBD_StrDesc;  return &device_interface_string_disc;    //vp_desc.length = usbd_unicode_convert((uint8_t *)USBD_INTERFACE_FS_STRING, g_usbd_desc_buffer);  //vp_desc.descriptor = g_usbd_desc_buffer;  //return &vp_desc;}
 |