USB描述符解析和USB_CCID描述符设置

usb中的endpoint(端点)和传输模式


端点

端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO。

每个USB 外设有一个唯一的地址,可能包含最多十六个端点。主机通过发出器件地址和每次数据传输的端点号,向一个具体端点(FIFO)发送数据。

每个端点的地址为0 到15,一个端点地址对应一个方向。所以,端点2-IN 与端点2-OUT 完全不同(一个端点是否能够同时配置为IN和OU,要看具体的芯片手册,STM32F103的每个端口都可以配置为双向,但是SAM9G45的端点就不可以,只能配置为一个方向【端点0除外】) 每个器件有一个默认的双向控制端点0,因此不存在端点0-IN 和端点0-OUT。

在一个USB设备中会有很多endpoint,最多有16个。而我用的S5PV210处理器中有 16个,分别为EP0 – EP15。一个EP本质上讲是FIFO,也就是一段缓冲区,我们可以这样理解一个USB OTG设备就是有很多个缓冲区的集合。


虽然有16个端点,但是我们通常只会用到3个。比较常用的做法是EP0用做传输配置和控制信息,EP1IN_EPEP2OUT_EP


IN_EP的作用是用于把数据从Host传到Device中。而OUT_EP的作用是用于把数据从Device传送到Host中。即他们分别用做发送和接收。


USB四种传输模式

控制传输、批量传输、中断传输、同步传输

USB 有上述四种传输类型。枚举期间外设告诉主机每个端点支持哪种传输类型。

USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(Transaction),

事务有四种类型:Bulk TransactionControl TransactionInterrupt TransactionIsochronous Transaction


数据包包含部分

每次事务都会分解成若干个数据包在USB总线上传输。每次传输必须历经两个或三个部分,第一部分——USB控制器向USB设备发出命令,

第二部分——USB控制器和USB设备之间传递读写请求,其方向主要看第一部分的命令是读还是写,第二部分有时候可以没有。

第三部分——握手信号。


批量(Bulk)传输事务

作用:主要应用在数据大量数据传输和接受数据上同时又没有带宽和间隔时间要求的情况下;

特点:要求保证传输。打印机和扫描仪属于这种类型这种类型的设备

适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的传输完成之后再传输和接收数据。

批量数据传输分三个阶段:

第一部分——令牌阶段。

Host端发出一个Bulk的令牌请求。

如果令牌是IN请求 ,则是从Device到Host的请求;

如果令牌是OUT请求,则是从Host到Device端的请求。

第二部分——传送数据的阶段。

根据先前请求的令牌的类型,数据传输有可能是IN方向,也有可能是OUT方向。传输数据的时候用DATA0和DATA1令牌携带着数据交替传送。

数据传输格式DATA1和DATA0,这两个是重复数据,确保在1数据丢失时0可以补上,不至于数据丢失。

第三部分——握手阶段。

如果数据是IN 方向,握手信号应该是Host端发出;

如果数据是OUT方向,握手信号应该是Device端发出。

握手信号可以为ACK, 表示正常响应,

NAK, 表示没有正确传送。

STALL,表示出现主机不可预知的错误。


控制(Control)传输

作用:USB系统软件用来主要进行查询配置和给USB设备发送通用的命令;

特点:控制传输是双向传输,数据量通常较小;数据传送是无损性的。

数据宽度:控制传输方式可以包括8、16、32和64字节的数据,这依赖于设备和传输速度。

控制传输典型地用在主计算机和USB外设之间的端点0(EP0)之间的传输

控制传输也分为三个阶段,即令牌阶段、数据传送阶段、握手阶段


中断(Interrupt)传输事务

作用:主要用于定时查询设备是否有中断数据要传输;

特点:设备的端点模式器的结构决定了它的查询频率从1到255ms之间。

典型的应用在少量的分散的不可预测数据的传输键盘操纵杆和鼠标就属于这一类型

(数据量很小)

中断方式传输是单向的并且对于host 来说只有输入(IN)的方式

在中断事务中,也分为三个阶段,即令牌阶段、数据传输阶段、握手阶段


同步(Isochronous)传输事务

作用:用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传输率的即时应用中。例如执行即时通话的网络电话。

特点:保证传输的同步性。保证每秒有固定的传输量。

(与Bulk传输不同)同步传输允许有一定的误码率。(这样符合视频会议等传输的需求,因为视频会议首先要保证实时性,在一定条件下,允许有一定的误码率。)

同步传输事务有只有两个阶段,即令牌阶段、数据阶段,因为不关心数据的正确性,故没有握手阶段。


一个USB设置可以有多个配置,在初始化的过程中,会选择一个默认的配置,选择的方法根据驱动实现而不一样,linux usb会选择第一个标准的配置。

else if (udev->descriptor.bDeviceClass !=
USB_CLASS_VENDOR_SPEC &&
(desc && desc->bInterfaceClass !=
USB_CLASS_VENDOR_SPEC)) {
best = c;
break;
}
比较的是配置里的class,还有配置第一个接口的第一个设置的class。如果不是VENDOR自己定义的class,也就是标准的class,linux就会选择其为默认的configuration.

一个配置可以有多个接口,一个接口会有多个设置。看了USB2.0标准spec后,发现只有interface的描述符,而没有设置的描述符,这是为啥呢?
在linux kernel里,接口用struct usb_interface来表示,接口里的设置是用struct usb_host_interface来表示。既然一个接口里包含多个设置,那我们看看接口的定义。

struct usb_interface {
/* array of alternate settings for this interface,
 * stored in no particular order */
struct usb_host_interface *altsetting;

struct usb_host_interface *cur_altsetting;/* the currently
 * active alternate setting */
unsigned num_altsetting;/* number of alternate settings */

/* If there is an interface association descriptor then it will list
 * the associated interfaces */
struct usb_interface_assoc_descriptor *intf_assoc;

int minor;/* minor number this interface is
 * bound to */
enum usb_interface_condition condition;/* state of binding */
unsigned sysfs_files_created:1;/* the sysfs attributes exist */
unsigned ep_devs_created:1;/* endpoint "devices" exist */
unsigned unregistering:1;/* unregistration is in progress */
unsigned needs_remote_wakeup:1;/* driver requires remote wakeup */
unsigned needs_altsetting0:1;/* switch to altsetting 0 is pending */
unsigned needs_binding:1;/* needs delayed unbind/rebind */
unsigned reset_running:1;
unsigned resetting_device:1;/* true: bandwidth alloc after reset */

struct device dev;/* interface specific device info */
struct device *usb_dev;
atomic_t pm_usage_cnt;/* usage counter for autosuspend */
struct work_struct reset_ws;/* for resets in atomic context */
};

红色部分就是接口里的设置,usb2.0标准里的interface描述符,其实是包含在接口里,也就是struct usb_host_interface里。那这到底是什么意思呢?下面是usb2.0协议里的一段话。

If a device configuration supported a single interface with two alternate settings, the configuration
descriptor would be followed by an interface descriptor with the bInterfaceNumber and bAlternateSetting
fields set to zero and then the endpoint descriptors for that setting, followed by another interface descriptor
and its associated endpoint descriptors. The second interface descriptor’s bInterfaceNumber field would
also be set to zero, but the bAlternateSetting field of the second interface descriptor would be set to one.

事实上这个interface描述符,就是设置描述符,这个描述符的其中一项叫做bInterfaceNumber,指的就是这个设置是属于哪个接口。比如一个接口包含2个设置,那么就会有2个interface描述符,两个描述符里的bInterfaceNumber设置都为0,但是第一个设置的bAlternateSetting为0, 第二个设置的bAlternateSetting为1。这样就区分开来了。

假如一共有5个设置,2个接口。这5个设置,2个属于接口1, 3个属于接口2.
则就会有2个struct usb_interface,第一个usb_interface里的altsetting有2个,第二个有3个。
协议里规定,接口的默认设置总是0号设置。


至于endpoint描述符,它是属于设置的,每个设置都会有endpoint描述符,也就是每个接口的设置都表示一种功能,既然是实现了功能,那就必须通过endpoint来传输数据,那到底是用到了几个endpoint呢?每个 endpoint的属性是?所以每个接口的设置里就会有 endpoint的描述符。

endpoint有个特性,要么只能input,要么只能output,但是也有一个特殊 的endpoint,就是endpoint 0,每个USB设备都有这么一个endpoint0,除此endpoint,其他都只能单工的。而且每个endpoint每次传输的大小也不一样,所以就有了这么个endpoint描述符来对其进行描述。


这里比较费解的就是接口和设置的关系,现在这么一分析就清楚多了。


出处:http://blog.csdn.net/leumber/article/details/72765902


USB描述符解析

USB描述符信息会被存储在USB设备中,在设备枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,按照描述符中的一些配置信息与设备建立相应的数据通道。USB描述符信息在USB协议中有详细描述。

标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符。下面详解:

1.设备描述符 一个设备只有一个设备描述符,列出这个设备的配置参数

typedef struct _USB_DEVICE_DESCRIPTOR_
{
BYTE bLength,
BYTE bDescriptorType,
WORD bcdUSB,
BYTE bDeviceClass,
BTYE bDeviceSubClass,
BYTE bDeviceProtol,
BYTE bMaxPacketSize0,
WORD idVenderI,
WORD idProduct,
WORD bcdDevice,
BYTE iManufacturer,
BYTE iProduct,
BYTE iSerialNumber,
BYTE iNumConfiguations
}USB_DEVICE_DESCRIPTOR;

bLength : 描述符大小.固定为0x12.
bDescriptorType : 设备描述符类型.固定为0x01.
bcdUSB : USB 规范发布号.表示了本设备能适用于那种协议,如2.0=0200,1.1=0110等.
bDeviceClass :类型代码(由USB指定)当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1到FEH时,表示不同的接口关联的。当它的值是FFH时,它是厂商自己定义的.
bDeviceSubClass : 子类型代码(由USB分配).如果bDeviceClass值是0,一定要设置为0.其它情况就跟据USB-IF组织定义的编码.
bDeviceProtocol : 协议代码(由USB分配).如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH.
bMaxPacketSize0 : 端点0最大分组大小(只有8,16,32,64有效).
idVendor : 供应商ID(由USB分配).
idProduct : 产品ID(由厂商分配).由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序.
bcdDevice : 设备出产编码.由厂家自行设置.
iManufacturer : 厂商描述符字符串索引.索引到对应的字符串描述符.为0则表示没有.
iProduct : :产品描述符字符串索引.同上.
iSerialNumber : 设备序列号字符串索引.同上.
bNumConfigurations : 可能的配置数.指配置字符串的个数

2.配置描述符 一个设备中可以有多个配置描述符,每套配置描述符含有接口描述符,端点描述符

typedef struct _USB_CONFIGURATION_DESCRIPTOR_
{
    BYTE bLength,
    BYTE bDescriptorType,
    WORD wTotalLength,
    BYTE bNumInterfaces,
    BYTE bConfigurationValue,
    BYTE iConfiguration,
    BYTE bmAttributes,
    BYTE MaxPower
}USB_CONFIGURATION_DESCRIPTOR;

bLength: 描述符大小.固定为0x09.
bDescriptorType: 配置描述符类型.固定为0x02.
wTotalLength: 整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小.
bNumInterfaces: 配置所支持的接口数.指该配置配备的接口数量,也表示该配置下接口描述符数量.
bConfigurationValue:当使用SetConfiguration和GetConfiguration请求时所指定的配置索引值
iConfiguration: 用于描述该配置字符串描述符的索引.
bmAttributes: 供电模式选择.D7:总线供电,D6:自供电,D5:远程唤醒,D4~D0:保留
MaxPower: 总线供电的USB设备的最大消耗电流.以2mA为单位.例如0x32为50*2=100mA

3.接口描述符 一个配置描述符内可以含有多个接口,数量由配置描述符决定

typedef struct _USB_INTERFACE_DESCRIPTOR_
{
    BYTE bLength,
    BYTE bDescriptorType,
    BYTE bInterfaceNumber,
    BYTE bAlternateSetting,
    BYTE bNumEndpoint,
    BYTE bInterfaceClass,
    BYTE bInterfaceSubClass,
    BYTE bInterfaceProtocol,
    BYTE iInterface
}USB_INTERFACE_DESCRIPTOR;

bLength:描述符大小.固定为0x09
bDescriptorType:接口描述符类型.固定为0x04
bInterfaceNumber:该接口的编号
bAlternateSetting:用于为上一个字段选择可供替换的位置.即备用的接口描述符标号
bNumEndpoint:使用的端点数目.端点0除外
bInterfaceClass:类型代码(由USB分配)
bInterfaceSubClass:子类型代码(由USB分配)
bInterfaceProtocol:协议代码(由USB分配)
iInterface:字符串描述符的索引

4.端点描述符 每个接口所需要的端点及其设置,数量由配置描述符决定

typedef struct _USB_ENDPOINT_DESCRIPTOR_
{
    BYTE bLength,
    BYTE bDescriptorType,
    BYTE bEndpointAddress,
    BYTE bmAttributes,
    WORD wMaxPacketSize,
    BYTE bInterval
}USB_ENDPOINT_DESCRIPTOR;

bLength : 描述符大小.固定为0x07.
bDescriptorType : 接口描述符类型.固定为0x05.
bEndpointType : USB设备的端点地址.D7端点方向,对于控制端点可以忽略,1/0:IN/OUT.D6-D4,保留.D3-D0:端点号.
bmAttributes : 端点属性.D7-D2,保留.D1-D0,传输类型:00控制,01同步,02批量,03中断.
wMaxPacketSize : 本端点接收或发送的最大信息包大小.
bInterval : 轮询数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255.

5.字符串描述符 字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0,每个字符串描述符都有一个索引,USB主机会在请求时按照顺序获取对应的字符串描述符,默认0位语言字符串描述符,后边都由每个描述符内容中指定,一般1为设备厂商字符串描述符,2为产品描述符,3为设备序列号字符串描述符,4为接口描述符

typedef struct _USB_STRING_DESCRIPTION_
{
    BYTE bLength,
    BYTE bDescriptionType,
    BYTE bString[];
}USB_STRING_DESCRIPTION;

bLength : 描述符大小.由整个字符串的长度加上bLength和bDescriptorType的长度决定.
bDescriptorType : 接口描述符类型.固定为0x03.
bString[] : Unicode编码字符串.

下边是一套USB_CCID的设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符

CCID描述符配置

[cpp]  view plain  copy
  1. /*------------Descriptor of USB Device---------------------------*/   
  2. const UINT8 DeviceDescFS[18]=   
  3. {       
  4.     0x12,  //bLength          //设备描述符的字节数大小,为0x12  
  5.     0x01,  //bDescriptorType  //设备描述符类型编号,为0x01  
  6.     0x00,  //bcdUSB           //USB规范版本号(BCD码)  0x0110  
  7.     0x02,    
  8.     0x00,  //bDeviceClass     //USB分配的设备类代码,0x01~0xfe 为标准设备类,0xff 为厂商自定义类型 0x00 不是在设备描述符中定义的,如HID  
  9.     0x00,  //bDeviceSubClass  //USB分配的设备子类代码,同上,值由USB 规定和分配的  
  10.     0x00,  //bDeviceProtocl   //USB分配的设备协议代码,同上  
  11.     CTRL_PACKET_LEN, //bMaxPacketSize0 //端点0控制传输所支持的最大数据包长度,单位字节  
  12.     0x12,  //idVendor         //厂商编号VID=0x2012  
  13.     0x20,  
  14.     0x02,  //idProduct        //产品编号PID=0x1402  
  15.     0x14,  
  16.     0x01,  //bcdDevice        //设备出厂编号bcdDevice=0x0100  
  17.     0x02,    
  18.     0x04,  //iManufacturer    //描述厂商字符串的索引Index of Vendor  
  19.     0x1C,  //iProduct         //描述产品字符串的索引Index of Producr  
  20.     0x14,  //iSerialNumber    //描述设备序列号字符串的索引0x03;//Index of SN  
  21.     0x01   //bNumConfiguration//可能的配置数量  
  22. };   
  23.   
  24. /*------------Descriptor of USB Configuation---------------------------*/   
  25. #define USB_SIZ_CONFIG_DESC     (93 + 77)  
  26. UINT8 USBD_CCID_ConfigDescriptor[] =  
  27. {  
  28.     /*Configuation Descriptor*/  
  29.     0x09,/* bLength: Configuation Descriptor size */  
  30.     0x02,/* bDescriptorType: Configuration */  
  31.     LOBYTE(USB_SIZ_CONFIG_DESC),/* wTotalLength:no of returned bytes low*/  
  32.     HIBYTE(USB_SIZ_CONFIG_DESC),,/* wTotalLength:no of returned bytes higt*/  
  33.     0x02,   /* bNumInterfaces: 2 interface */  
  34.     0x01,   /* bConfigurationValue: Configuration value */  
  35.     0x04,   /* iConfiguration: Index of string descriptor describing the configuration */  
  36.     0x80,   /* bmAttributes:bus powered */      
  37.     0x32,   /* MaxPower 200 mA */  
  38.   
  39.     /*Interface Descriptor*/  
  40.     0x09,   /* bLength: Interface Descriptor size */  
  41.     0x04,   /* bDescriptorType: Interface descriptor type*/  
  42.     0x01,   /* bInterfaceNumber: Number of Interface */     //接口号  
  43.     0x00,   /* bAlternateSetting: Alternate setting */  
  44.     0x03,   /* bNumEndpoints*/                              //接口端点数量  
  45.     0x0B,   /* bInterfaceClass: Smart Card */               //接口类型:0x0B智能卡类型  
  46.     0x00,   /* bInterfaceSubClass : SCSI transparent*/  
  47.     0x00,   /* nInterfaceProtocol */  
  48.     0X05,   /* iInterface: */                               //接口字符串描述符的索引  
  49.   
  50.     //CCID class desc  
  51.     0x36,                   //bLength                      //描述符长度, = 36H  
  52.     0x21,                   //bDescriptorType              //描述符类型, = 21H  
  53.     0x10,0x01,              //bcdCCID                      //CCID类规范版本号  = 1.1  
  54.     0x00,                   //bMaxSlotIndex                //所支持的最大插槽数 1个     
  55.     0x03,                   //bVoltageSupport  5.0V        //所支持卡的操作电压 01--5V; 02--3V; 04--1.8V 5V&3V  
  56.     0x03,0x00,0x00,0x00,    //dwProtocols  T = 0           //所支持的卡通讯协议T=0&T=1  
  57.     0xb8,0x0b,0x00,0x00,    //dwDefaultClock  3MHz         //默认卡操作时钟,以KHz为单位 3000KHz  
  58.     0xb8,0x0b,0x00,0x00,    //dwMaximumClock  3MHz         //所支持的最小时钟 3000KHz  
  59.     0x00,                   //bNumClockSupported  1        //所支持的时钟数 仅支持默认时钟  
  60.     0x80,0x25,0x00,0x00,    //dwDataRate  9600bps          //默认IC卡通讯的位速率 9600  
  61.     0x80,0x25,0x00,0x00,    //dwMaxDataRate  115200bps     //所支持的与IC卡通讯的最大位速率 9600  
  62.     0x00,                   //bNumDataRatesSupported  1    //所支持的位速率数 仅支持默认速率  
  63.     0xFE,0x00,0x00,0x00,    //dwMaxIFSD                    //T=1协议下的最大FSD 254  
  64.     0x00,0x00,0x00,0x00,    //dwSynchProtocols             //所支持的同步协议 当前版本为0x00000000  
  65.     0x00,0x00,0x00,0x00,    //dwMechanical                 //所支持的机械特性,00-无任何特性  
  66.     0xBA,0x00,0x02,0x00,    //dwFeatures                   //卡片特性 0x0002008A/0x0004023A  
  67.     0x80,0x01,0x00,0x00,    //dwMaxCCIDMessageLength       //最大CCID信息长度 短格式下为261+10,此处设为384  
  68.     0x00,                   //bClassGetResponse            //GetReponse指令获取数据的缺省值 00  
  69.     0x00,                   //bClassEnvelope               //Envelope指令缺省值 00  
  70.     0x00,0x00,              //wLcdLayout                   //液晶尺寸0x0000 没有液晶  
  71.     0x00,                   //bPINSupport                  //密码支持 不支持PIN  
  72.     0x01,                   //bMaxCCIDBusySlots            //所支持的可同时操作的插槽数 1个  
  73.   
  74.     /*Endpoint 1 Descriptor*/  
  75.     0x07, //bLength                         //端点描述符的字节数大小  
  76.     0x05, //bDescriptorType                 //端点描述符类型编号   
  77.     EP1IN_NUMBER, //bEndpointAddress        //端点地址及输入输出属性   
  78.     0x02, //bmAttributes                    //端点的传输类型属性  
  79.     0x40, //wMaxPacketSize                  //端点收、发的最大包的大小  
  80.     0x00,   
  81.     0x01, //bInterval                      //主机查询端点的时间间隔      
  82.     /*Endpoint 1 Descriptor*/  
  83.     0x07, //bLength                        //端点描述符的字节数大小  
  84.     0x05, //bDescriptorType                //端点描述符类型编号    
  85.     EP1OUT_NUMBER, //bEndpointAddress      //端点地址及输入输出属性    
  86.     0x02, //bmAttributes                   //端点的传输类型属性  
  87.     0x40, //wMaxPacketSize                  //端点收、发的最大包的大小  
  88.     0x00,   
  89.     0x01,  //bInterval                     //主机查询端点的时间间隔   
  90.     /*Endpoint 2 Descriptor*/  
  91.     0x07, //bLength                        //端点描述符的字节数大小  
  92.     0x05, //bDescriptorType                //端点描述符类型编号    
  93.     EP2IN_NUMBER, //bEndpointAddress       //端点地址及输入输出属性    
  94.     0x03, //bmAttributes                   //端点的传输类型属性  
  95.     0x08, //wMaxPacketSize                 //端点收、发的最大包的大小//产生 xact error  
  96.     0x00,   
  97.     0x0a, //bInterval                      //主机查询端点的时间间隔  
  98.   
  99.     /*Interface Descriptor*/  
  100.     0x09,   /* bLength: Interface Descriptor size */  
  101.     0x04,   /* bDescriptorType: Interface */     
  102.     0x00,   /* bInterfaceNumber: Number of Interface */  
  103.     0x00,   /* bAlternateSetting: Alternate setting */  
  104.     0x02,   /* bNumEndpoints*/  
  105.     0x0B,   /* bInterfaceClass: Smart Card */  
  106.     0x00,   /* bInterfaceSubClass : SCSI transparent*/  
  107.     0x00,   /* nInterfaceProtocol */  
  108.     0X06,   /* iInterface: */  
  109.   
  110.     0x36,  
  111.     0x21,  
  112.     0x10,0x01,  
  113.     0x00,  
  114.     0x03,  
  115.     0x03,0x00,0x00,0x00,  
  116.     0xb8,0x0b,0x00,0x00,  
  117.     0xb8,0x0b,0x00,0x00,  
  118.     0x00,  
  119.     0x80,0x25,0x00,0x00,  
  120.     0x80,0x25,0x00,0x00,  
  121.     0x00,  
  122.     0xfe,0x00,0x00,0x00,  
  123.     0x00,0x00,0x00,0x00,  
  124.     0x00,0x00,0x00,0x00,  
  125.     0xba,0x00,0x02,0x00,  
  126.     0x80,0x01,0x00,0x00,  
  127.     0x00,  
  128.     0x00,  
  129.     0x00,0x00,  
  130.     0x00,  
  131.     0x01,  
  132.   
  133.     /*Endpoint 3 Descriptor*/  
  134.     0x07,           /* bLength: Endpoint Descriptor size */  
  135.     0x05,           /* bDescriptorType: Endpoint */  
  136.     EP3OUT_NUMBER,  /* bEndpointAddress: (OUT3) */  
  137.     0x02,           /* bmAttributes: Bulk */  
  138.     0x40,           /* wMaxPacketSize: */  
  139.     0x00,  
  140.     0x0A,           /* bInterval: ignore for Bulk transfer */  
  141.   
  142.     /*Endpoint 3 Descriptor*/  
  143.     0x07,           /* bLength: Endpoint Descriptor size */  
  144.     0x05,           /* bDescriptorType: Endpoint */  
  145.     EP3IN_NUMBER,   /* bEndpointAddress: (IN3) */  
  146.     0x02,           /* bmAttributes: Bulk */  
  147.     0x40,           /* wMaxPacketSize: */  
  148.     0x00,  
  149.     0x0A,           /* bInterval: ignore for Bulk transfer */  
  150.       
  151. };  
  152. /*------------Descriptor of Device String---------------------------*/   
  153.   
  154. uint8_t USBD_LangIDDesc[0x04] =  
  155. {  
  156.     0x04,   /* bLength */        
  157.     0x03,   /* bDescriptorType */  
  158.     0x09,   /*English(US)*/  
  159.     0x04,   
  160. };  
  161.   
  162. #define USB_SIZ_STRING_SERIAL       (10)  
  163. uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] =  
  164. {  
  165.     USB_SIZ_STRING_SERIAL,  /* bLength */  
  166.     0x03,  /* bDescriptorType */  
  167.     '8', 0, '0', 0, '0', 0, '0', 0  
  168. };  
  169. uint8_t USBD_Interface1Strings[USB_DESCRIPTOR_LENGTH_STRING3] = {  
  170.     sizeof(USBD_Interface1Strings),  
  171.     0x03,                                                               
  172.     'S',0,'M',0,'A',0,'R',0,'T',0,' ',0,'C',0,'A',0,'R',0,'D',0,   
  173. };  


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值