USB鼠标设备简单驱动设计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USB鼠标设备简单驱动设计相关的知识,希望对你有一定的参考价值。

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

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

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

技术分享                    技术分享

这里我学习的是第一种

 对于每个USB系统来说,都有主机控制器的设备,该控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。每条USB总线上最多可以接127个设备。

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

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

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

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


设备基础

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

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

技术分享

       每个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结构体

技术分享


2 把struct usb_driver 注册到usb核心

技术分享

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

技术分享


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

技术分享

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


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

技术分享

因为上传提示有不安全的代码(估计误报技术分享),不得已代码采用截图模式,请各位大大谅解技术分享

总代码附录 

技术分享

技术分享技术分享技术分享

技术分享

技术分享








本文出自 “任性有了,就差钱了” 博客,请务必保留此出处http://13095698.blog.51cto.com/13085698/1945592

以上是关于USB鼠标设备简单驱动设计的主要内容,如果未能解决你的问题,请参考以下文章

[国嵌攻略][164][USB驱动程序设计]

usb的驱动应该怎么写?

第四季-专题21-USB驱动程序设计

USB驱动之Android usb鼠标驱动

请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?

USB鼠标按键驱动