返回首页
当前位置: 主页>开发编程语言>

电脑知识与技术互动交流平台

时间:2017-10-21 23:56来源:USB开发群 作者:USB开发频道 点击:

  

内核:linux 2.6.32.2

USB设备插入时,内核会读取设备信息,接着就把id_table里的信息与读取到的信息做比较,看是否匹配,如果匹配,就调用probe函数。USB设备拔出时会调用disconnect函数。URB在USB设备驱动程序中用来描述与USB设备通信时用到的基本载体和核心数据结构。

copyright dedecms

URB(usb request block)处理流程:

织梦内容管理系统

①USB设备驱动程序创建并初始化一个访问特定USB设备特定端点的urb并提交给USB core。

织梦内容管理系统

②USB core把这个urb提交到USB主控制器驱动程序。

本文来自织梦

③USB主控制器驱动程序根据该urb描述的信息来访问usb设备。

本文来自织梦

④当设备访问结束后,USB主控制器驱动程序通知USB设备驱动程序。 织梦内容管理系统

USB鼠标数据格式: 织梦好,好织梦

①bit0 ->左键,1->按下,0->松开 copyright dedecms

②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内核中鼠标功能:

电脑知识与技术互动交流平台

织梦好,好织梦


本文来自织梦

电脑知识与技术互动交流平台 织梦好,好织梦


织梦好,好织梦

insmod usb_mouse_input_test.ko copyright dedecms






秦华 『上海买保险』上海地区人寿保险资深寿险顾问 上海外籍人士买保险-高端人士医疗办理
服务项目:儿童医疗/子女教育金/养老保险/重大疾病/意外伤害/员工团险/公众责任
免费热线『上海』:13761630213, QQ:107242375, Email:victor.qin@qq.com
选择保险事业 为了爱,为了一份坚定的承诺!MSN:
上海地区请直接拨打本人电话,应约免费上门提供免费保险方案。
Baoxian.ws>>           旅行签证保险、上门办理>>        重大疾病网>>     上海重大疾病一览    
友情链接: 走在上海人寿保险的前端    和讯保险博客    上海投保在线    Shanghai Insurance    秦华的个人简历


顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
图文并茂 我的链接
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
上海高端医疗/住院医疗保险信息
上海保险规划师信息
上海子女教育理财保险信息
上海保险规划师信息
上海女性高端生育保险方案-等待期
上海保险规划师信息
上海三口之家家庭保障方案
上海保险规划师信息
上海女性特色重大疾病保险方案
上海保险规划师信息
上海女性白领理财保险方案
上海保险规划师信息
上海养老理财规划保险方案
上海保险规划师信息
通过网络取得初步咨询
  •    
上海办理-免费咨询送计划书
上海买保险
上海办理-申根签证 出国旅行保险
上海买保险
上海买保险,海外基金,买保险,友邦保险,中国人民健康保险,养老保险,儿童保险,儿童医疗,子女教育金,太平洋保险,医疗保险,工伤保险条例,中国人寿保险,保险公司,中国平安保险,医疗险,进口药,自费药,外籍人士医疗,泰康人寿,英国保诚集团,上海综合保险,国际医疗保险,上海医疗保险,上海社会保险,上海养老保险,上海市综合保险,上海平安保险,上海太平洋保险,和睦家医院,上海综合保险卡,买保险,高端医疗,重大疾病,意外伤害,定期寿险,家庭理财,友邦保险,金茂大厦,少儿互助基金,上海社保,太平洋集团,港安医院