本帖最后由 fuyu1212 于 2019-5-8 16:35 编辑 maxtch 发表于 2019-5-7 19:36 USB HID 是跨平台通用的,不过苹果的 BIOS 的确对于 USB 描述符的规范度要求非常高,因此说软件里面少许 ... 下面是设备描述符代码,能帮忙看下什么问题。谢谢!现在是有时可以正常连接。但连接不上的次数占大多数。 /******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** * File Name : usb_desc.c * Author : MCD Application Team * Version : V3.2.1 * Date : 07/05/2010 * Description : Descriptors for Joystick Mouse Demo ******************************************************************************** * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "usb_lib.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Extern variables ----------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /* USB Standard Device Descriptor */ //usb标准设备描述符 const u8 DinkUsbDeviceDescriptor[DINK_USB_SIZ_DEVICE_DESC] = { USB_DEVICE_DESC_SIZE, //bLength字段。设备描述符的长度为18(0x12)字节 USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType字段。设备描述符的编号为0x01 WBVAL(0x0200), //bcdUSB字段。这里设置版本为USB1.1,即0x0110。 0x00, //bDeviceClass字段。我们不在设备描述符中定义设备类, 0x00, //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。 0x00, //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。 0x40, //bMaxPacketSize0字段。端点0的最大包长度。 WBVAL(0x0483), //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。 WBVAL(0x5750), //idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。\。 WBVAL(0x0100), // 设备的版本 0x01, //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理 0x02, //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。 0x03, //iSerialNumber字段。设备的序列号字符串索引值。 0x01 //bNumConfigurations字段。该设备所具有的配置数。 }; //USB报告描述符的定义 const u8 HID_ReportDescriptor[]= { 0x05, 0x8c, /* USAGE_PAGE用法页 (ST Page) */ 0x09, 0x01, /* USAGE 用法(Demo Kit) */ 0xa1, 0x01, /* COLLECTION 集合开始(Application) */ // The Input report 输入报告 0x09,0x03, // USAGE ID 用法- Vendor defined 0x15,0x00, // LOGICAL_MINIMUM 逻辑最小值(0) 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM 逻辑最大值(255) 0x75,0x08, // REPORT_SIZE 报告长度(8bit) 0x95,REPORT_COUNT, // REPORT_COUNT 报告总计(64Byte) 0x81,0x02, // INPUT 输入(Data,Var,Abs) // The Output report 0x09,0x04, // USAGE ID 用法- Vendor defined 0x15,0x00, // LOGICAL_MINIMUM 逻辑最小值(0) 0x26,0x00,0xFF, // LOGICAL_MAXIMUM 逻辑最大值(255) 0x75,0x08, // REPORT_SIZE 报告长度(8bit) 0x95,REPORT_COUNT, // REPORT_COUNT 报告总计(64Byte) 0x91,0x02, // OUTPUT输出(Data,Var,Abs) 0xc0 /* END_COLLECTION 集合结束*/ }; //通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。 //输出报告也有32字节。至于这32字节的数据是干什么用的,就要由用户 //自己来决定了。 ///////////////////////////报告描述符完毕//////////////////////////// /* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ //usb配置描述符 const u8 DinkUsbConfigDescriptor[DINK_USB_SIZ_CONFIG_DESC] = { /***************配置描述符***********************/ USB_CONFIGUARTION_DESC_SIZE, //bLength字段。配置描述符的长度为9字节。 USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType字段。配置描述符编号为0x02。 //wTotalLength字段。配置描述符集合的总长度, //包括配置描述符本身、接口描述符、类描述符、端点描述符等。 WBVAL( USB_CONFIGUARTION_DESC_SIZE + //配置描述符 USB_INTERFACE_DESC_SIZE + //接口1描述符 9 + //hid描述符 USB_ENDPOINT_DESC_SIZE + //端点描述符1 USB_ENDPOINT_DESC_SIZE + //端点描述符2 USB_INTERFACE_DESC_SIZE + //接口2描述符 USB_ENDPOINT_DESC_SIZE + //端点描述符1 USB_ENDPOINT_DESC_SIZE //端点描述符2 ), 0x02, //bNumInterfaces字段。该配置包含的接口数,复合设备,两个接口。 0x01, //bConfiguration字段。该配置的值为1。 0x00, //iConfigurationz字段,该配置的字符串索引。这里没有,为0。 USB_CONFIG_BUS_POWERED , //bmAttributes字段,该设备的属性 USB_CONFIG_POWER_MA(500), //bMaxPower字段,该设备需要的最大电流量 /*********************第一个接口描述符,hid设备**********************/ USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的长度为9字节。 USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的编号为0x04。 0x00, //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。 0x00, //bAlternateSetting字段。该接口的备用编号,为0。 0x02, //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点 USB_DEVICE_CLASS_HUMAN_INTERFACE, //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。, 0x00, //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中, //只规定了一种子类:支持BIOS引导启动的子类。 //USB键盘、鼠标属于该子类,子类代码为0x01。 //但这里我们是自定义的HID设备,所以不使用子类。 0x00, //bInterfaceProtocol字段。如果子类为支持引导启动的子类, //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。 //自定义的HID设备,也不使用协议。 0x00, //iConfiguration字段。该接口的字符串索引值。这里没有,为0。 /*********************HID报告描述符*************************/ //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。 0x09, //bDescriptorType字段。HID描述符的编号为0x21。 0x21, //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。 0x10, 0x01, //bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。 0x00, //bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。 0x01, //bDescriptorType字段。下级描述符的类型,为报告描述符,编号为0x22。 0x22, //bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。 sizeof(HID_ReportDescriptor)&0xFF, (sizeof(HID_ReportDescriptor)>>8)&0xFF, /*********************端点1描述符 **********************************/ /* 端点描述符 */ USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。 USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。 USB_ENDPOINT_IN(1), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。 USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes字段。D1~D0为端点传输类型选择。 WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。 0x02, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。 /*********************端点2描述符 **********************************/ /* 端点描述符 */ USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。 USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。 USB_ENDPOINT_OUT(1), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。 USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes字段。D1~D0为端点传输类型选择。 WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。 0x02, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。 /*******************第二个接口描述符 存储设备*********************/ USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的长度为9字节。 USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的编号为0x04。 0x01, //bInterfaceNumber字段。该接口的编号,第二个接口,编号为1。 0x00, //bAlternateSetting字段。该接口的备用编号,为0。 0x02, //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点 USB_DEVICE_CLASS_STORAGE, //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。, MSC_SUBCLASS_SCSI, //bInterfaceSubClass字段。SCSI透明命令集的子类代码为0x06。 MSC_PROTOCOL_BULK_ONLY, //bInterfaceProtocol字段。协议为仅批量传输,代码为0x50。 0x04, //iConfiguration字段。该接口的字符串索引值 /************************************* 端点描述符 1*********************************************/ USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。 USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。 USB_ENDPOINT_IN(2), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。 USB_ENDPOINT_TYPE_BULK, //bmAttributes字段。D1~D0为端点传输类型选择。 WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。 0x00, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。 /************************************端点描述符 2********************************************************/ USB_ENDPOINT_DESC_SIZE, //bLength字段。端点描述符长度为7字节。 USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端点描述符编号为0x05。 USB_ENDPOINT_OUT(2), //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。 USB_ENDPOINT_TYPE_BULK, //bmAttributes字段。D1~D0为端点传输类型选择。 WBVAL(0x0040), //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。 0x00, //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。 }; /************************语言ID的定义********************/ const u8 DinkUsbLanguageId[DINK_USB_SIZ_STRING_LANGID]= { 0x04, //本描述符的长度 0x03, //字符串描述符 //0x0409为美式英语的ID 0x09, 0x04 }; ////////////////////////语言ID完毕////////////////////////////////// //Unicode 字符串描述符 //邓小俊的usb鼠标 const u8 DinkUsbManufacturerStringDescriptor[DINK_USB_SIZ_STRING_VENDOR]= { 32, //该描述符的长度为32字节 0x03, //字符串描述符的类型编码为0x03 0x44, 0x00, //D 0x49, 0x00, //I 0x4e, 0x00, //N 0x4b, 0x00, //K 0x5f, 0x00, //_ 0x48, 0x00, //H 0x49, 0x00, //I 0x44, 0x00, //D 0x5f, 0x00, //_ 0x44, 0x00, //D 0x45, 0x00, //E 0x56, 0x00, //V 0x49, 0x00, //I 0x43, 0x00, //C 0x45, 0x00 //E }; /////////////////////////厂商字符串结束///////////////////////////// //产品字符串描述符 const u8 DinkUsbProductStringDescriptor[DINK_USB_SIZ_STRING_PRODUCT]= { 32, //该描述符的长度为32字节 0x03, //字符串描述符的类型编码为0x03 0x44, 0x00, //0x5A, 0x00, //D(0x44)==>Z 0x49, 0x00, //0x4D, 0x00, //I(0x49)==>M 0x4E, 0x00, //0x5A, 0x00, //N(0x4E)==>Z 0x4B, 0x00, //0x38, 0x00, //K(0x4B)==>8 0x5f, 0x00, //_ 0x48, 0x00, //H 0x49, 0x00, //I 0x44, 0x00, //D 0x5f, 0x00, //_ 0x44, 0x00, //D 0x45, 0x00, //E 0x56, 0x00, //V 0x49, 0x00, //I 0x43, 0x00, //C 0x45, 0x00 //E }; ////////////////////////产品字符串结束//////////////////////////// //字符串“2008-07-07”的Unicode编码 //8位小端格式 const u8 DinkUsbSerialNumberStringDescriptor[DINK_USB_SIZ_STRING_SERIAL]={ 22, //该描述符的长度为22字节 0x03, //字符串描述符的类型编码为0x03 0x32, 0x00, //2 0x30, 0x00, //0 0x31, 0x00, //1 0x35, 0x00, //5 0x2d, 0x00, //- 0x30, 0x00, //0 0x33, 0x00, //3 0x2d, 0x00, //- 0x32, 0x00, //2 0x31, 0x00 //1 }; //////////////////////产品序列号字符串结束///////////////////////// //产品序列号 u8 DinkUsbStringSerialUniqueId[DINK_USB_SIZ_STRING_SERIAL_UNIQUE_ID] = { DINK_USB_SIZ_STRING_SERIAL_UNIQUE_ID, //描述符长度 0x03 //描述符类型编码 /* Serial number该编码将会在程序运行的时候用芯片唯一unique id进行填充*/ }; /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
所在话题
参与活动
-
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16