- 注册时间
- 2012-6-21
- 最后登录
- 2023-2-3
- 阅读权限
- 200
- 积分
- 1120
- 精华
- 0
- 帖子
- 152
  
|
发表于 2015-8-28 18:12:54
|显示全部楼层
其实本站的USB学习板配套光盘里有个实例只需要小小的修改就可以,以《自定义HID设备(读写HID)-温度采集实例》为例:
报告描述符修改为:
[code=cpp]code char ReportDescriptor[21] = {
0x06,0x00,0xFF, //USAGE_PAGE (Vendor Defined Page 1)
0x09,0x01, //USAGE (Vendor Usage 1)
0xA1,0x01, //COLLECTION (Application)
0x19,0x01, //(Vendor Usage 1)
0x15,0x00, //LOGICAL_MINIMUM (0)
0x26,0xFF,0x00, //LOGICAL_MAXIMUM (255)
0x75,0x08, //REPORT_SIZE (8)
0x95,0x02, //REPORT_COUNT (2)
0x81,0x02, //INPUT (Data,Var,Abs)
0xC0 // END_COLLECTION
}; [/code]
由于修改了报告描述符,所以定义也变了,在Descriptor.h里,内容如下:
extern code char ReportDescriptor[21];
修改端点描述符,因为端点描述符配置描述符(第二次请求时将端点描述符将被一齐请求),内容如下:
[code=cpp]code USB_DESCRIPTOR usb_descr =
{
//配置描述符
{
sizeof(USB_CONFIGURATION_DESCRIPTOR), //配置描述符长度,= 09H
USB_CONFIGURATION_DESCRIPTOR_TYPE, //配置描述符类型,= 02H
CONFIG_DESCRIPTOR_LENGTH,0x00, //描述符总长度, = 002EH
1, //只支持1个接口
1, //配置值
0, //字符串描述符指针(无)
// 0x60, //自供电,支持远程唤醒
0x80, //总线供电
0x32 //最大功耗(100mA)
},
//接口描述符
{
sizeof(USB_INTERFACE_DESCRIPTOR), //接口描述符长度,= 09H
USB_INTERFACE_DESCRIPTOR_TYPE, //接口描述符类型,= 04H
0, //接口数,只有1个
0, //可选配置,只有1个
NUM_ENDPOINTS, //除端点0的端点索引数目,= 02H
// USB_CLASS_CODE_TEST_CLASS_DEVICE, //测试设备类型,= 0DCH
0x03, //人机接口设备(HID)类
// USB_SUBCLASS_CODE_TEST_CLASS_D12, //子类代码,= 0A0H
1, //使用的子类:(支持boot)
// USB_PROTOCOL_CODE_TEST_CLASS_D12, //协议代码,= 0B0H
2, //bInterfaceProtocol为2代表鼠标
0 //字符串描述符索引
},
//hid_descriptor
{
sizeof(USB_HID_DESCRIPTOR), //HID描述符的字节数大小 0x09
USB_HID_DESCRIPTOR_TYPE, //HID描述符类型编号0x21
SWAP16(0x0110), //协议版本,= 1.10
0x21, //固件的国家地区代号,0x21为美国
NUM_SUB_DESCRIPTORS, //下级描述符的数量0x01
USB_REPORT_DESCRIPTOR_TYPE, //下级描述符为报告描述符0x22
SWAP16(sizeof(ReportDescriptor)), //下级描述符的长度
},
//端点2输入
{
sizeof(USB_ENDPOINT_DESCRIPTOR), //端点描述符长度,= 07H
USB_ENDPOINT_DESCRIPTOR_TYPE, //端点描述符类型,= 05H
0x82, //端点2 OUT
USB_ENDPOINT_TYPE_INTERRUPT, //中断传输,= 03H
EP2_PACKET_SIZE,0x00, //端点最大包的大小,= 0040H
0x0A //中断扫描时间:设置为1ms
}
};[/code]
因为CONFIG_DESCRIPTOR_LENGTH是配置描述符的长度,修改过后长度改变了,所以需要在Descriptor里找到CONFIG_DESCRIPTOR_LENGTH是怎么定义的,如下:
[code=cpp]#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + sizeof(USB_HID_DESCRIPTOR) + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))[/code]
发现其实我们需要修改NUM_ENDPOINTS的值,修改如下:
[code=cpp]#define NUM_ENDPOINTS 1[/code]
但是还没完,因为去掉了一个端点,所以需要修改USB_DESCRIPTOR结构定义,内容如下:
[code=cpp]typedef struct _USB_DESCRIPTOR {
USB_CONFIGURATION_DESCRIPTOR ConfigDescr; //配置描述符
USB_INTERFACE_DESCRIPTOR InterfaceDescr; //接口描述符
USB_HID_DESCRIPTOR HidDescr; //HID描述符
// USB_ENDPOINT_DESCRIPTOR EP1_TXDescr; //端点1输入描述符
// USB_ENDPOINT_DESCRIPTOR EP1_RXDescr; //端点1输出描述符
USB_ENDPOINT_DESCRIPTOR EP2_TXDescr; //端点2输入描述符
// USB_ENDPOINT_DESCRIPTOR EP2_RXDescr; //端点2输出描述符
} USB_DESCRIPTOR, *PUSB_DESCRIPTOR;[/code]
至此应该修改完了 |
|