Linux中USB鼠标驱动详解(讲解内核自带源码)

本文详细介绍了Linux系统中USB鼠标驱动的工作原理,包括USB设备链表、驱动链表的构成,以及USB设备驱动程序和USB驱动程序的区别。当设备插入系统后,USB core会将设备注册并添加到设备链表,驱动程序注册到驱动链表。文章通过USB鼠标驱动程序的实例,解释了设备如何配置,如何匹配接口,以及驱动程序如何与接口配对和数据传输的过程。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

USB 总线引出两个重要的链表!

一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)。

USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)的区别是什么?


USB 设备驱动程序包含 USB 设备的一些通用特性,将与所有 USB 设备相匹配。在 USB core 定义了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的集合。

设备是如何添加到设备链表上去的?
在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。

USB 设备驱动程序(usb device driver)是如何添加到驱动链表上去的?
在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。

接口是如何添加到设备链表上去的?
在 USB 设备驱动程序和 USB 设备的匹配之后,USB core 会对设备进行配置,分析设备的结构之后会将设备所有接口都添加到设备链表上去。比如鼠标设备中有一个接口,USB core 对鼠标设备配置后,会将这个接口添加到设备链表上去。

USB 驱动程序(usb driver)是如何添加到驱动链表上去的?
在每个 USB 驱动程序的被注册时,USB 驱动程序即会添加到驱动链表上去。 比如鼠标驱动程序,usb_mouse_init 函数将通过 usb_register(&usb_mouse_driver) 将鼠标驱动程序注册到 USB core 中,然后就添加到驱动链表中去了。其中 usb_mouse_driver 是描述鼠标驱动程序的结构体。

已配置状态(configured status)之后话
当鼠标的设备、接口都添加到设备链表,并且鼠标驱动程序也添加到驱动链表上去了, 系统就进入一种叫做已配置(configured)的状态。 要达到已配置状态,将经历复杂的过程,USB core 为 USB 设备奉献着无怨无悔。在这个过程中,系统将会建立起该设备的的设备、配置、接口、设置、端点的描述信息,它们分别被 usb_device、usb_configuration、usb_interface、usb_host_interface、 usb_host_endpoint 结构体描述。
设备达到已配置状态后,首先当然就要进行 USB 驱动程序和相应接口的配对,对于鼠标设备来说则是鼠标驱动程序和鼠标中的接口的配对。USB core 会调用usb_bus 总线的usb_device_match 函数,通过比较设备中的接口信息和 USB 驱动程序中的 id_table,来初步决定该 USB 驱动程序是不是跟相应接口相匹配。通过这一道关卡后,USB core 会认为这个设备应该由这个驱动程序负责。
然而,仅仅这一步是不够的,接着,将会调用 USB 驱动程序中的 probe 函数对相应接口进行进一步检查。如果该驱动程序确实适合设备接口,对设备做一些初始化工作,分配 urb 准备数据传输。
当 鼠标设备在用户空间打开时, 将提交 probe 函数构建的 urb 请求块,urb 将开始为传送数据而忙碌了。urb 请求块就像一个装东西的“袋子”,USB 驱动程序把“空袋子”提交给 USB core,然后再交给主控制器,主控制器把数据放入这个“袋子”后再将装满数据的“袋子”通过 USB core 交还给 USB 驱动程序,这样一次数据传输就完成了。

  

以下是完全注释后的鼠标驱动程序代码 usbmouse.c

view plaincopy to clipboardprint?
/*  
 * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $  
 *  
 *  Copyright (c) 1999-2001 Vojtech Pavlik 



 *  
 *  USB HIDBP Mouse support  
 */  
  
#include     
#include     
#include     
#include     
#include     
#include     
  
/*  
 * Version Information  
 */  
#define DRIVER_VERSION "v1.6"    
#define DRIVER_AUTHOR "Vojtech Pavlik "    
#define DRIVER_DESC "USB HID Boot Protocol mouse driver"    
#define DRIVER_LICENSE "GPL"    
  
MODULE_AUTHOR(DRIVER_AUTHOR);   
MODULE_DESCRIPTION(DRIVER_DESC);   
MODULE_LICENSE(DRIVER_LICENSE);   
  
/*  
 * 鼠标结构体,用于描述鼠标设备。  
 */  
struct usb_mouse    
{   
    /* 鼠标设备的名称,包括生产厂商、产品类别、产品等信息 */  
    char name[128];    
    /* 设备节点名称 */  
    char phys[64];     
    /* USB 鼠标是一种 USB 设备,需要内嵌一个 USB 设备结构体来描述其 USB 属性 */  
    struct usb_device *usbdev;  
    /* USB 鼠标同时又是一种输入设备,需要内嵌一个输入设备结构体来描述其输入设备的属性 */  
    struct input_dev *dev;    
    /* URB 请求包结构体,用于传送数据 */  
    struct urb *irq;   
    /* 普通传输用的地址 */  
    signed char *data;  
    /* dma 传输用的地址 */  
    dma_addr_t data_dma;           
};   
  
/*  
 * urb 回调函数,在完成提交 urb 后,urb 回调函数将被调用。  
 * 此函数作为 usb_fill_int_urb 函数的形参,为构建的 urb 制定的回调函数。  
 */  
static void usb_mouse_irq(struct urb *urb)   
{   
    /*  
     * urb 中的 context 指针用于为 USB 驱动程序保存一些数据。比如在这个回调函数的形参没有传递在 probe中为 mouse 结构体分配的那块内存的地址指针,而又需要用到那块内存区域中的数据,context 指针则帮了大忙了! 
     * 在填充 urb 时将 context
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值