usb驱动之打印usb设备信息(二)
以下是打印鼠标左右键及其他输入的源代码,详细说明见https://www.cnblogs.com/zhu-g5may/p/9309381.html
/*参考/drivers/hid/usbhid/usbmouse.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 *mouse_urb;
static int len;
static char *buf;
static dma_addr_t mouse_dma; static const struct usb_device_id mouse_table[] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE) }, /* mouse */
{ }/* Terminating entry */
}; MODULE_DEVICE_TABLE (usb, mouse_table); static void usb_mouse_irq(struct urb *urb)
{
static int cnt = ;
int i;
printk("data %d : \n",++cnt);
for(i = ; i < len; i++){
printk("0x%02x\n",buf[i]);
}
usb_submit_urb(mouse_urb, GFP_KERNEL);
} static int mouse_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
int pipe;
struct usb_device *mdev = interface_to_usbdev(intf); //设备
struct usb_endpoint_descriptor *endpoint;
struct usb_host_interface *interface; interface = intf->cur_altsetting; //接口
if (interface->desc.bNumEndpoints != )
return -ENODEV; endpoint = &interface->endpoint[].desc; //端点
if (!usb_endpoint_is_int_in(endpoint))
return -ENODEV; len = endpoint->wMaxPacketSize; //长度(多少字节) buf = usb_alloc_coherent(mdev, len, GFP_ATOMIC, &mouse_dma); //传输buffer,目的
pipe=usb_rcvintpipe(mdev,endpoint->bEndpointAddress); //源 mouse_urb = usb_alloc_urb(, GFP_KERNEL); usb_fill_int_urb(mouse_urb,mdev,pipe,buf,len,usb_mouse_irq, NULL, endpoint->bInterval); //初始化中断型urb结构体
mouse_urb->transfer_dma = mouse_dma;
mouse_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; usb_submit_urb(mouse_urb, GFP_KERNEL); return ;
} static void mouse_disconnect(struct usb_interface *intf)
{
struct usb_device *mdev = interface_to_usbdev(intf); //设备
usb_kill_urb(mouse_urb);
usb_free_urb(mouse_urb);
usb_free_coherent(mdev, len, buf, mouse_dma);
} static struct usb_driver usb_driver = {
.name = "mouse",
.probe = mouse_probe,
.disconnect = mouse_disconnect,
.id_table = mouse_table,
}; static int usb_drv_init(void)
{
usb_register(&usb_driver);
return ;
} static void usb_drv_exit(void)
{
usb_deregister(&usb_driver);
} module_init(usb_drv_init);
module_exit(usb_drv_exit);
//module_usb_driver(usb_driver); MODULE_LICENSE("GPL");
MODULE_AUTHOR("1653699780@qq.com");
usb驱动之打印usb设备信息(二)的更多相关文章
- usb驱动之打印usb设备信息(一)
1. 定义usb支持的设备类型: static const struct usb_device_id mouse_table[] = { { USB_INTERFACE_INFO(USB_INTERF ...
- usb驱动开发12之设备生命线
函数usb_control_msg完成一些初始化后调用了usb_internal_control_msg之后就free urb.剩下的活,全部留给usb_internal_control_msg去做了 ...
- usb驱动开发13之设备生命线
上一节勉勉强强把struct urb这个中心给说完,接着看那三个基本点. 第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/ ...
- usb驱动开发18之设备生命线
现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符.接口描述符还是端点描述符都挤在一起,所以得想办法将 ...
- usb驱动开发14之设备生命线
直接看代码吧. /*-------------------------------------------------------------------*/ /** * usb_submit_urb ...
- usb驱动开发11之设备生命线
暂时先告别媒人,我们去分析各自的生命旅程,最后还会回到usb_device_match函数. 首先当你将usb设备连接在hub的某个端口上,hub检测到有设备连接了进来,它会为设备分配一个struct ...
- usb驱动开发16之设备生命线
回到struct usb_hcd,继续努力的往下看. kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看hcd.c文件. static void hcd_ ...
- usb驱动开发15之设备生命线
总算是进入了HCD的片儿区,既然来到一个片区,怎么都要去拜会一下山头几个大哥吧.,先回忆一些我们怎么到这里的?给你列举一个调用函数过程usb_control_msg->usb_internal_ ...
- Linux Platform驱动模型(一) _设备信息
我在Linux字符设备驱动框架一文中简单介绍了Linux字符设备编程模型,在那个模型中,只要应用程序open()了相应的设备文件,就可以使用ioctl通过驱动程序来控制我们的硬件,这种模型直观,但是从 ...
随机推荐
- 关于Angular中时间戳的计算
前言 使用的是Moment.js 插件,插件的安装详情请参考官方网址(https://momentjs.com/) 正文 步骤一:引用import * as moment from 'moment'; ...
- Python学习---IO模型1227
1.1. 事件驱动 事件驱动属于一种编程的范式,一种编程的风格,它擅长于处理一些未知的事件,通过绑定一个事件,外界触发后激活这个事情,达到执行某些操作的目的.比如浏览器的onclick()事件 1.2 ...
- TMG 2010 为HTTPS协议添加非标准端口(443)
1.添加加密端口时,编辑脚本addsslports.vbs addsslports.vbs 脚本内容如下: Dim root Dim tpRanges Dim newRange Set root = ...
- HDFS Namenode&Datanode
HDFS Namenode&Datanode HDFS 机制粗略示意图 客户端写入文件流程: NN && DN Namenode(NN)工作机制 NN是整个文件系统的管理节点. ...
- Salesforce的多态存储和SAP C4C的元数据存储仓库
Salesforce Force.com integrates and optimizes several different data persistence technologies to del ...
- globalsign代码签名最新步骤
1.确认gs发的token里边有你的数字证书-需按对方要求步骤提取到 2. 到globalsign.cn上下载数字签名工具:安装后联系支持.要到该工具对应授权文件 3. (如驱动签名)签名工具> ...
- 简单说说Spring Security 使用(附加验证码登录,自定义认证)
先看官方文档:http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/ spring security4已 ...
- python新建以时间命名的目录
1.新建三级目录,第一级是去年的年份,第二级是去年的月,第三级为去年的日,在日的文件中写入今年的时分秒 import os import time import shutil def create_f ...
- Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别
1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...
- 使用tidylib解决不规则网页问题
windows 下安装tidylib 先去https://pypi.python.org/pypi/pytidylib 下载pytidylib 跑官方提供的测试用例报错 ition 0: unexpe ...