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 core把这个urb提交到USB主控制器驱动程序。
③USB主控制器驱动程序依据该urb描写叙述的信息来訪问usb设备。
④当设备訪问结束后,USB主控制器驱动程序通知USB设备驱动程序。
USB鼠标数据格式:
①bit0 ->左键,1->按下。0->松开
②bit1 ->右键,1->按下。0->松开
③bit2 ->中键,1->按下,0->松开
驱动代码清单:
usb_mouse_input_test.c:
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/usb/input.h>
#include <linux/hid.h> static struct urb *uk_urb;
static char *usb_buf;
static int len;
static struct input_dev *uk_dev;
static dma_addr_t usb_buf_phys; static struct usb_device_id usb_mouse_input_test_id_table [] =
{
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID,
USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE)
}
}; static void usb_mouse_input_test_irq(struct urb *urb)
{
static unsigned char pre_val;//USB鼠标将它的数据写到驱动缓冲区usb_buf
if ((pre_val & (1<<0)) != (usb_buf[0] & (1<<0)))
{
//状态变化
printk("left !\n");
} if ((pre_val & (1<<1)) != (usb_buf[0] & (1<<1)))
{
//状态变化
printk("right !\n");
} if ((pre_val & (1<<2)) != (usb_buf[0] & (1<<2)))
{
//状态变化
printk("middle !\n");
} pre_val = usb_buf[0];
usb_submit_urb(uk_urb, GFP_KERNEL);
} static int usb_mouse_input_test_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
struct usb_device *dev = interface_to_usbdev(intf);//获取usb接口结构体中的usb设备结构体
struct usb_host_interface *interface;
struct usb_endpoint_descriptor *endpoint;
int pipe; interface = intf->cur_altsetting; //获取usb接口结构体中的usb host接口结构体
endpoint = &interface->endpoint[0].desc;//获取usb host接口结构体中的端点描写叙述结构体
uk_dev = input_allocate_device(); set_bit(EV_KEY, uk_dev->evbit);//设置
set_bit(EV_REP, uk_dev->evbit);
set_bit(KEY_L, uk_dev->keybit);
set_bit(KEY_S, uk_dev->keybit);
set_bit(KEY_ENTER, uk_dev->keybit); input_register_device(uk_dev);//注冊
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
len = endpoint->wMaxPacketSize;
usb_buf = usb_buffer_alloc(dev, len, GFP_ATOMIC, &usb_buf_phys);
uk_urb = usb_alloc_urb(0, GFP_KERNEL);//分配usb request block
usb_fill_int_urb(uk_urb, dev, pipe, usb_buf, len, usb_mouse_input_test_irq, NULL, endpoint->bInterval);
uk_urb->transfer_dma = usb_buf_phys; //源,目的。长度。设置URB
uk_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
usb_submit_urb(uk_urb, GFP_KERNEL);//把URB提交到USB主控制器驱动 return 0;
} static void usb_mouse_input_test_disconnect(struct usb_interface *intf)
{
struct usb_device *dev = interface_to_usbdev(intf);
printk("disconnect mouse!\n");
usb_kill_urb(uk_urb);
usb_free_urb(uk_urb);
usb_buffer_free(dev, len, usb_buf, usb_buf_phys);
input_unregister_device(uk_dev);
input_free_device(uk_dev);
} static struct usb_driver usb_mouse_input_test_driver = {
.name = "usb_mouse_input_test_",
.probe = usb_mouse_input_test_probe,
.disconnect = usb_mouse_input_test_disconnect,
.id_table = usb_mouse_input_test_id_table,
}; static int usb_mouse_input_test_init(void)
{
usb_register(&usb_mouse_input_test_driver);
return 0;
} static void usb_mouse_input_test_exit(void)
{
usb_deregister(&usb_mouse_input_test_driver);
} MODULE_LICENSE("GPL");
module_init(usb_mouse_input_test_init);
module_exit(usb_mouse_input_test_exit);
Makefile:
obj-m += usb_mouse_input_test.o KERN_DIR = /home/***/linux-2.6.32.2 all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
測试前去掉linux内核中鼠标功能:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3UyMDA5MzM0Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
insmod usb_mouse_input_test.ko
插入USB鼠标
点击鼠标三个按键
终端可见信息打印:
left !
right !
middle !
Linux USB 鼠标输入驱动具体解释的更多相关文章
- Linux USB 鼠标驱动程序详解(转)
Linux USB 鼠标驱动程序详解 USB 总线引出两个重要的链表!一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以 ...
- Linux USB ECM Gadget 驱动介绍
1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
- Linux usb子系统(一):子系统架构
一.USB协议基础知识 前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB). ...
- Linux USB 和 sysfs
由于单个 USB 物理设备的复杂性, 设备在 sysfs 中的表示也非常复杂. 物理 USB 设备 (通过 struct usb_device 表示)和单个 USB 接口(由 struct usb_i ...
- Linux驱动之USB鼠标驱动编写
本篇博客分以下几部分讲解 1.介绍USB四大描述 2.介绍USB鼠标驱动程序功能及框架 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍USB四大描述符 USB设 ...
- 学习Linux下s3c2440的USB鼠标驱动笔记
1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...
- Linux USB驱动学习总结(三)---- USB鼠标的加载、初始化和通信过程
1.usbmouse的定义:usb鼠标既包含usb设备(usb_device)的属性也包含input输入设备(input_dev)的属性 struct usb_mouse { ];///USB鼠标设备 ...
- Linux usb子系统(二):USB设备驱动usb-skeleton.c
usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...
随机推荐
- Core Data 多表连接及查询
一:先建议两张表 Person,Score 分别代表,学生表,分数表 在 Person的Relationships里面建立关系,指向分数score 二:coreData生成的两个表: Person @ ...
- vue - vue-loader.conf
'use strict' // 工具=> build/util.js const utils = require('./utils') // 配置=> build/config/index ...
- 算法笔记_076:蓝桥杯练习 结点选择(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...
- ionic 图片加载失败,显示默认图片代替
1.首先编写自定义指令 angular.module('starter.directives', []) //当图片找不到事显示替代图片 .directive("errSrc", ...
- Mybatis <if>标签
格式:<if test=""> sql语句 </if> <select id="selectByName" resultType= ...
- IIS7如何部署asp.net网站 (asp.net mvc 5 , asp.net 4.5 , asp.net 4.0 都可以 )
第一步:发布网站 右键asp.net web项目,选择发布, 然后新建配置文件名称并选择 "文件系统" 发布方法. 目标位置选择本地新建的文件夹如: IISWebSite 第二 ...
- css定位positon
值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...
- ASP.NET CORE 2.1无法添加控制器、视图
常规操作:右键Controllers,添加控制器 结果提示:运行所选代码生成器时出错 在控制器里快速添加视图也得到同样的错误提示 既然提示代码生成器了,对比了一下2.0和2.1的代码,发现2.1默认没 ...
- Python 实现根据不同的程序运行环境存放日志目录,Python实现Linux和windows系统日志的存放
说明:在我们开发的时候,有时候是在windows系统下开发的代码,我们的生产环境是Linux系统,更新代码就需要修改日志的环境,本文实现了代码更新,不需要配置日志文件的目录,同样也可以延伸到ip地址 ...
- Unity3D_NGUI_性能优化实践_CPU卡顿
http://gad.qq.com/college/articledetail/7083468 博尔特以9.58秒创造了百米世界纪录,假设他是跑酷游戏的角色,卡顿一帧就足以把冠军拱手让人. Unity ...