以USB鼠标驱动为例

框架入口源文件: usb_mouse.c  hub.c

(可根据入口源文件,再按着框架到内核走一遍)

内核版本:linux_2.6.22.6    硬件平台:JZ2440

以下是驱动框架:

以下是驱动代码 usb_mouse.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> //定义一个input_dev 结构体
static struct input_dev *usb_mouse_dev; static int usb_pipe;
static char *usb_buff;
static int usb_len;
static struct urb *usb_urb;
static dma_addr_t usb_buff_phy; // id_table .bInterfaceClass = (cl), .bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr)
static struct usb_device_id usb_mouse_driver_id_table[] =
{
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID,USB_INTERFACE_SUBCLASS_BOOT,USB_INTERFACE_PROTOCOL_MOUSE)},
}; //usb 中断
static void usb_mouse_int(struct urb *urb) {
#if 0
int i=;
static int cnt=;
printk("cnt = %d",++cnt);
for (i = ; i < usb_len; i++)
{
printk("%02x ", usb_buff[i]);
}
printk("\n");
#endif #if 1
static unsigned char pre_val; /* bit[0] 左 bit[1] 右 bit[3] 滑轮安下
*/ if ((pre_val & (<<)) != (usb_buff[] & (<<)))
{
input_event(usb_mouse_dev, EV_KEY, KEY_L, (usb_buff[] & (<<)) ? : );
input_sync(usb_mouse_dev);
} if ((pre_val & (<<)) != (usb_buff[] & (<<)))
{
input_event(usb_mouse_dev, EV_KEY, KEY_S, (usb_buff[] & (<<)) ? : );
input_sync(usb_mouse_dev);
} if ((pre_val & (<<)) != (usb_buff[] & (<<)))
{
input_event(usb_mouse_dev, EV_KEY, KEY_ENTER, (usb_buff[] & (<<)) ? : );
input_sync(usb_mouse_dev);
} pre_val = usb_buff[];
#endif //重新提交
usb_submit_urb(usb_urb, GFP_KERNEL);
} static int usb_mouse_driver_probe(struct usb_interface *intf,const struct usb_device_id *id)
{ struct usb_device *usb_dev;
//接口 端点
struct usb_host_interface *usb_interface;
struct usb_endpoint_descriptor *usb_endpoint; usb_interface = intf->cur_altsetting;
usb_endpoint = &usb_interface->endpoint[].desc; //输入子系统
//分配一个input_dev
usb_mouse_dev = input_allocate_device(); //初始化 input_dev 结构体
set_bit(EV_KEY,usb_mouse_dev->evbit);
set_bit(EV_REP,usb_mouse_dev->evbit); set_bit(KEY_L,usb_mouse_dev->keybit);
set_bit(KEY_S,usb_mouse_dev->keybit);
set_bit(KEY_ENTER,usb_mouse_dev->keybit); //注册 input_dev 结构体
input_register_device(usb_mouse_dev); //USB
// 起点:usb_dev usb_pipe 终点:usb_urb usb_buff 长度:usb_len 函数:usb_mouse_int
usb_dev = interface_to_usbdev(intf);
usb_pipe = usb_rcvintpipe(usb_dev, usb_endpoint->bEndpointAddress); usb_len = usb_endpoint->wMaxPacketSize; usb_urb = usb_alloc_urb(,GFP_KERNEL);
usb_buff = usb_buffer_alloc(usb_dev, usb_len, GFP_ATOMIC,&usb_buff_phy); //设置 URB
usb_fill_int_urb(usb_urb,usb_dev,usb_pipe,usb_buff, usb_len, usb_mouse_int, NULL, usb_endpoint->bInterval); usb_urb->transfer_dma = usb_buff_phy;
usb_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; //提交 URB
usb_submit_urb(usb_urb, GFP_KERNEL);
return ; } static void usb_mouse_driver_disconnect(struct usb_interface *intf)
{
struct usb_device *usb_dev= interface_to_usbdev(intf);
//usb
usb_kill_urb(usb_urb);
usb_free_urb(usb_urb);
usb_buffer_free(usb_dev, usb_len, usb_buff, usb_buff_phy);
// input_dev
input_unregister_device(usb_mouse_dev);
input_free_device(usb_mouse_dev);
} //定义一个usb_driver结构体
static struct usb_driver usb_mouse_driver =
{
.name = "usb_mouse_driver",
.probe =usb_mouse_driver_probe,
.disconnect =usb_mouse_driver_disconnect,
.id_table = usb_mouse_driver_id_table,
}; static int usb_mouse_driver_init(void)
{
usb_register(&usb_mouse_driver);
return ;
} static void usb_mouse_driver_exit(void)
{
usb_deregister(&usb_mouse_driver);
} module_init(usb_mouse_driver_init);
module_exit(usb_mouse_driver_exit);
MODULE_LICENSE("GPL");

以下是编译驱动的Makefile:

KERN_DIR = /work/systems/kernel/linux-/linux-2.6.22.6

all:
make -C $(KERN_DIR) M=`pwd` modules clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order obj-m += usb_mouse.o

USB驱动框架的更多相关文章

  1. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  2. Linux USB驱动框架分析【转】

    转自:http://blog.csdn.net/jeffade/article/details/7701431 Linux USB驱动框架分析(一) 初次接触和OS相关的设备驱动编写,感觉还挺有意思的 ...

  3. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

  4. Linux下USB驱动框架分析【转】

    转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...

  5. am335x USB 驱动框架记录

    参考: http://processors.wiki.ti.com/index.php/AM335x_USB_Driver%27s_Guide http://processors.wiki.ti.co ...

  6. 【驱动】USB驱动·入门

    [驱动]USB驱动·入门 Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导致计算机外部总线种类繁多,管理困难.USB总线正是因此而诞生的. ...

  7. 【驱动】USB驱动·入门【转】

    转自:http://www.cnblogs.com/lcw/p/3159371.html Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导 ...

  8. linux usb驱动记录(一)

    一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示:   从主机侧看usb驱动可分为四层: ...

  9. Android USB驱动源码分析(-)

    Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...

随机推荐

  1. 经典的HTML5游戏及其源码分析

    HTML5已经相当强大,在HTML5平台上,我们可以完成很多非常复杂的动画效果,包括游戏在内.早期我们只能利用flash来实现网络游戏,现在我们又多了一种选择,即用HTML5制作游戏.相比flash, ...

  2. laravel5.4中验证与错误提示设置

    1.对于交互提交数据,验证如: #验证 $this->validate(\request(),[ 'title' => 'required|string|min:3|max:20', 'c ...

  3. SSM框架搭建最新教程(超详细)

    个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想.实践出真知. 1.基本概念 1.1.Spring  Spr ...

  4. 深入Java内存模型之阅读理解(1)

    Java内存模型的抽象 在java中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素).局部变量(Local variabl ...

  5. mem 0908

    taglib http://blog.csdn.net/zyujie/article/details/8735730 dozer: Dozer可以在JavaBean到JavaBean之间进行递归数据复 ...

  6. 跨服务器做yum源

    服务器无法上网,然后自己根据光盘搭建的YUM源不够用.RPM安装软件,各种依赖,找包烦死. 先做个 能上外网的 http proxy 找一个可以上Internet的服务器,然后起一个squid服务, ...

  7. NHibernate之旅(21):探索对象状态

    本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...

  8. Thrift的一些概念

    Thrift最初是由Facebook开发的,因为随着流量和网络结构的扩展,一些操作如搜索.分发.事件日志记录等已经超出系统的处理范围,所以Facebook的工程师开发服务时选择了多种不同的编程语言来达 ...

  9. MySQL主从复制介绍

    MySQL主从复制介绍 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具,而且,M ...

  10. 网络通信协议八之UDP协议详解

    视频传输中使用UDP协议比较多 UDP协议的责任 >>创建进程到进程间的通信(由端口号完成) >>有限的差错控制,出现差错悄悄丢弃报文(注意这点和TCP协议的区别)