//USB设备描述符的定义
code uint8 DeviceDescriptor[0x12]=  //设备描述符为18字节
{
//bLength字段。设备描述符的长度为18(0x12)字节0x12,//bDescriptorType字段。设备描述符的编号为0x010x01,//bcdUSB字段。这里设置版本为USB1.1,即0x0110。
//由于是小端结构,所以低字节在先,即0x10,0x01。0x10,0x01,//bDeviceClass字段。我们不在设备描述符中定义设备类,
//而在接口描述符中定义设备类,所以该字段的值为0。0x00,//bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。0x00,//bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。0x00,//bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。0x10,//idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
//注意小端模式,低字节在先。0x88,0x88,//idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。
//注意小端模式,低字节应该在前。0x01,0x00,//bcdDevice字段。我们这个USB鼠标刚开始做,就叫它1.0版吧,即0x0100。
//小端模式,低字节在先。0x00,0x01,//iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
//字符串索引就从1开始吧。0x01,//iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
//注意字符串索引值不要使用相同的值。0x02,//iSerialNumber字段。设备的序列号字符串索引值。
//这里取3就可以了。0x03,//bNumConfigurations字段。该设备所具有的配置数。
//我们只需要一种配置就行了,因此该值设置为1。0x01
};
//设备描述符完毕////USB报告描述符的定义
code uint8 ReportDescriptor[]=
{//每行开始的第一字节为该条目的前缀,前缀的格式为://D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。//这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)//后面跟一字节数据(bSize为1),后面的字节数就不注释了,//自己根据bSize来判断。0x05, 0x01, // USAGE_PAGE (Generic Desktop)//这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标0x09, 0x02, // USAGE (Mouse)//这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示//该集合是一个应用集合。它的性质在前面由用途页和用途定义为//普通桌面用的鼠标。0xa1, 0x01, // COLLECTION (Application)//这是一个局部条目。说明用途为指针集合0x09, 0x01, //   USAGE (Pointer)//这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个//物理集合,用途由前面的局部条目定义为指针集合。0xa1, 0x00, //   COLLECTION (Physical)//这是一个全局条目,选择用途页为按键(Button Page(0x09))0x05, 0x09, //     USAGE_PAGE (Button)//这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。0x19, 0x01, //     USAGE_MINIMUM (Button 1)//这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。0x29, 0x03, //     USAGE_MAXIMUM (Button 3)//这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)//最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。0x15, 0x00, //     LOGICAL_MINIMUM (0)//这是一个全局条目,说明逻辑值最大为1。0x25, 0x01, //     LOGICAL_MAXIMUM (1)//这是一个全局条目,说明数据域的数量为三个。0x95, 0x03, //     REPORT_COUNT (3)//这是一个全局条目,说明每个数据域的长度为1个bit。0x75, 0x01, //     REPORT_SIZE (1)//这是一个主条目,说明有3个长度为1bit的数据域(数量和长度//由前面的两个全局条目所定义)用来做为输入,//属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示//这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。//这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,//第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示//按键3(中键)是否按下。0x81, 0x02, //     INPUT (Data,Var,Abs)//这是一个全局条目,说明数据域数量为1个0x95, 0x01, //     REPORT_COUNT (1)//这是一个全局条目,说明每个数据域的长度为5bit。0x75, 0x05, //     REPORT_SIZE (5)//这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,//数量为1个。它的属性为常量(即返回的数据一直是0)。//这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据//而已,所以它是没有实际用途的。0x81, 0x03, //     INPUT (Cnst,Var,Abs)//这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)0x05, 0x01, //     USAGE_PAGE (Generic Desktop)//这是一个局部条目,说明用途为X轴0x09, 0x30, //     USAGE (X)//这是一个局部条目,说明用途为Y轴0x09, 0x31, //     USAGE (Y)//这是一个局部条目,说明用途为滚轮0x09, 0x38, //     USAGE (Wheel)//下面两个为全局条目,说明返回的逻辑最小和最大值。//因为鼠标指针移动时,通常是用相对值来表示的,//相对值的意思就是,当指针移动时,只发送移动量。//往右移动时,X值为正;往下移动时,Y值为正。//对于滚轮,当滚轮往上滚时,值为正。0x15, 0x81, //     LOGICAL_MINIMUM (-127)0x25, 0x7f, //     LOGICAL_MAXIMUM (127)//这是一个全局条目,说明数据域的长度为8bit。0x75, 0x08, //     REPORT_SIZE (8)//这是一个全局条目,说明数据域的个数为3个。0x95, 0x03, //     REPORT_COUNT (3)//这是一个主条目。它说明这三个8bit的数据域是输入用的,//属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明//这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示//Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。0x81, 0x06, //     INPUT (Data,Var,Rel)//下面这两个主条目用来关闭前面的集合用。//我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。0xc0,       //   END_COLLECTION0xc0        // END_COLLECTION
};
//通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。
//第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。
//第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示
//滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的
//鼠标数据。
///报告描述符完毕//USB配置描述符集合的定义
//配置描述符总长度为9+9+9+7字节
code uint8 ConfigurationDescriptor[9+9+9+7]=
{/***************配置描述符***********************///bLength字段。配置描述符的长度为9字节。0x09,//bDescriptorType字段。配置描述符编号为0x02。0x02,//wTotalLength字段。配置描述符集合的总长度,//包括配置描述符本身、接口描述符、类描述符、端点描述符等。sizeof(ConfigurationDescriptor)&0xFF, //低字节(sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节//bNumInterfaces字段。该配置包含的接口数,只有一个接口。0x01,//bConfiguration字段。该配置的值为1。0x01,//iConfigurationz字段,该配置的字符串索引。这里没有,为0。0x00,//bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,//并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。0x80,//bMaxPower字段,该设备需要的最大电流量。由于我们的板子//需要的电流不到100mA,因此我们这里设置为100mA。由于每单位//电流为2mA,所以这里设置为50(0x32)。0x32,/*******************接口描述符*********************///bLength字段。接口描述符的长度为9字节。0x09,//bDescriptorType字段。接口描述符的编号为0x04。0x04,//bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。0x00,//bAlternateSetting字段。该接口的备用编号,为0。0x00,//bNumEndpoints字段。非0端点的数目。由于USB鼠标只需要一个//中断输入端点,因此该值为1。0x01,//bInterfaceClass字段。该接口所使用的类。USB鼠标是HID类,//HID类的编码为0x03。0x03,//bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,//只规定了一种子类:支持BIOS引导启动的子类。//USB键盘、鼠标属于该子类,子类代码为0x01。0x01,//bInterfaceProtocol字段。如果子类为支持引导启动的子类,//则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。0x02,//iConfiguration字段。该接口的字符串索引值。这里没有,为0。0x00,/******************HID描述符************************///bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。0x09,//bDescriptorType字段。HID描述符的编号为0x21。0x21,//bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。0x10,0x01,//bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。0x21,//bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。0x01,//bDescriptorType字段。下级描述符的类型,为报告描述符,编号为0x22。0x22,//bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。sizeof(ReportDescriptor)&0xFF,(sizeof(ReportDescriptor)>>8)&0xFF,/**********************端点描述符***********************///bLength字段。端点描述符长度为7字节。0x07,//bDescriptorType字段。端点描述符编号为0x05。0x05,//bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。//D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。0x81,//bmAttributes字段。D1~D0为端点传输类型选择。//该端点为中断端点。中断端点的编号为3。其它位保留为0。0x03,//wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。//注意低字节在先。0x10,0x00,//bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。0x0A
};
配置描述符集合完毕///************************语言ID的定义********************/
code uint8 LanguageId[4]=
{0x04, //本描述符的长度0x03, //字符串描述符//0x0409为美式英语的ID0x09,0x04
};
语言ID完毕///**************************************************/
/*********        本转换结果来自         **********/
/********* Http://computer00.21ic.org    **********/
/*********        作者: 电脑圈圈         **********/
/*********         欢迎大家使用          **********/
/*********    版权所有,盗版请写明出处   **********/
/**************************************************///http://computer00.21ic.org/user1/2198/archives/2007/42769.html
//字符串“电脑圈圈的USB专区 Http://group.ednchina.com/93/”的Unicode编码
//8位小端格式
code uint8 ManufacturerStringDescriptor[82]={
82,         //该描述符的长度为82字节
0x03,       //字符串描述符的类型编码为0x03
0x35, 0x75, //电
0x11, 0x81, //脑
0x08, 0x57, //圈
0x08, 0x57, //圈
0x84, 0x76, //的
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x13, 0x4e, //专
0x3a, 0x53, //区
0x20, 0x00, //
0x48, 0x00, //H
0x74, 0x00, //t
0x74, 0x00, //t
0x70, 0x00, //p
0x3a, 0x00, //:
0x2f, 0x00, ///
0x2f, 0x00, ///
0x67, 0x00, //g
0x72, 0x00, //r
0x6f, 0x00, //o
0x75, 0x00, //u
0x70, 0x00, //p
0x2e, 0x00, //.
0x65, 0x00, //e
0x64, 0x00, //d
0x6e, 0x00, //n
0x63, 0x00, //c
0x68, 0x00, //h
0x69, 0x00, //i
0x6e, 0x00, //n
0x61, 0x00, //a
0x2e, 0x00, //.
0x63, 0x00, //c
0x6f, 0x00, //o
0x6d, 0x00, //m
0x2f, 0x00, ///
0x39, 0x00, //9
0x33, 0x00, //3
0x2f, 0x00  ///
};
/厂商字符串结束///字符串“《圈圈教你玩USB》之USB鼠标”的Unicode编码
//8位小端格式
code uint8 ProductStringDescriptor[34]={
34,         //该描述符的长度为34字节
0x03,       //字符串描述符的类型编码为0x03
0x0a, 0x30, //《
0x08, 0x57, //圈
0x08, 0x57, //圈
0x59, 0x65, //教
0x60, 0x4f, //你
0xa9, 0x73, //玩
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x0b, 0x30, //》
0x4b, 0x4e, //之
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x20, 0x9f, //鼠
0x07, 0x68  //标
};
产品字符串结束//字符串“2008-07-07”的Unicode编码
//8位小端格式
code uint8 SerialNumberStringDescriptor[22]={
22,         //该描述符的长度为22字节
0x03,       //字符串描述符的类型编码为0x03
0x32, 0x00, //2
0x30, 0x00, //0
0x30, 0x00, //0
0x38, 0x00, //8
0x2d, 0x00, //-
0x30, 0x00, //0
0x37, 0x00, //7
0x2d, 0x00, //-
0x30, 0x00, //0
0x37, 0x00  //7
};
//产品序列号字符串结束/

《圈圈教你玩USB》之 USB鼠标 描述符相关推荐

  1. 圈圈教你玩USB学习总结

    前言 最近想学习一下USB的相关知识,然后看大家都比较推荐<圈圈教你玩USB>这本书作为入门资料,看了一个礼拜看到了USB键盘实现章节.因为USB的内容比较多也比较复杂,特写下此文进行梳理 ...

  2. USB(六)-HID(报告描述符的结构实现)

    USB HID设备是通过报告(report)来传输数据的,报告有输入报告和输出报告.输入报告是USB设备发送给主机:输出报告是主机发送给USB设备. 报告描述符是用来描述一个报告的结构以及该报告里面的 ...

  3. HID报表描述符(目前最全的解析,也是USB最复杂的描述符)

    说一下为什么写这篇文章,主要是最近在做关于USB-HID设备的描述符,看到关于HID报表描述符的解析有点少,自己看了下,后续还会发布还有关于USB的各种解析,有兴趣可以看看,可以让你更加明白USB工作 ...

  4. USB键盘实现——字符串描述符(四)

    目录 字符串描述符 获取字符串描述符请求 标准设备请求 语言 ID 获取(字符串索引为 0) USB 控制端点收到的数据 语言 ID 返回 厂商字符串获取(字符串索引为 1) USB 控制端点收到的数 ...

  5. USB HID设备报告描述符详解

    概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明. USB通讯协议的规范是以1ms产生一个USB帧(Frame),USB设备可 ...

  6. USB接口的键盘描述符范例

    ;========================================= ; Device descriptor 设备描述符 ;============================== ...

  7. 【USB笔记】端点描述符Endpoint Descriptor

    USB笔记 端点描述符 (Endpoint Descriptor) 端点描述符 (Endpoint Descriptor)描述了USB规范定义的端点信息,包含有端点的带宽等信息.每一个端点都有自己的端 ...

  8. 【USB笔记】配置描述符Configuration Descriptor

    USB笔记 配置描述符(Configuration Descriptor) 配置描述符(Configuration Descriptor)说明了一个特定配置的相关信息.取得设备描述符(Device D ...

  9. 【USB笔记】接口描述符Interface Descriptor

    USB笔记 接口描述符 (Interface Descriptor) 接口描述符(Interface Descriptor)描述了配置中一个特定的接口.配置提供了一个或多个接口,每个接口都含有类(Cl ...

  10. 圈圈教你玩转USB第三版 光盘资料

    下载官网: http://service.buaapress.com.cn/mzs/file/detail/id/2199/key/b2fec916cc9fa216abe6fc836e3f7e35

最新文章

  1. python开发工具和框架安装器_Python 开发工具和框架安装
  2. 让Lua支持Linq吧
  3. 双编码器的自然语言图像搜索
  4. linux火狐打不开网页视频下载,win10下火狐浏览器无法打开网页视频的解决方法...
  5. 精选30道Java多线程面试题
  6. BMP图像文件格式分析附带图解
  7. Linux 监控命令 iostat
  8. 【图像隐写】基于matlab GUI DWT+SVD数字水印【含Matlab源码 606期】
  9. c语言中函数的知识点总结,c语言函数知识点总结
  10. RK3568平台开发系列讲解(安卓篇)JNI调用流程分析
  11. 彩色电视制式与色度解码电路
  12. Ubuntu16.04安装网易云音乐后无法打开
  13. 受激发射损耗显微术(一)
  14. SQL根据时间字段查询半小时之内或者之外的数据
  15. Python实战1-9例:变量、运算、字符串等综合训练
  16. 2019年,SEO关键词KPI考核指标有哪些?
  17. 还没搞懂正则?熬夜到虚脱整理出来的Python的正则表达式总结(Regular Expression)
  18. 什么是防火墙,为什么你需要防火墙?
  19. 【Linux】UTC时间、CST时间
  20. 学雷锋纪念日——擦亮梨城

热门文章

  1. JSch连接不上Linux服务器,JSch链接linux服务器问题解决方案:Session.connect: java.io.IOException: End of IO Stream Read...
  2. java数组名加括号_数组作参数被使用时,数组名后必须加方括号
  3. python并发编程 协程_Python并发编程协程之Gevent
  4. CMU 15-213 Introduction to Computer Systems学习笔记(3) Floating Point
  5. StanfordDB class自学笔记 (13) Views and Authorization
  6. matlab元素相同,Matlab:访问所有堆叠结构中的相同元素
  7. 12557是oracle什么错误吗,在做oracle standby时,出现ORA-12557错误.
  8. UVA 11044
  9. python turtle绘图
  10. Linux文件夹打包拷贝到window下