平台: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 鼠标输入驱动具体解释的更多相关文章

  1. Linux USB 鼠标驱动程序详解(转)

    Linux USB 鼠标驱动程序详解 USB 总线引出两个重要的链表!一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以 ...

  2. Linux USB ECM Gadget 驱动介绍

    ​1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...

  3. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  4. Linux usb子系统(一):子系统架构

    一.USB协议基础知识   前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB). ...

  5. Linux USB 和 sysfs

    由于单个 USB 物理设备的复杂性, 设备在 sysfs 中的表示也非常复杂. 物理 USB 设备 (通过 struct usb_device 表示)和单个 USB 接口(由 struct usb_i ...

  6. Linux驱动之USB鼠标驱动编写

    本篇博客分以下几部分讲解 1.介绍USB四大描述 2.介绍USB鼠标驱动程序功能及框架 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍USB四大描述符 USB设 ...

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

    1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...

  8. Linux USB驱动学习总结(三)---- USB鼠标的加载、初始化和通信过程

    1.usbmouse的定义:usb鼠标既包含usb设备(usb_device)的属性也包含input输入设备(input_dev)的属性 struct usb_mouse { ];///USB鼠标设备 ...

  9. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

随机推荐

  1. Unity3d 录像

    flashtd1: 回复 tqfa :我觉得是有方法可以实现的,之前使用高通的增强显示开发包时发现其实它是添加了一个类似movietexture的东西,叠加在它的摄像机上 如果文档里有操作moviet ...

  2. Ubuntu 下的webservices

    搞 了一下午: 开发server程序.需使用gSOAP生成server端代码框架. 我们有两种做法: 编写WSDL,使用wsdl2h生成头文件,再soapcpp2生成框架代码. 编写头文件.使用soa ...

  3. ZK框架笔记2、ZK框架安装、相关类库、web及zk配置

    1.先去ZK官网注册一个账号 2.在MyEclipse菜单栏中Help----Eclipse Marketplace中搜索ZK Studio,点击install安装即可         3.相关类库 ...

  4. 【Python】学习笔记八:面向对象

    举例 面向对象的合理解释就是:我是人这个类,对象化以后我就是一个个体OLIVER 对象化就是在人这个大类中,将某个人指名道姓,具体到某个人 下面是一个具体的实例一: #!/usr/bin/python ...

  5. LR11.5 安卓模拟器性能测试

    LR11.5 安卓模拟器性能测试 上一篇 / 下一篇  2013-07-04 08:07:19 / 个人分类:相关知识 查看( 1172 ) / 评论( 1 ) / 评分( 0 / 0 ) 1.首先下 ...

  6. java 判断一个字符串是否包含某个字符串中的字符

    public static void main(String[] args) {       if(isHave("购买ab","出售AssBC"))   Sy ...

  7. kettle--组件(3)--行转列

    组件图如下: 以上操作可以这么理解: IF(DATA1=DATA4) THEN DATA2=DATA3 也就是关键字值的数值会与关键字段的数值匹配,匹配上了就显示数据value filedname所填 ...

  8. c#金额转换成中文大写金额 .Net开发Windows服务

    c#金额转换成中文大写金额   2018-08-24 转别人 c#金额转换成中文大写金额 /// <summary> /// 金额转换成中文大写金额 /// </summary> ...

  9. C语言控制台打印3D爱心图案

    非常多程序猿都认为自己的编程工作十分的鼓噪乏味.一整天面对的都是一些写不完的代码和改不完的Bug.今天我们要给大家分享一些有趣的C语言代码,也许能够为你无聊的工作带来一丝乐趣. 这些代码能够完毕几个不 ...

  10. 读取properties属性文件——国际化

    public class PropertiesInfo { /** * PropertiesInfo实例 */ private static PropertiesInfo pi = null; pri ...