USB学习
文章平均质量分 83
霖城城
嵌入式小牛马,本人文章都是学习笔记,如果有误,欢迎各位大佬指点
展开
-
项目:USB键盘和鼠标的复合设备
第四步,我们的复合设备是两个接口,每个接口就是对应一个HID设备类,因此我们的主机必须对每个接口获取相应的HID描述符与报告描述符,那么怎么样提交这些描述符的数据呢?第二个就是使用多个接口来实现复合设备,每一个接口实现一个功能,这个做法比较复杂,能让我们更加深入的了解USB,所以这次我们使用这种做法来实现复合设备。第三步就是复合设备需要相应总线枚举,我们的主机首先要对设备进行复位,所以会进入Joystick_Reset函数中,加上键盘的端点2的初始化。第二步,我们修改完报告描述符以后就是修改配置描述符,原创 2024-03-31 21:06:54 · 1474 阅读 · 1 评论 -
USB的报告描述符(2)
比如我们的光标大小,形状,颜色,双击速度,轨迹长度等等,这些都不是正常使用鼠标的过程中可以正常改变的,而Feature标签就可以用来描述这些属性(要记住哈,我们鼠标这些特征都是从操作系统层面实现的,并没有在报告描述符中指定,仅仅用来方便理解特征),相当于另外开辟了一个通道来改变设备的特征了。主机与显示设备之间可以有多种数据传输方式。他是一个八位的数据,逻辑值最大定义2,这是一个输入装置,当我们的显示装置状态发生改变的时候,中断端点会产生输入报告,它包含未准备好状态已准备好,不可加载字符错误,相应报告如下。原创 2024-03-26 22:33:31 · 769 阅读 · 2 评论 -
USB设备响应主机的枚举-复位
最近学习了USB2.0的一些知识,这里就当笔记,回顾记录一下,参考的资料是。原创 2024-03-04 23:01:30 · 852 阅读 · 1 评论 -
USB学习笔记
注意: NAK STALL NYET只有设备才可以返回,因为请求都是主机发送的 ,NYET握手包只有在高速设备输出事务中使用,表示设备的本次事务成功接收,但没有足够的缓冲区来接收下一次数据,主机在下一次输出数据的时候,先使用PING令牌包来询问一下是否有足够的接收缓冲区,防止带宽浪费。校验字段是类型字段的。原创 2024-03-03 01:13:36 · 834 阅读 · 0 评论 -
USB的初始化
首先注意在这里面定义了几个全局变量,都是很重要的第一个就是 EPindex 用来保存当前的端点号,指出当前传输完成的事务是针对哪个端点,对应我们上面USB_ISTR寄存器中的EP_ID[3:0],实际工作中我们会把其数据读出来放在EPindex中DEVICE_INFO,DEVICE_PROP,USB_STANDARD_REQUESTS 这三个结构体都在usb_core.h。原创 2024-03-03 20:07:51 · 1448 阅读 · 1 评论 -
USB设备响应主机的枚举中端点0的控制传输
最近学习了USB2.0的一些知识,这里就当笔记,回顾记录一下,参考的资料是。原创 2024-03-07 23:01:33 · 1091 阅读 · 1 评论 -
USB枚举过程中的各种获取描述符的标准请求
如果确实是获取状态请求,就紧接着判断是获取设备,接口还是端点状态。首先我们判断是不是设备,如果是的话,我们就应该返回“支持唤醒与供电模式与否”的状态数据,所以我们首先取出Current_Feature,这个变量在Joystick_Reset函数中已经设置为了配置描述符数据Joystick_ConfigDescriptor索引值为7的数据,他保存的恰好就是“设备是否支持远程唤醒与自供电模式”那个字节(bmAttributes字段),所以接下来根据Current_Feature来逐步设置数据,最后返回。原创 2024-03-14 00:16:34 · 1001 阅读 · 0 评论 -
USB的字符串描述符
如果设备没有字符串描述符 我们索引值必须为0,主机一般分成两个步骤获取字符串描述符,首先从设备获取索引值为0的Joystick_StringLangID这个数组,也就是获得设备支持的语种(可多个语种)然后再向设备其他索引值不为0的字符串描述符,并用选择的语种解析。第三个(bString)是指语种的语言标识符,上面的是0x0409 代表英语 0x0804代表中国,可以设置多个。设备描述符这里的1,2,3对应的是这数组里的1,2,3元素。分别是总的字节长度和描述符种类。1.表示语种的字符串描述符。原创 2024-03-16 23:57:56 · 516 阅读 · 0 评论 -
USB的设备描述符
第十三个字段(iserialNumber)表示设备序列号字符串描述的索引值,如果没有就是0,它可以区分多个相同设备,就是同一个USB系统连接了多个相同厂家生产的同一型号设备,这些设备的VID,PID,设备的版本号都是一样的,那该怎么区分,厂商会根据该iserialNumber字段中针对每一个产品设置不同的序列号即可,我们ST的官方例程也是这样做的,它根据单片机的唯一96位ID来设置iserialNumber字段。低速设备为8字节,全速可以为8,16,32,64字节,高速设备直接为64字节。原创 2024-03-17 00:02:05 · 1163 阅读 · 0 评论 -
USB配置描述符
我们的主机在枚举过程中会读取设备所支持的所有配置描述符,最后才发送命令来选择一个配置,如果我们选择的配置值与该字段值一样,说明该值对应的配置被激活。第七位 D6 表示USB设备的供电模式,1 就是自供电 它主要供电来源不是USB电源,而是单独配置了一个供电电源接口,0就不是自供电,就是可以USB供电,比如键盘,鼠标啥的。USB主机对于设备描述符的获取是有两次的,第一次只是获取如上图的8个字段,也就是前9个字节,这9个字节就是配置描述符信息(暂时还不包括接口与端点描述符的具体信息),下节讲接口和端点描述符。原创 2024-03-17 13:35:38 · 421 阅读 · 0 评论 -
USB接口与端点描述符
主机在第一次发送获取配置描述符的命令时,只会读取配置描述符的前九个字节,它包含了配置描述符以及所有从属的接口,端点(及其他特定类描述符)的总长度。获取其他长度不固定的描述符也是这样分成两步执行如果一个配置描述符不只支持一个接口描述符,并且每个接口描述符都有自己从属的端点描述符,那么我们USB设备在响应USB主机发送获取配置描述符命令时,第一个字段(bLength)表示接口描述符的长度,第二个字段(bDescriptorType)表示描述符类型 此处应该为0x04。原创 2024-03-17 19:24:18 · 784 阅读 · 0 评论 -
USB主机是如何获取设备描述符
当针对设备的时候,我们的wIndex必须为0,当针对设备的接口时候,wIndex字段就要给出对应的端口号,针对设备的端点时候wIndex就要给出相应的端点号,D6和D5都是种类,种类是针对于请求的,其值为0表示USB标准请求.为1就是特定类请求,比如HID设备就有获取报告描述符的请求,他是不属于标准请求的。在USB定义的八种标准请求的表中,bmRequestType,他是具体用途的细分,用来定义请求的性(含传输方向,类型,及接收方),具体如下图。举个例子,我们要获取设备描述符,需要发送的请求是啥呢?原创 2024-03-19 22:52:53 · 739 阅读 · 0 评论 -
HID描述符
键盘,鼠标就是HID设备,它们如果要将自己枚举成HID设备类,就必须要有对应的HID描述符,报告描述符,以及可选的实体描述符。设备描述符的第四个字段(bDeviceClass)就是表示USB设备所属的设备类,如果是0,那么我们就在接口描述符中进一步定义其具体功能为0x03,设置为HID设备。低五位就是表示用户需要用多大的力气才能影响相应的控制项,我们为0的时候就越容易,越大越难,高三位就是进一步修饰身体部位,左手,右手,左脚,右脚。获取特定类描述符的请求数据和之前的标准描述符有所不同,但是结构是一样的。原创 2024-03-20 23:09:44 · 1438 阅读 · 0 评论 -
USB的报告描述符(1)
如果我们的设备,将自己枚举成HID设备以后,那么我们的HID描述符是必不可少的,报告描述符也是必需的。报告描述符就是对传输数据的用途与格式的具体定义,他是拥有属于自己的一个格式定义。报告描述符是以标签的方式排列而成,长度不定,后面跟随的括号中为该标签携带的数据。下面是鼠标的报告描述符上述是报告描述符的伪代码,我们实际运行的代码还是编译后的二进制数据。我们可以使用USB-IF提供的HID描述符编辑工具(HID Descripor Tool)快速进行报告描述符的设计与转换。如下图,与上面是一样的。原创 2024-03-24 17:39:25 · 1505 阅读 · 0 评论