USB驱动(mouse as key)

USB 驱动程序框架:
app:

-------------------------------------------

USB 设备驱动程序            // 知道数据含义

内核 --------------------------------------
USB 总线驱动程序            // 1. 识别,  2. 找到匹配的设备驱动,  3. 提供 USB
读写函数 (它不知道数据含义)
-------------------------------------------
            USB 主机控制器
            UHCI OHCI EHCI
硬件              -----------

                        USB 设备

****************************************************************************************************

USB 主机控制器三个规范

UHCI: intel,

OHCI: microsoft
EHCI:
低速(1.5Mbps)/全速(12Mbps)
低速/全速

高速(480Mbps)

*************************************************************************************************

1. 识别 USB 设备。
1.1 分配地址。
1.2 并告诉 USB 设备(set address)。
1.3 发出命令获取描述符。描述符的信息可以在 include\linux\usb\Ch9.h 看到。
2. 查找并安装对应的设备驱动程序
3. 提供 USB 读写函数

每一个 USB 主机控制器,都自带了一个 USB HUB,HUB 上再接“USB 设备”。可以认为"HUB"是一个特殊的"USB 设备"。

***************************************************************************************************


几类描述符中的内容

1设备描述符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

bcdUSB
-- USB 版本号
bDeviceClass
-- 类
bDeviceSubClass -- 子类
bDeviceProtocol -- 协议
bMaxPacketSize0 -- 端点 0 的最大包大小
每个设备通过端口 0 识别出 USB 设备。把这个地址或命令信息发给端点 0,从端点 0 里读
到那些描述符信息。
idVendor
-- 厂家 ID。
idProduct
-- 产品 ID。
bcdDevice
iManufacturer
iProduct
-- 厂家
iSerialNumber
bNumConfigurations -- 配置的个数。是说这个 USB 设备有多少种配置。有配置自然有

“配置描述符”

2配置描述符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

bLength :指这个“配置描述符”本身的长度。
bDescriptorType :类型。这里表示它是“配置描述符”。
wTotalLength :这个配置下所有其他信息的总长度。可以一次性全读出来。在配置下所有
“接口描述
符”、“端点描述符”所有东西的大小。
bNumInterfaces :接口的个数。有“接口描述符”。每个配置下面可能有多个“接口”。
bConfigurationValue
iConfiguration
bmAttributes :属性

bMaxPower :消耗的电源

3接口描述符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

bLength : 此接口描述符的长度
bDescriptorType :类型,这里表示它是“接口描述符”。
bInterfaceNumber
bAlternateSetting
bNumEndpoints :端点。表示设备下有多少个端点。
bInterfaceClass :接口类
bInterfaceSubClass :接口子类
bInterfaceProtocol :接口协议
iInterface :接口

bNumEndpoints :端点。USB 传输的对象是端点。

4端点描述符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

bEndpointAddress :端点地址。如,此设备是端点 1,还是端点 2 或 3 等,有个编号。
bmAttributes :表示是哪种类型的端点。输入 或 输出,是“实时端点”、“批量端点”或“中断端点”等。
就是说“传输的类型”是什么,在“端点描述符”中有记录。
wMaxPacketSize :最大包大小。在这个端点里面一次性最多可以给你多少数据(一次性读出多少数据)。
bInterval :查询有频繁。如鼠标里有数据,PC 机应尽快的从里面得到数据,里面的的传输类型是“中断传输端点”,但并没有主动通知 PC 机的能力的。但给它一个中断的名字而实质是用

“查询”方式来达到实时的查。查询有多频繁,有个“bInterval”

**********************************************************************************************************

当接上一个 USB 设备时,就会产生一个中断(hub_irq()),在中断里会分配一个编号地址(choose_address(udev))

再然后把这个地址告诉 USB 设备(hub_set_address())

接着发出各种命令获取 USB 设备的“设备描述符”(usb_get_device_descriptor())。

再然后注册一个 device(device_add())。这个被注册的 device 会被放到 USB 总线(usb_bus_type)的“设备链表”。并且会从总线(usb_bus_type)的“驱动链表”中取出"usb_driver" - USB 设备驱动结构,把 usb_interface 和 usb_driver 的 id_table 比较,若能匹配就去调用“usb_driver”结构中的“.probe”函数。

在“.probe”函数里做下面 4 件事情:
1,分配一个 input_dev 结构体。
2,设置,使其能产生按键类事件。
3,注册这个 input_dev 结构。
4,硬件相关操作:
之前的“按键”驱动程序,是注册某中断,在按键的中断里面读那些引脚,确定是按下还是松开,确定按键值。
触摸屏驱动程序里,是设置 ADC 控制器等。
现在 USB 鼠标里,是使用 USB 总线驱动程序提供的读写函数要收发数据。

所以,写 USB 设备驱动程序与以前的以前的驱动程序的差别就是 硬件的操作不一样了。

怎么写 USB 设备驱动程序?
1. 分配/设置 usb_driver 结构体.id_table :表示能支持的设备
.probe :表示“USB 总线驱动程序”发现一个新设备后,就会与 driver 比较,若 id_table 表示能支持它,就调用.probe 函数。

.disconnect :拔掉 USB 设备时调用这个函数。

根据“usb_bus_type”总线驱动设备驱动模型,里面有个“.match”函数,左边是由
“USB 总线驱动程序”帮我们来发现这个新“USB 设备”,会注册"usb_new_device()"一个
"USB 设备",并且从右边“driver”链表里找了一个个 USB 驱动程序和左边注册进来的
“USB 设备”比较.所谓的比较,是“usb_bus_type”中的“.match”函数,把左边
“usb_interface”结构中的“接口”与右边“usb_driver”结构中的“id_table”比较。
若能吻合,则调用“usb_driver”中的“.probe”函数。“usb_bus_type”提供了这套机
制。
在“.probe”函数中,可以只是打印,也可以注册字符设备,或注册“input_dev”结
构。完全由自已确定。
以前的驱动程序,数据是从“中断”(按键中断,ADC 中断)里面读寄存器得到。现在
“USB 设备驱动程序”中的数据从“USB 总线”来,是 USB 总线驱动程序提供的函数(读写
等)发起 USB 传输,从 USB 传输里得到那些数据。(数据传输三要素:源,目的,长度。
再构造一个“usb_urb = usb_alloc_urb(0,GFP_KERNEL)”后,接接着把“源,目的,长
度”填充到“usb_urb”中,使用就是提交"usb_urb",提交 usb_sunmit_urb 函数是 USB 总
线驱动程序提供的)。
当“USB 主机控制器”接收到数据后,“usb_as_key_irq”函数(complete_fn 完成函数)
被调用。在这个函数里根据"USB 设备"数据的含义去上报(input_event())











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值