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初始化的时候传递进来的回调函数,鼠标发生动作时便会触及这个函数的调用,把鼠标的数据传递进来。

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

总代码附录

时间: 2024-11-10 12:08:22

USB鼠标设备简单驱动设计的相关文章

Linux嵌入式简单驱动设计

1.环境搭建 vmware+Fedora 2.创建一个Hello文件 mkdir Hello 3.在Hello里面创建 hello.c 和 Makefile 两个文本文件 (1):创建hello.c vim hello.c hello.c: #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) {

linux设备驱动归纳总结(九):1.platform总线的设备和驱动【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-111745.html linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 这一节可以理解是第八章的延伸,从这节开始介绍platform设备驱动. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

20150409 IMX257 USB鼠标驱动程序编写

20150409 IMX257 USB鼠标驱动程序编写 2015-03-14 Lover雪儿 USB驱动程序包括为USB总线驱动程序以及USB设备驱动程序. USB总线驱动程序的功能是: 1.识别 2.找到匹配的设备驱动程序 3.提供USB读写函数(不知道数据的含义) USB设备驱动程序功能是: 分析USB的数据,上报相应的事件 今天,我们来实现一个USB鼠标的设备驱动程序,让鼠标的左键模拟为键盘的L键,鼠标的右键模拟为键盘的S键,鼠标的中键模拟为键盘的ENTER键,接下来我们先来实现一个简单程

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁.在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作. 设备驱动程序是内核的一部分,主要完成以下功能:对设备的初始化和释放:把数据从内核传送到硬件设备和从硬件设备读取数据:读取应用程序数据传送给设备文件和回送应用程序请求的数据:检测和处理硬件设备出现的错误. 一. Linux USB子系统分析 在Linux系统中,USB主机驱动程序由3部分组成:US

USB的固件和驱动的最简单用法

1.利用Cypress提供的USB通用驱动程序CyUSB.sys and CyUSB.inf,是稳妥的做法,因为驱动程序的编程比较繁琐,可尽力规避.可简单修改sys文件名.inf文件中的ID码.inf文件中出现的sys文件的文件名: 2.在一个EZUSB固件工程中,一般只需要修改两个文件:Periph.c(用户调度函数,不同工程取名不同,如官方例程中的BulkLoop.c), DSCR.A51(USB描述符列表,通常是汇编语言编写的,读起来简单直接): 3.实际固件编程中一般只需要修改fw.c中

学习Linux下s3c2440的USB鼠标驱动笔记

USB驱动学习笔记: 2 1.ARM-Linux下USB驱动程序开发 3 1.1.1.linux下USB配置: 4 *********(MassStorage:存储设备)************************************ 5 -> Device Drivers 6 -> SCSI device support(通用设备) 7 -> SCSI disk support (磁盘支持) 8 -> SCSI device support(设备支持) 9 10 ->

Linux USB 驱动开发—— USB 鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c.鼠标驱动可分为几个部分:驱动加载部分.probe部分.open部分.urb回调函数处理部分. 一.驱动加载部分 static int __init usb_mouse_init(void) { int retval = usb_register(&usb_mouse_driver);//注册鼠标驱动 if (retval == 0) info(DRIVER_VERSION ":" DRIVER_DE

Linux USB 驱动开发实例(二)—— USB 鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c.鼠标驱动可分为几个部分:驱动加载部分.probe部分.open部分.urb回调函数处理部分. 一.驱动加载部分 [cpp] view plain copy static int __init usb_mouse_init(void) { int retval = usb_register(&usb_mouse_driver);//注册鼠标驱动 if (retval == 0) info(DRIVER_VERSION 

Linux USB 鼠标输入驱动详解

平台:mini2440 内核:linux 2.6.32.2 USB设备插入时,内核会读取设备信息,接着就把id_table里的信息与读取到的信息做比较,看是否匹配,如果匹配,就调用probe函数.USB设备拔出时会调用disconnect函数.URB在USB设备驱动程序中用来描述与USB设备通信时用到的基本载体和核心数据结构. URB(usb request block)处理流程: ①USB设备驱动程序创建并初始化一个访问特定USB设备特定端点的urb并提交给USB core. ②USB cor