USB鼠标设备简单驱动设计

       USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的链接和通信。是在1994年末由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,成为当今我的电脑和大量智能设备的必配接口之一。linux

linux内核支持两种类型的USB驱动程序,一种是PC机的USB驱动程序控制插入其中的USB设备,另外一种是USB设备和主机通讯。安全

            第一种软件架构                                                          第二种软件架构  架构

wKioL1lgg7SB_UVIAABL3XhuOJI947.png                    wKiom1lgg_Kil9BLAABNC-k-e0E455.png

这里我学习的是第一种app

 对于每一个USB系统来讲,都有主机控制器的设备,该控制器和一个根Hub做为一个总体。这个根Hub下能够接多级的Hub,每一个子Hub又能够接子Hub。每一个USB设备做为一个节点接在不一样级别的Hub上。每条USB总线上最多能够接127个设备。异步

       常见的USB主控制器规格有:ide

OHCI:主要是非PC系统上的USB芯片,应用于嵌入式系统,遵循USB1.1规范函数

UHCI:大可能是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。学习

EHCI是由Intel等几个厂商研发,兼容OHCI UHCI ,遵循USB2.0规范。spa


设备基础设计

        USB设备种类繁多,但遵循一些规范。接入电脑,USB总线驱动程序会发出命令获取设备信息(描述符),USB设备会返回描述符给PC,USB设备有5中描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。一个USB设备只有一个设备描述符。

       在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备一般有一个或多个配置,配置一般有一个或多个接口,接口有零或多个端点。

wKioL1lgiEHQUgH5AADFayMTdXI891.png

       每一个USB设备均可以包含一个或多个配置,不一样的配置使设备表现不一样的功能组合,配置由多个接口组成。一个USB设备驱动程序对应一个USB接口,一个功能复杂的USB设备能够具备多个接口,USB设备中的惟一可寻址的部分是设备端点,端点的做用相似于寄存器.


urb

    Linux内核中USB代码经过urb(USB请求块)和USB设备通讯,以异步方式往USB设备的 特定USB端点发送/接收数据,每一个端点均可以处理一个urb。

urb生命周期

1. USB 设备驱动程序建立并初始化一个访问特定端点的urb,并提交给USB 核心;

2. USB 核心提交该urb到USB主控制器驱动程序;

3. USB 主控制器驱动程序根据该urb描述的信息,来访问USB设备;

4. 当设备访问结束后,USB 主控制器驱动程序通知USB 设备驱动程序。


HID协议

HID(Human Interface Device),属于人机交互类的设备,如USB鼠标,USB键盘,USB游戏操纵杆等。该类设备必须遵循HID设计规范


USB驱动程序步骤

1 usb驱动使用的是USB总线模式,全部usb驱动都必须建立主要结构体struct usb_driver结构体

wKioL1lhg8nCpVByAAAnZuQBteE464.png


2 把struct usb_driver 注册到usb核心

wKiom1lhhADwfGTsAAAWaGKPeEs532.png

4 分配一块缓冲池存放数据

wKiom1lhhEvSb80bAAA0ooUZTu8881.png


5分配、设置、初始化、提交一个urb,urb是用来传递USB主机控制器驱动的数据。当插入的设备和这个usb_driver匹配时,它的probe函数将会调用,咱们在probe函数当中实现对urb的一些列操做.

wKioL1lhhHfReIx6AABIrpvWN8c645.png

USB端点有4中类型:控制端点,中断端点,批量端点,等时端点,对应相应urb。其中等时urb没有初始化函数


6 usb鼠标获取数据的中断处理函数,这个函数是在urb初始化的时候传递进来的回调函数,鼠标发生动做时便会触及这个函数的调用,把鼠标的数据传递进来。

wKiom1lhhLTiQ_DeAABPdldvdVE587.png

由于上传提示有不安全的代码(估计误报j_0064.gif),不得已代码采用截图模式,请各位大大谅解j_0059.gif

总代码附录 

wKioL1lhhYzRgSijAACNG28_Sbs149.png

wKiom1lhhfzzUNmrAAB-IU5v5gs949.pngwKioL1lhhibDiQQeAACOsz3r_ig666.pngwKioL1lhhlST9ZbYAACdobk4UcU719.png

wKiom1lhhqWx_RdNAAB4FObdzcY386.png

wKiom1lhhuWB7ZYYAAAw2EtayQg599.png

相关文章
相关标签/搜索