(基于 Linux 3.4.2 内核)

可分为以下几个步骤来完成这个驱动:

  1. 1. 分配设置一个 usb_driver 结构体
  2. 2. 注册这个 usb_driver
  3. (如果设备的 id_table 与驱动匹配的话会调用驱动程序的 probe 函数)
  4. 3. probe 函数中分配 urb
  5. 4. 配置 urb
  6. 5. 调用 usb_submit_urb 启用 urb
  7. 6. urb 中断函数内处理状态
  8. 7. 重新提交 urb

usb_driver 的配置与注册

  1. /* 驱动的 id_table */
  2. static struct usb_device_id usb_mouse_id_table [] = {
  3. { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
  4. USB_INTERFACE_PROTOCOL_MOUSE) },
  5. { }
  6. };
  7. /* 分配设置 usb_driver */
  8. static struct usb_driver mouse_monitor = {
  9. .name = "MouseMonitor",
  10. .probe = mouse_monitor_probe,
  11. .disconnect = mouse_monitor_disconnect,
  12. .id_table = usb_mouse_id_table,
  13. };
  14. /* 注册 usb_driver */
  15. static int mouse_monitor_init(void)
  16. {
  17. usb_register(&mouse_monitor);
  18. return 0;
  19. }

probe 函数

  1. static int mouse_monitor_probe(struct usb_interface *intf, const struct usb_device_id *id)
  2. {
  3. struct usb_host_interface *interface;
  4. struct usb_endpoint_descriptor *endpoint;
  5. static struct usb_device *dev;
  6. dma_addr_t usb_buf_phy;
  7. int pipe;
  8. int buffer_length;
  9. /* 得到 usb_device */
  10. dev = interface_to_usbdev(intf);
  11. /* 得到当前的接口描述符与端点描述符 */
  12. interface = intf->cur_altsetting;
  13. endpoint = &interface->endpoint[0].desc;
  14. /* 获取到设备数据长度 */
  15. buffer_length = __le16_to_cpu(endpoint->wMaxPacketSize);
  16. len = buffer_length;
  17. /* 获取到通信的管道 */
  18. pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
  19. /* 分配一段连贯的内存 */
  20. usb_buf = usb_alloc_coherent(dev, buffer_length, GFP_ATOMIC, &usb_buf_phy);
  21. /* 分配 urb */
  22. MouseUrb = usb_alloc_urb(0, GFP_KERNEL);
  23. /* 配置 urb */
  24. usb_fill_int_urb(MouseUrb, dev, pipe, usb_buf, (buffer_length > 8 ? 8 : buffer_length), usb_complete, NULL, endpoint->bInterval);
  25. MouseUrb->transfer_dma = usb_buf_phy;
  26. MouseUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  27. /* 提交调用 urb */
  28. usb_submit_urb(MouseUrb, GFP_KERNEL);
  29. return 0;
  30. }

urb 传输完成函数

  1. static void usb_complete(struct urb *urb)
  2. {
  3. static unsigned char presta;
  4. #if 0
  5. int i;
  6. for (i = 0; i < len; i++)
  7. printk("%02x ", usb_buf[i]);
  8. printk("\n");
  9. #endif
  10. if(presta != (usb_buf[1] & 0x01)){
  11. if(presta)
  12. printk("BTN_LEFT is released. \n");
  13. else
  14. printk("BTN_LEFT is pressed. \n");
  15. }
  16. /* 保存状态 */
  17. presta = usb_buf[1] & 0x01;
  18. /* 重新提交 urb */
  19. usb_submit_urb(MouseUrb, GFP_KERNEL);
  20. }

usb_complete 函数中注释掉的程序为测试使用,通过输出的数据找到鼠标左键对应的 usb_buf 与 bit 位。

测试驱动

  1. make menuconfig 去掉原来的 USB 鼠标驱动
  2. -> Device Drivers
  3. -> HID Devices
  4. <> USB Human Interface Device (full HID) support

编译当前驱动,传入开发板并安装。

按下松开鼠标左键,现象如下:

USB 驱动(监测鼠标左键的动作)的更多相关文章

  1. Swing中如何比较好的判断鼠标左键双击

    import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im ...

  2. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  3. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  4. 【转】 js怎么区分出点击的是鼠标左键还是右键?

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0  默认.没有按任何按钮. events. ...

  5. [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】

    eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...

  6. JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...

  7. win10 uwp 获取按钮鼠标左键按下

    我们可以使用PointerPressed获得鼠标右键按下,但是我们如何获得左键? 其实UWP已经没有MouseLeftButtonDown,于是我们可以使用一个简单方法去获取鼠标左键按下. 我们在xa ...

  8. delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件

    在Delphi代码编辑器中使用Ctrl+鼠标左键可跳转到鼠标下的类所在的定义处,但今天发现一个奇怪的问题,EhLib组件的类无法跳转(包括uses中的pas文件),重新安装也是如此,后来经过验证,发现 ...

  9. unity windowEditor平台下鼠标左键控制摄像机的视角

    工作的原因,今天就只写了unity下的鼠标左键控制摄像机的视角左右上下调节:明天,补齐.[有诸多参考,着实是需要多多加油的] using System.Collections; using Syste ...

随机推荐

  1. Alpha 冲刺 (5/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  2. linux分区划分

  3. wind量化交易

    https://www.joinquant.com/study?f=home&m=memu https://www.v2ex.com/member/mushroomqiu https://sa ...

  4. input标签之外是否一定添加form标签

    原文转载自:https://blog.csdn.net/lamanchas/article/details/78753031 input标签外是否添加form标签需要按情形区分:应用场景的区别:1.所 ...

  5. JavaWeb核心之Servlet

    servlet规范:包含三个技术点 1)servlet技术 2)filter技术---过滤器 3)listener技术---监听器 Servlet快速入门 实现步骤: 1)创建类实现Servlet接口 ...

  6. issue:ssh自动断开

    使用ssh连接云服务器的时候,几分钟不操作terminal就会卡住,实际上ssh连接已经断开了,感觉很不爽.(可能云服务器供应商在系统中做了设置) 解决办法: step1:vim /etc/ssh/s ...

  7. Android 框架式编程 —— 起篇

    一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...

  8. Maven 的安装与配置

    最近公司需要新起一个项目,想使用maven+springmvc+spring+mybatis+mysql实现,以前我们的项目都是传统的老项目,没用过maven,Eclipse版本是GALILEO的,有 ...

  9. location-alias

    location /images/ { alias /project/pic/; } 给定的路径对应于location的"/url" 这个URL; /images/f.jpg -- ...

  10. 学生成绩管理系统(C++指针、链表、文件及面向对象的运用)

    学生成绩管理系统 功能页面显示:    实现源码: #include<iostream> #include<fstream> #include<cstring> # ...