USB驱动框架
以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驱动框架的更多相关文章
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
- Linux USB驱动框架分析【转】
转自:http://blog.csdn.net/jeffade/article/details/7701431 Linux USB驱动框架分析(一) 初次接触和OS相关的设备驱动编写,感觉还挺有意思的 ...
- Linux USB驱动框架分析(2)【转】
转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html 看了http://blog.chinaunix.net/uid-11848011 ...
- Linux下USB驱动框架分析【转】
转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...
- am335x USB 驱动框架记录
参考: http://processors.wiki.ti.com/index.php/AM335x_USB_Driver%27s_Guide http://processors.wiki.ti.co ...
- 【驱动】USB驱动·入门
[驱动]USB驱动·入门 Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导致计算机外部总线种类繁多,管理困难.USB总线正是因此而诞生的. ...
- 【驱动】USB驱动·入门【转】
转自:http://www.cnblogs.com/lcw/p/3159371.html Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导 ...
- linux usb驱动记录(一)
一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示: 从主机侧看usb驱动可分为四层: ...
- Android USB驱动源码分析(-)
Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...
随机推荐
- [微信开发] 微信JSAPI - 获取用户地理位置信息
参考博客 http://blog.csdn.net/u013142781/article/details/50503299 主要JS 方法 wx.getLocation 获取地理位置信息传递参数 成功 ...
- Caltech数据使用详情
Caltech官网: http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/ 以Caltech测试集为例(大概是4095个图片 ...
- 经典的HTML5游戏及其源码分析
HTML5已经相当强大,在HTML5平台上,我们可以完成很多非常复杂的动画效果,包括游戏在内.早期我们只能利用flash来实现网络游戏,现在我们又多了一种选择,即用HTML5制作游戏.相比flash, ...
- Ant 学习笔记
1.下载Ant 官方网站http://ant.apache.org/bindownload.cgi 下载最新版本 .zip archive: apache-ant-1.9.4-bin.zip [PG ...
- nginx 反向代理 Nginx 502 Bad Gateway
查看错误日志: 摘要: nginx反向代理出现502错误 通过查看日志发现错误信息 2018/01/10 17:58:20 [crit] 8156#0: *1 connect() to 127.0.0 ...
- 斯坦福2011秋季 iPad and iPhone Application Development 资源
1. MVC and Introduction to Objective-C (September 27, 2011) - HD 2. My First iOS App (September 29, ...
- js给原型增加新属性和方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux(centos) 添加系统环境变量
系统环境变量,其实就就是一个添加至系统环境中的路径变量. 编译php的扩展时经常会在扩展包源码目录里执行phpize,每次执行的时候都要敲入一大堆目录,诸如:/usr/local/php/bin/ph ...
- FastJson 自定义Serialize、Parser
FastJson 自定义Serialize.Parser 今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是 ...
- python 利用tkinter模块设计出window窗口(搞笑版)
代码如下 from tkinter import * import tkinter from tkinter import messagebox #定义了一个函数,当关闭window窗口时将会弹出一个 ...