USB鼠标驱动详解.doc

上传人:桔**** 文档编号:563382556 上传时间:2023-10-26 格式:DOC 页数:9 大小:93KB
返回 下载 相关 举报
USB鼠标驱动详解.doc_第1页
第1页 / 共9页
USB鼠标驱动详解.doc_第2页
第2页 / 共9页
USB鼠标驱动详解.doc_第3页
第3页 / 共9页
USB鼠标驱动详解.doc_第4页
第4页 / 共9页
USB鼠标驱动详解.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《USB鼠标驱动详解.doc》由会员分享,可在线阅读,更多相关《USB鼠标驱动详解.doc(9页珍藏版)》请在金锄头文库上搜索。

1、一个 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_ge

2、neric_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的集合。设备是如何添加到设备链表上去的?在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。USB 设备驱动程序(usb device driver)是如何添加到驱动链表上去的?在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。接口是如何添加到设备链表上去的?在 USB 设备驱动程序和 USB 设备的匹配之后,USB core 会对设备进行配置,分析设备的结构

3、之后会将设备所有接口都添加到设备链表上去。比如鼠标设备中有一个接口,USB core 对鼠标设备配置后,会将这个接口添加到设备链表上去。USB 驱动程序(usb driver)是如何添加到驱动链表上去的?在每个 USB 驱动程序的被注册时,USB 驱动程序即会添加到驱动链表上去。比如鼠标驱动程序,usb_mouse_init 函数将通过 usb_register(&usb_mouse_driver) 将鼠标驱动程序注册到 USB core 中,然后就添加到驱动链表中去了。其中 usb_mouse_driver 是描述鼠标驱动程序的结构体。已配置状态(configured status)之后话当

4、鼠标的设备、接口都添加到设备链表,并且鼠标驱动程序也添加到驱动链表上去了,系统就进入一种叫做已配置(configured)的状态。要达到已配置状态,将经历复杂的过程,USB core 为 USB 设备奉献着无怨无悔。在这个过程中,系统将会建立起该设备的的设备、配置、接口、设置、端点的描述信息,它们分别被 usb_device、usb_configuration、usb_interface、usb_host_interface、 usb_host_endpoint 结构体描述。设备达到已配置状态后,首先当然就要进行 USB 驱动程序和相应接口的配对,对于鼠标设备来说则是鼠标驱动程序和鼠标中的接口

5、的配对。USB core 会调用 usb_device_match 函数,通过比较设备中的接口信息和 USB 驱动程序中的 id_table,来初步决定该 USB 驱动程序是不是跟相应接口相匹配。通过这一道关卡后,USB core 会认为这个设备应该由这个驱动程序负责。然而,仅仅这一步是不够的,接着,将会调用 USB 驱动程序中的 probe 函数对相应接口进行进一步检查。如果该驱动程序确实适合设备接口,对设备做一些初始化工作,分配 urb 准备数据传输。当鼠标设备在用户空间打开时,将提交 probe 函数构建的 urb 请求块,urb 将开始为传送数据而忙碌了。urb 请求块就像一个装东西的

6、“袋子”,USB 驱动程序把“空袋子”提交给 USB core,然后再交给主控制器,主控制器把数据放入这个“袋子”后再将装满数据的“袋子”通过 USB core 交还给 USB 驱动程序,这样一次数据传输就完成了。以下是完全注释后的鼠标驱动程序代码 usbmouse.c1. /*2. * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $3. *4. * Copyright (c) 1999-2001 Vojtech Pavlik5. *6. * USB HIDBP Mouse support7. */8. #include 9.

7、#include 10. #include 11. #include 12. #include 13. #include 14. /*15. * Version Information16. */17. #define DRIVER_VERSION v1.618. #define DRIVER_AUTHOR Vojtech Pavlik 19. #define DRIVER_DESC USB HID Boot Protocol mouse driver20. #define DRIVER_LICENSE GPL21. MODULE_AUTHOR(DRIVER_AUTHOR);22. MODUL

8、E_DESCRIPTION(DRIVER_DESC);23. MODULE_LICENSE(DRIVER_LICENSE);24. /*25. * 鼠标结构体,用于描述鼠标设备。26. */27. struct usb_mouse28. 29. /* 鼠标设备的名称,包括生产厂商、产品类别、产品等信息 */30. char name128;31. /* 设备节点名称 */32. char phys64;33. /* USB 鼠标是一种 USB 设备,需要内嵌一个 USB 设备结构体来描述其 USB 属性 */34. struct usb_device *usbdev;35. /* USB 鼠标

9、同时又是一种输入设备,需要内嵌一个输入设备结构体来描述其输入设备的属性 */36. struct input_dev *dev;37. /* URB 请求包结构体,用于传送数据 */38. struct urb *irq;39. /* 普通传输用的地址 */40. signed char *data;41. /* dma 传输用的地址 */42. dma_addr_t data_dma;43. ;44. /*45. * urb 回调函数,在完成提交 urb 后,urb 回调函数将被调用。46. * 此函数作为 usb_fill_int_urb 函数的形参,为构建的 urb 制定的回调函数。47

10、. */48. static void usb_mouse_irq(struct urb *urb)49. 50. /*51. * urb 中的 context 指针用于为 USB 驱动程序保存一些数据。比如在这个回调函数的形参没有传递在 probe52. * 中为 mouse 结构体分配的那块内存的地址指针,而又需要用到那块内存区域中的数据,context 指针则帮了53. * 大忙了!54. * 在填充 urb 时将 context 指针指向 mouse 结构体数据区,在这又创建一个局部 mouse 指针指向在 probe55. * 函数中为 mouse 申请的那块内存,那块内存保存着非常

11、重要数据。56. * 当 urb 通过 USB core 提交给 hc 之后,如果结果正常,mouse-data 指向的内存区域将保存着鼠标的按键57. * 和移动坐标信息,系统则依靠这些信息对鼠标的行为作出反应。58. * mouse 中内嵌的 dev 指针,指向 input_dev 所属于的内存区域。59. */60. struct usb_mouse *mouse = urb-context;61. signed char *data = mouse-data;62. struct input_dev *dev = mouse-dev;63. int status;64. /*65. *

12、 status 值为 0 表示 urb 成功返回,直接跳出循环把鼠标事件报告给输入子系统。66. * ECONNRESET 出错信息表示 urb 被 usb_unlink_urb 函数给 unlink 了,ENOENT 出错信息表示 urb 被67. * usb_kill_urb 函数给 kill 了。usb_kill_urb 表示彻底结束 urb 的生命周期,而 usb_unlink_urb 则68. * 是停止 urb,这个函数不等 urb 完全终止就会返回给回调函数。这在运行中断处理程序时或者等待某自旋锁69. * 时非常有用,在这两种情况下是不能睡眠的,而等待一个 urb 完全停止很可

13、能会出现睡眠的情况。70. * ESHUTDOWN 这种错误表示 USB 主控制器驱动程序发生了严重的错误,或者提交完 urb 的一瞬间设备被拔出。71. * 遇见除了以上三种错误以外的错误,将申请重传 urb。72. */73. switch (urb-status)74. 75. case 0: /* success */76. break;77. case -ECONNRESET: /* unlink */78. case -ENOENT:79. case -ESHUTDOWN:80. return;81. /* -EPIPE: should clear the halt */82. default: /* error */83. goto resubmit;84. 85. /*86. * 向输入子系统汇报鼠标事件情况,以便作出反应。87. * data 数组的第0个字节:bit 0、1、2、3、4分别代表左、右、中、SIDE、EXTRA键的按下情况;88. * data 数组的第1个字节:表示鼠标的水平位移;89. * data 数组的第2个字节:表示鼠标的垂直位移;90. * data 数组的第3个字节:REL_WHEEL位移。91. */92. input_report_key(dev, BTN_L

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号