导航

鼠标

USB的断开与连接:

  Set Mode命令,“软连接控制位”控制USB的断开和连接

 

中断的处理:

  2.中断处理:

 

  3.中断标志如何清除?

  

 

 

 

读取端点0输出的数据:

  1.读端点最后传输状态。判断获取的数据是不是建立包

  2.读出数据,之后清除数据缓冲区。要是接收到setup包,在清除数据缓冲区之前,要ack。清除数据缓冲区之前,必须确保已经选中的端点是待清除的端点

  为什么输入端点0和输出端点0都要都要ackknowledge指令呢,这是一直困惑我的一个问题,但是我再看一遍书我就明白了。要想明白这个问题,首先要清楚ackknowledge指令是干什么的?书上写的很清楚,使clear buffer或valid buffer有效,没错,就是这样,其余的功能并没有说。clear buffer针对输出端点0,valid buffer针对输入端点0,因此ackknowledge同时作用于输入端点0和输出端点0就合理了。

  3.从端点0获取的setup包数据,就是USB协议的标准请求。

 

标准请求:

 

 

 

 

 

描述符的返回:

  流程:如果要求的长度WL比描述符里规范的长度DL大,那么只返回DL长度,同时若DL长度是端点最大包长PL的整数倍,则将发送0长度的状态包的标志置位(为什么不是整数倍时候不用呢,因为最后一次发的长度不足以一个包长,主机就知道这次就发送完事了)。如果要求的长度WL比描述符里规范的长度DL小,那么就返回WL长度。(此段确定发送长度

     发送到端点0输入缓存的函数说明:若发送的长度比包长大,则就发送包长的数据长度,但是数据指针和发送字长都变化,以便下次接着发送;反之,分两种情况:发送长度不为0则继续发送,然后发送长度归0;发送长度为0和发送0长度的标志位为1,则发送一个零长度包确认已经发完了。(此段确定发送细节

  注意:如果端点包长不足,主机第二次获取设备描述符一次获取不完整,那么就会触发端点0的输入中断请求,在处理这个请求的程序中接着发送就可以了。那么第一次获取设备描述符本身就可以获取不完整啊,那这样不是出错了吗,其实在第二次setup之前,端点0的输入缓冲是无效的。

 

设置地址请求的处理:

  主机分配给设备一个唯一的设备地址,设备收到设置地址的请求之后,设置好地址,然后返回一个状态包,设备就拥有了这个唯一的设备地址。

  对于D12芯片来讲,接收到设置地址的请求之后,将设备地址设置成发来的地址,然后返回一个0长度的状态包

 

配置集合的实现和返回:

   需要注意的是发送的长度是整个配置集合的长度,该长度是个4字节的数据,赋值的时候需要注意。

 

字符串和语言ID请求的实现:

  在USB协议里,字符串描述符是可有可无的。字符串索引值为非0的时候就表示具有字符串描述符,注意这里的索引值不能重复。

  例如设备描述符里申请了三个字符串描述符:厂商字符串,产品字符串,产品序列号。

  主机通过获取字符串描述符的请求和索引值来获取对应的字符串,索引值为0表示获取语言ID(2个字节,用来描述设备支持的语种)。这里语言ID号用美式英语的0x0409。字符串描述符用unicode编码。  

 

设置配置的实现:

  设置配置是一个使能端点的输出请求,因此得此请求后根据配置值使能端点。然后返回一个状态包。

  设置配置完成后收到一个类包set idle用来告诉设备在没有新的事件发生前,不要传输数据。返回一个状态包就行。

 

报告描述符的结构和实现:

  HID设备通过报告来传输数据,分为输入报告和输出报告。输入报告是USB发送给主机,例如鼠标把左右键滚轮信息发送给主机;输出报告是主机发送给USB,例如键盘上灯光的控制。

  输入报告通常通过中断端点返回,输出报告优先选择中断端点发送,如果没有的话,也可以通过端点0发送。

  报告描述符的作用:通过报告描述符,主机就可以分析出报告里面的数据所表示的意义。也是通过端点0返回,这个请求是发送到接口的。一个报告描述符可以描述多个报告,通过报告ID来区分,报告描述符如果没有规定报告ID,报告里没有ID字段。

  报告描述符的设计方法USB官网HID描述符生成工具、现成的报告描述符(HID协议及用途表)。

  到此之后,整个枚举过程完毕,接下来主机会一直查询端点1,得到报告。

  此时,设备管理器会出现什么情况呢?人体输入学设备和鼠标指针设备都会多出东西。双击人体输入学设备,位置那一栏显示(位置0《圈圈教你学USB》之鼠标)这就是产品字符串,详细栏选择显示设备范例ID则会显示厂商ID、产品ID和序列号,选择显示硬件ID就会显示厂商ID、产品ID和版本号。

  

 

 

报告的返回:

  1.报告只有在端点使能(非0配置)才能返回,通过中断端点进行返回,因此设置了变量判断是否是非0配置。

  2.发送到端点1报告之前,要检查端点1是否忙,设置一个状态变量,复位状态下为闲置,写到端点缓冲区数据就设置为忙,中断端点处理的时候设置为闲置。

  3.根据按键返回报告。

  4.至此,一个USB鼠标基本完成。但是还有很多请求没有处理,最重要的是没有对接收者进行判断,其他的请求很少用到,返回一个状态包就行了。

 

BUS HOUND工具:  

   

 

 

  

posted on 2017-09-07 20:29  刘梢  阅读(328)  评论(0编辑  收藏  举报