完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 elecfans跑堂 于 2015-8-28 11:41 编辑
/* * drivershidu***hidu***mouse.c */ #include #include #include #include #include #include static struct input_dev *uk_dev; static char *u***_buf; static dma_addr_t u***_buf_phys; static int len; static struct urb *uk_urb; static struct u***_device_id u***mouse_as_key_id_table [] = { { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, USB_INTERFACE_PROTOCOL_MOUSE) }, //{USB_DEVICE(0x1234,0x5678)}, { } /* Terminating entry */ }; static void u***mouse_as_key_irq(struct urb *urb) { static unsigned char pre_val; #if 0 int i; static int cnt = 0; printk("data cnt %d: ", ++cnt); for (i = 0; i < len; i++) { printk("%02x ", u***_buf); } printk("n"); #endif /* USB鼠标数据含义 * data[0]: bit0-左键, 1-按下, 0-松开 * bit1-右键, 1-按下, 0-松开 * bit2-中键, 1-按下, 0-松开 * */ if ((pre_val & (1<<0)) != (u***_buf[0] & (1<<0))) { /* 左键发生了变化 */ input_event(uk_dev, EV_KEY, KEY_L, (u***_buf[0] & (1<<0)) ? 1 : 0); input_sync(uk_dev); } if ((pre_val & (1<<1)) != (u***_buf[0] & (1<<1))) { /* 右键发生了变化 */ input_event(uk_dev, EV_KEY, KEY_S, (u***_buf[0] & (1<<1)) ? 1 : 0); input_sync(uk_dev); } if ((pre_val & (1<<2)) != (u***_buf[0] & (1<<2))) { /* 中键发生了变化 */ input_event(uk_dev, EV_KEY, KEY_ENTER, (u***_buf[0] & (1<<2)) ? 1 : 0); input_sync(uk_dev); } pre_val = u***_buf[0]; /* 重新提交urb */ u***_submit_urb(uk_urb, GFP_KERNEL); } static int u***mouse_as_key_probe(struct u***_interface *intf, const struct u***_device_id *id) { struct u***_device *dev = interface_to_u***dev(intf); struct u***_host_interface *interface; struct u***_endpoint_descriptor *endpoint; int pipe; interface = intf->cur_altsetting; endpoint = &interface->endpoint[0].desc; /* a. 分配一个input_dev */ uk_dev = input_allocate_device(); /* b. 设置 */ /* b.1 能产生哪类事件 */ set_bit(EV_KEY, uk_dev->evbit); set_bit(EV_REP, uk_dev->evbit); /* b.2 能产生哪些事件 */ set_bit(KEY_L, uk_dev->keybit); set_bit(KEY_S, uk_dev->keybit); set_bit(KEY_ENTER, uk_dev->keybit); /* c. 注册 */ input_register_device(uk_dev); /* d. 硬件相关操作 */ /* 数据传输3要素: 源,目的,长度 */ /* 源: USB设备的某个端点 */ pipe = u***_rcvintpipe(dev, endpoint->bEndpointAddress); /* 长度: */ len = endpoint->wMaxPacketSize; /* 目的: */ u***_buf = u***_buffer_alloc(dev, len, GFP_ATOMIC, &u***_buf_phys); /* 使用"3要素" */ /* 分配u*** request block */ uk_urb = u***_alloc_urb(0, GFP_KERNEL); /* 使用"3要素设置urb" */ u***_fill_int_urb(uk_urb, dev, pipe, u***_buf, len, u***mouse_as_key_irq, NULL, endpoint->bInterval); uk_urb->transfer_dma = u***_buf_phys; uk_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; /* 使用URB */ u***_submit_urb(uk_urb, GFP_KERNEL); return 0; } static void u***mouse_as_key_disconnect(struct u***_interface *intf) { struct u***_device *dev = interface_to_u***dev(intf); //printk("disconnect u***mouse!n"); u***_kill_urb(uk_urb); u***_free_urb(uk_urb); u***_buffer_free(dev, len, u***_buf, u***_buf_phys); input_unregister_device(uk_dev); input_free_device(uk_dev); } /* 1. 分配/设置u***_driver */ static struct u***_driver u***mouse_as_key_driver = { .name = "u***mouse_as_key_", .probe = u***mouse_as_key_probe, .disconnect = u***mouse_as_key_disconnect, .id_table = u***mouse_as_key_id_table, }; static int u***mouse_as_key_init(void) { /* 2. 注册 */ u***_register(&u***mouse_as_key_driver); return 0; } static void u***mouse_as_key_exit(void) { u***_deregister(&u***mouse_as_key_driver); } module_init(u***mouse_as_key_init); module_exit(u***mouse_as_key_exit); MODULE_LICENSE("GPL"); |
|
相关推荐
1个回答
|
|
谢谢分享 希望有更多好的资料可以分享
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
iTOP-3A5000主控板龙芯架构外加机箱就是一台电脑主机
705 浏览 0 评论
迅为RK3568开发板EMMC镜像导出打包update.img
757 浏览 0 评论
飞凌嵌入式-ELFBOARD 硬件知识分享-ELF 2电源电路讲解
1229 浏览 0 评论
1928 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程介绍之烧写所需镜像
1661 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 12:57 , Processed in 0.470956 second(s), Total 41, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号