//-------------------------------------------------------------------------------------------
// USB CONFIG DESCRIPTOR TABLE
//-------------------------------------------------------------------------------------------
code UINT8 usb_config_descriptor[]= //配置描述符集
{
//-------------------------------------------------------------------------------------------
// 配置描述 9字节
//-------------------------------------------------------------------------------------------
/* bLength字段。配置描述符的长度为9字节。*/
0x09, //;0 bLength;
/* bDescriptorType字段。配置描述符编号为0x02。*/
0x02, //;1 bDescriptorType;
/* wTotalLength字段。配置描述符集合的总长度,包括配置描述符本身、接口描述符、类描述符、端点描述符等。*/
(9+(9+14/*+7*/)+(9+7+7)) & 0xFF, //;2 wTotalLength; 低字节
(9+(9+14/*+7*/)+(9+7+7)) >> 8, //;3 与2关联; 高字节
/* bNumInterfaces字段。该配置包含的接口数。*/
2, //;4 bNumInterFaces;
/* bConfiguration字段。该配置的值为1。*/
0X01, //;5 bConfigurationValue; SetConfiguration()请求用于选择这个配置
/* iConfigurationz字段,该配置的字符串索引。这里没有,为0。*/
0X00, //;6 iConfigration;
/* bmAttributes字段,该设备的属性。*/
//;7 bmAtrributes
((1 << 7) | //保留值,必须为1
(0 << 6) | // 0=总线供电; 1=自供电
(1 << 5) | // 1=支持remote;
(0 << 0)), //保留值0
/* bMaxPower字段,该设备需要的最大电流量。每单位电流为2mA。*/
0x32, //8; bMaxPower 最大电流 =2*n; n为字节值
//-------------------------------------------------------------------------------------------
// CDC类接口描述符 9字节
//-------------------------------------------------------------------------------------------
/* bLength字段。接口描述符的长度为9字节。*/
0x09, //;0;bLengh 长度
/* bDescriptorType字段。接口描述符的编号为0x04。*/
0x04, //;1;bdescriptor tpye接口描述符
/* bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。*/
0, //;2;b interface number接口编号(从0开始)
/* bAlternateSetting字段。该接口的备用编号,为0。*/
0x00, //;3;b alternat setting备用编号
/* bNumEndpoints字段。非0端点的数目。CDC接口只使用一个中断输入端点。*/
0x00, //;4;b num endpoints 非0端点数目
/* bInterfaceClass字段。该接口所使用的类。CDC类的类代码为0x02。*/
0x02, //;5;b interface class 类; 0x02=CDC类
/* bInterfaceSubClass字段。该接口所使用的子类。要实现USB转串口,就必须使用Abstract Control Model(抽象控制模型)子类。它的编号为0x02。*/
0x02, //;6;b interface sub class子类; 0x02=Abstract Control Model(抽象控制模型)子类。
/* bInterfaceProtocol字段。使用Common AT Commands(通用AT命令)协议。该协议的编号为0x01。*/
0x01, //;7;b interface protocol
/* iConfiguration字段。该接口的字符串索引值。这里没有,为0。*/
0x00, //;8;i configuration 该接口字符串索引值
//-------------------------------------------------------------------------------------------
// 以下为功能描述符 (5+5+4+5)字节
//-------------------------------------------------------------------------------------------
/*===================== Header Functional Descriptor ==================================*/
/* bFunctionLength字段。该描述符长度为5字节 */
0x05,
/* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
0x24,
/* bDescriptorSubtype字段。描述符子类为Header Functional Descriptor,编号为0x00。*/
0x00,
/* bcdCDC字段。CDC版本号,为0x0110(低字节在先)*/
0x10,
0x01,
// /*=================== Call Management Functional Descriptor ===========================*/
// /* bFunctionLength字段。该描述符长度为5字节 */
// 0x05,
// /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
// 0x24,
// /* bDescriptorSubtype字段。描述符子类为Call Management functional descriptor,编号为0x01。*/
// 0x01,
// /* bmCapabilities字段。设备自己不管理call management */
// 0x00,
// /* bDataInterface字段。没有数据类接口用作call management */
// 0x00,
/*================== Abstract Control Management Functional Descriptor ================*/
/* bFunctionLength字段。该描述符长度为4字节 */
0x04,
/* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
0x24,
/* bDescriptorSubtype字段。描述符子类为Abstract Control Management functional descriptor,编号为0x02。*/
0x02,
/* bmCapabilities字段。支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding请求和Serial_State通知 */
0x02,
/*======================= Union Functional Descriptor =================================*/
/* bFunctionLength字段。该描述符长度为5字节。*/
0x05,
/* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
0x24,
/* bDescriptorSubtype字段。描述符子类为Union functional descriptor,编号为0x06。*/
0x06,
/* MasterInterface字段。这里为前面编号为0的CDC接口。*/
0x00,
/* SlaveInterface字段,这里为接下来编号为1的数据类接口。*/
0x01,
//-------------------------------------------------------------------------------------------
// 接口0(CDC接口)Notification端点描述 7字节
//-------------------------------------------------------------------------------------------
// /* bLength字段。端点描述符长度为7字节。*/
// 0x07, //;0; b length
// /* bDescriptorType字段。端点描述符编号为0x05。*/
// 0x05, //;1; b descriptor type 0x05=端点描述
// /* bEndpointAddress字段。端点的地址。我们使用输入端点1。D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。*/
// //;2; b endpoint address 端点地址
// ((1 << 7) | // 1=输入方向; 0=输出方向
// (0 << 4) | //保留值, 0
// (3 << 0)), //端点号
// /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为中断端点。中断端点的编号为3。其它位保留为0。*/
// //;3; bm attributes
// ((3 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
// (0 << 2) | //仅同步传输使用;
// (0 << 4) | //仅同步传输使用
// (0 << 6)), //保留位
// /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
// EP3_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
//
// //;5; 与4关联;
// (((EP3_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
// (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
// (0 << 13)), //保留位
// /* bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。*/
// 0xFF, //;6; 数据查询时间间隔(ms)
//-------------------------------------------------------------------------------------------
// 数据类(DCI)接口描述符 9字节
//-------------------------------------------------------------------------------------------
/* bLength字段。接口描述符的长度为9字节。*/
0x09, //;0;bLengh 长度
/* bDescriptorType字段。接口描述符的编号为0x04。*/
0x04, //;1;bdescriptor tpye接口描述符
/* bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。*/
1, //;2;b interface number接口编号(从0开始)
/* bAlternateSetting字段。该接口的备用编号,为0。*/
0x00, //;3;b alternat setting备用编号
/* bNumEndpoints字段。非0端点的数目。该设备需要使用一对批量端点,设置为2。*/
0x02, //;4;b num endpoints 非0端点数目
/* bInterfaceClass字段。该接口所使用的类。数据类接口的代码为0x0A。*/
0x0A, //;5;b interface class 类; 0x0A=数据类
/* bInterfaceSubClass字段。该接口所使用的子类。*/
0x00, //;6;b interface sub class子类;
/* bInterfaceProtocol字段。*/
0x00, //;7;b interface protocol
/* iConfiguration字段。该接口的字符串索引值。这里没有,为0。*/
0x00, //;8;i configuration 该接口字符串索引值
//-------------------------------------------------------------------------------------------
// 数据类接口端点描述(BULK_IN) 7字节
//-------------------------------------------------------------------------------------------
/* bLength字段。端点描述符长度为7字节。*/
0x07, //;0; b length
/* bDescriptorType字段。端点描述符编号为0x05。*/
0x05, //;1; b descriptor type 0x05=端点描述
/* bEndpointAddress字段。端点的地址。D7位表示数据方向,输入端点D7为1。*/
//;2; b endpoint address 端点地址
((1 << 7) | // 1=输入方向; 0=输出方向
(0 << 4) | //保留值, 0
(2 << 0)), //端点号
/* bmAttributes字段。D1~D0为端点传输类型选择。该端点为批量端点。批量端点的编号为2。其它位保留为0。*/
//;3; bm attributes
((2 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
(0 << 2) | //仅同步传输使用;
(0 << 4) | //仅同步传输使用
(0 << 6)), //保留位
/* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
EP2_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
//;5; 与4关联;
(((EP2_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
(0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
(0 << 13)), //保留位
/* bInterval字段。端点查询的时间,这里对批量端点无效。*/
0x00, //;6; 数据查询时间间隔(ms)
//-------------------------------------------------------------------------------------------
// 数据类接口端点描述(BULK_OUT) 7字节
//-------------------------------------------------------------------------------------------
/* bLength字段。端点描述符长度为7字节。*/
0x07, //;0; b length
/* bDescriptorType字段。端点描述符编号为0x05。*/
0x05, //;1; b descriptor type 0x05=端点描述
/* bEndpointAddress字段。端点的地址。D7位表示数据方向,输入端点D7为1。*/
//;2; b endpoint address 端点地址
((0 << 7) | // 1=输入方向; 0=输出方向
(0 << 4) | //保留值, 0
(1 << 0)), //端点号
/* bmAttributes字段。D1~D0为端点传输类型选择。该端点为批量端点。批量端点的编号为2。其它位保留为0。*/
//;3; bm attributes
((2 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
(0 << 2) | //仅同步传输使用;
(0 << 4) | //仅同步传输使用
(0 << 6)), //保留位
/* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
EP1_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
//;5; 与4关联;
(((EP1_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
(0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
(0 << 13)), //保留位
/* bInterval字段。端点查询的时间,这里对批量端点无效。*/
0x00, //;6; 数据查询时间间隔(ms)
};