以下是打印鼠标左右键及其他输入的源代码,详细说明见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设备信息(二)的更多相关文章

  1. usb驱动之打印usb设备信息(一)

    1. 定义usb支持的设备类型: static const struct usb_device_id mouse_table[] = { { USB_INTERFACE_INFO(USB_INTERF ...

  2. usb驱动开发12之设备生命线

    函数usb_control_msg完成一些初始化后调用了usb_internal_control_msg之后就free urb.剩下的活,全部留给usb_internal_control_msg去做了 ...

  3. usb驱动开发13之设备生命线

    上一节勉勉强强把struct urb这个中心给说完,接着看那三个基本点. 第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/ ...

  4. usb驱动开发18之设备生命线

    现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符.接口描述符还是端点描述符都挤在一起,所以得想办法将 ...

  5. usb驱动开发14之设备生命线

    直接看代码吧. /*-------------------------------------------------------------------*/ /** * usb_submit_urb ...

  6. usb驱动开发11之设备生命线

    暂时先告别媒人,我们去分析各自的生命旅程,最后还会回到usb_device_match函数. 首先当你将usb设备连接在hub的某个端口上,hub检测到有设备连接了进来,它会为设备分配一个struct ...

  7. usb驱动开发16之设备生命线

    回到struct usb_hcd,继续努力的往下看. kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看hcd.c文件. static void hcd_ ...

  8. usb驱动开发15之设备生命线

    总算是进入了HCD的片儿区,既然来到一个片区,怎么都要去拜会一下山头几个大哥吧.,先回忆一些我们怎么到这里的?给你列举一个调用函数过程usb_control_msg->usb_internal_ ...

  9. Linux Platform驱动模型(一) _设备信息

    我在Linux字符设备驱动框架一文中简单介绍了Linux字符设备编程模型,在那个模型中,只要应用程序open()了相应的设备文件,就可以使用ioctl通过驱动程序来控制我们的硬件,这种模型直观,但是从 ...

随机推荐

  1. 支持xcode6的缓动函数Easing以及使用示例

    支持xcode6的缓动函数Easing以及使用示例 用xcode6新建工程后,直接导致不支持之前的Easing缓动函数的代码,经过修改后就可以正常使用了,虽然比不上POP高大上的动画,但用缓动函数的动 ...

  2. iOS设计模式 - 适配器

    iOS设计模式 - 适配器 效果 说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种 ...

  3. Linux 下Shell的学习3-优秀demo

    优秀的DEMO cat /etc/init.d/functions   -->里面有颜色定义cat /etc/rc.d/rc.sysinit cat /etc/init.d/nfscat /et ...

  4. Excel课程表

  5. python3程序设计基本方法

    实例 6.升级维护 总结: 打了多年的游击战.突然经过教官的指导,觉得很受益,程序自学需要总结和交流.

  6. #Alpha Scrum4

    Alpha Scrum3 牛肉面不要牛肉不要面 Alpha项目冲刺(团队作业5) 各个成员在 Alpha 阶段认领的任务 林志松:音乐网页前端页面编写,博客发布 林书浩.陈远军:界面设计.美化 吴沂章 ...

  7. apache、nginx实现反向代理

    一.apache(不推荐): 代理80端口:a. 配置:b. 效果:c. 配置文件参考: ServerRoot "/etc/httpd" Listen 80 ProxyPass / ...

  8. 【js】五子棋-UI学习

    http://www.imooc.com/learn/639 棋盘用canvas实现

  9. 3、Spring Cloud - Eureka(构建服务端/客户端)

    3.1.Eureka简介 3.1.1.什么是 Eureka 和Consul.Zookeeper 类似, Eureka 是一个用于服务注册和发现的组件,最开始主要应用 于亚马逊公司旗下的云计算服务平台 ...

  10. selenium + python自动化测试unittest框架学习(一)selenium原理及应用

    unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻. ...