返回> 网站首页
USBHID - android
yoours2024-02-07 16:00:10
简介一边听听音乐,一边写写文章。
一、USB的四种传输方式
1 控制传输(Control Transfer)
作用:USB系统软件用来主要进行查询配置和给USB设备发送通用的命令。
特点:控制传输是双向传输,数据量通常较小;数据传送是无损性的。数据宽度:控制传输方式有8、16、32、64字节的数据。典型应用:在主计算机和USB外设之间的端点0(EP0)之间的传输。后面安卓使用的控制传输也是用到端点0。
2 批量传输(Bulk Transfer)
作用:在需要大量数据传输和接受数据上同时又没有带宽和间隔时间要求的情况下得以应用。
特点:要求保证传输,适合传输非常慢和大量被延迟的传输,可以等所有其它类型的数据传输完成后再传输和接收数据。打印机和扫描仪就是属于这种传输类型的设备。
3 中断传输(Interrupt Transfer)
作用:主要用于定时查询设备是否有中断数据要传输。
特点:设备的端点模式器的结构决定了它查询频率从1到255ms之间。这种传输方式是单向的,对于host来说只有输入模式。鼠标就是属于这种传输类型的设备,我拿来测试的硬件设备就是被定义成一个鼠标。
4 同步传输(Isochronous Transfer)
作用:用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传输率的即时应用中。
特点:保证传输的同步性,保证每秒都有固定的传输量。要注意的是同步传输允许有一定的误码率。典型应用是执行即时通话的网络电话。
二、USB请求格式
controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
1. requestType:请求特性
D7-数据传输的方向。0:host->device,1:device->host;
D6至D5-请求类型。0:标准请求,1:类请求,2:厂商自定义请求,3:保留;
D4至D0-请求对象。0:设备,1:接口,2:端点。
因此,如果是HID的设备类请求,只有10100001和00100001两种。
2. bRequest:定义请求类型
USB设备的标准请求有以下几种:
GET_DESCRIPTOR:在枚举过程中用得最多的一个请求,主机通过该请求来读取设备的各种描述符。
SET_ADDRESS:主机用来请求设备使用指定地址。
SET_CONFIGURATION:主机用来设置当前配置值。
GET_CONFIGURATION:主机用来获取当前配置值。
CLEAR_FEATURE:用来清除一个指定的特性(例如Device的Power由谁提供,是否支持wakeup)。
SET_FEATURE:用来设置或使一个特性生效。
GET_STATUS:返回所指接收者的状态。
3. mValue:这个参数占两个字节,高字节和低字节分别代表不同的含义。
高字节说明描述符的类型:
0x21:HID描述符
0x22:报告描述符
0x23:物理描述符
低字节不为0时被用来选定物理描述符。
这个在HID通信使用SET_REPORT和GET_REPORT请求时高字节表示报告类型:0x01—input(输入报告)、0x02—output(输出报告)、0x03—feature(特征报告)、Other—reserve,低字节代表Report ID(报告ID)。对于报告ID,在安卓开发里面,我们要知道是在使用这两个请求进行控制传输时必须要知道的(如果使用特征报告的话)。但是要注意的是这个位置的参数高位和低位是反过来的,比如在电脑上使用0x0203可以实现通信,但是在安卓这边不行,得反过来,改成0x0302。
4. wIndex:这个参数也占两个字节,根据不同的请求会有不同的意义。
这是接口号,当设备在电脑上传输的话,选的接口号设备中没有的话会一步一步向接口0去寻找,也就是说我在电脑上选择接口3进行数据传输,但是设备中没定义有接口3,然后就会自动去找接口2,接口2没有就找接口1,直到找到接口0进行传输,但是安卓中是不会自动去寻找的。
⑤wLength:代表数据长度。
三、HID类设备
HID类设备属于人机交互操作的设备,将设备枚举成HID设备可以不用开发驱动程序,用操作系统自带的HID类驱动程序即可完成通信。
1. HID类请求
HID协议定义了6个HID类的特定请求:
0x01:GET_REPORT-主机用控制传输从设备接收数据,所有HID设备都要支持这个请求。
0x02:GET_IDLE-主机读取设备当前的空闲速率,设备可以不支持此请求。
0x03:GET_PROTOCOL-仅仅适应于支持启动功能的HID设备(Boot Device)。
0x09:SET_REPORT-设备用控制传输接收主机的数据,设备可以不支持此请求。
0x0A:SET_IDLE-设置闲置状态,设备可不支持此请求。
0x0B:SET_PROTOCOL-仅仅适应于支持启动功能的HID设备(Boot Device)。
六种请求类型的参数设置,并通过SET_REPORT和GET_REPORT实现与HID设备通信。