BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #7857同步于 2010/3/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

求救:linux 2.6.30.4 usb鼠标驱动编程

dameng
2010/3/20镜像同步7 回复
这是在下写得一个usb鼠标驱动程序,编译成模块后能够加载。但是,插入usb鼠标以后,probe函数根本没得到执行,哪位大侠能够指点一下,不胜感激。 #include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb/input.h> #include <linux/hid.h> #include <asm/uaccess.h> #define DRIVER_VERSION "v1.6" #define DRIVER_AUTHOR "chen" #define DRIVER_DESC "USB HID Boot Protocol mouse driver" #define DRIVER_LICENSE "GPL" #define USB_IDMOUSE_MINOR_BASE 162 MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE(DRIVER_LICENSE); struct usb_mouse { struct usb_device *usbdev; struct usb_interface *interface; struct urb *irq; signed char *data; dma_addr_t data_dma; }; static struct usb_device_id usb_mouse_id_table[] = { {.driver_info = 42}, {} }; MODULE_DEVICE_TABLE(usb,usb_mouse_id_table); static ssize_t usb_mouse_read(struct file *file,char __user *buffer,size_t count,loff_t *ppos); static int usb_mouse_open(struct inode *inode,struct file *file); static int usb_mouse_release(struct inode *inode,struct file *file); static int usb_mouse_probe(struct usb_interface *interface,const struct usb_device_id *id); static void usb_mouse_disconnect(struct usb_interface *interface); static struct usb_driver usb_mouse_driver = { .name = "usbmouse", .probe = usb_mouse_probe, .disconnect = usb_mouse_disconnect, .id_table = usb_mouse_id_table, }; static const struct file_operations mouse_fops = { .owner = THIS_MODULE, .read = usb_mouse_read, .open = usb_mouse_open, .release = usb_mouse_release, }; static struct usb_class_driver mouse_class = { .name = "CHENmouse%d", .fops = &mouse_fops, .minor_base = USB_IDMOUSE_MINOR_BASE, }; static void usb_mouse_irq(struct urb *urb) { int status; switch(urb->status) { case 0: break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: default: goto resubmit; } resubmit: status = usb_submit_urb(urb,GFP_ATOMIC); if(status) err("can't resubmit intr"); } static int usb_mouse_open(struct inode *inode,struct file *file) { struct usb_interface *interface = usb_find_interface(&usb_mouse_driver,iminor(inode)); struct usb_mouse *mouse = usb_get_intfdata(interface); mouse->irq->dev = mouse->usbdev; if(usb_submit_urb(mouse->irq,GFP_KERNEL)) return -EIO; file->private_data = mouse; return 0; } static int usb_mouse_release(struct inode *inode,struct file *file) { struct usb_interface *interface = usb_find_interface(&usb_mouse_driver,iminor(inode)); struct usb_mouse *mouse = usb_get_intfdata(interface); usb_kill_urb(mouse->irq); file->private_data = NULL; return 0; } static ssize_t usb_mouse_read(struct file *file,char __user *buffer,size_t count,loff_t *ppos) { ssize_t num; struct usb_mouse *mouse = file->private_data; num=copy_to_user(buffer,mouse->data,count); if(num<count) return num; else return count; } static int usb_mouse_probe(struct usb_interface *intf,const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct usb_mouse *mouse; int pipe,maxp,retval; printk(KERN_ALERT "enter the usb_mouse_probe\n"); interface = intf->cur_altsetting; if(interface->desc.bNumEndpoints!=1) return -ENODEV; endpoint = &interface->endpoint[0].desc; if(!usb_endpoint_is_int_in(endpoint)) return -ENODEV; pipe = usb_rcvintpipe(dev,endpoint->bEndpointAddress); maxp = usb_maxpacket(dev,pipe,usb_pipeout(pipe)); mouse = kzalloc(sizeof(struct usb_mouse),GFP_KERNEL); if(!mouse) goto fail1; mouse->data = usb_buffer_alloc(dev,8,GFP_ATOMIC,&mouse->data_dma); if(!mouse->data) goto fail1; mouse->irq = usb_alloc_urb(0,GFP_KERNEL); if(!mouse->irq) goto fail2; mouse->usbdev = dev; mouse->interface = intf; usb_fill_int_urb(mouse->irq,dev,pipe,mouse->data,(maxp>8?8:maxp),usb_mouse_irq,mouse,endpoint->bInterval); mouse->irq->transfer_dma = mouse->data_dma; mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; usb_set_intfdata(intf,mouse); retval = usb_register_dev(intf,&mouse_class); if(retval) { printk("err usb_register_dev\n"); usb_set_intfdata(intf,NULL); usb_buffer_free(dev,8,mouse->data,mouse->data_dma); kfree(mouse); return retval; } printk(KERN_ALERT "usb_register_dev successed\n"); return 0; fail2: usb_buffer_free(dev,8,mouse->data,mouse->data_dma); fail1: kfree(mouse); return -ENOMEM; } static void usb_mouse_disconnect(struct usb_interface *intf) { struct usb_mouse *mouse = usb_get_intfdata(intf); usb_deregister_dev(intf,&mouse_class); usb_set_intfdata(intf,NULL); if(mouse) { usb_kill_urb(mouse->irq); usb_free_urb(mouse->irq); usb_buffer_free(interface_to_usbdev(intf),8,mouse->data,mouse->data_dma); kfree(mouse); } } static int __init usb_mouse_init(void) { int retval = usb_register(&usb_mouse_driver); if(retval == 0) printk(DRIVER_VERSION ":" DRIVER_DESC); printk(KERN_ALERT "USB_MOUSE_INIT SUCCESSED\n"); return retval; } static void __exit usb_mouse_exit(void) { usb_deregister(&usb_mouse_driver); } module_init(usb_mouse_init); module_exit(usb_mouse_exit);
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
qzp机器人#1 · 2010/3/21
确定是probe出问题么,给一些其他信息,printk和日志
dameng机器人#2 · 2010/3/21
【 在 qzp 的大作中提到: 】 : 确定是probe出问题么,给一些其他信息,printk和日志 先谢谢你,呵呵。 insmod模块后,日志信息为:usbcore:registered nwe interface driver usbmouse v1.6: USB HID Boot Protocal mouse driver<1> USB_MOUSE_INIT SUCCESSED 我插入USB鼠标后,新的日志信息为:usbcore:registered nwe interface driver usbmouse v1.6: USB HID Boot Protocal mouse driver<1> USB_MOUSE_INIT SUCCESSED usb 1-1:new low speed USB device using s3c2410-ohci and address 2 usb 1-1:configuration #1 chosen from 1 choice input: USB Mouse as /devices/platform/s3c2410-ohci/usb1/1-1/1-1:1-0/input/input0 generic-usb 0003:15D9/0A37.0001: input: USB HID v1.10 Mouse [USB Mouse] on usb-s3c24xx-1/input0 可是我的probe函数却没有执行。
dameng机器人#3 · 2010/3/21
【 在 qzp 的大作中提到: 】 : 确定是probe出问题么,给一些其他信息,printk和日志 同学,谢谢你了。我刚找到解决办法了:配置内核时,把“USB Human Interface Device (full HID) support”那一项去掉就好了。是不是因为系统把那个热插拔的消息截获后自己处理了,而没有执行我添加的驱动?我还不是很清楚。希望以后发帖子时,你再多给看看啊,呵呵。
qzp机器人#4 · 2010/3/21
USB驱动在定义接口描述符后 可以定义端点描述符或HID描述符,你的HID描述符没有定义 我猜日志中chosen from 1 choice 指在内核中指默认的HID描述符优先
hobby机器人#5 · 2010/3/22
赞技术探讨,更赞独立解决问题! 【 在 dameng 的大作中提到: 】 : 同学,谢谢你了。我刚找到解决办法了:配置内核时,把“USB Human Interface Device (full HID) support”那一项去掉就好了。是不是因为系统把那个热插拔的消息截获后自己处理了,而没有执行我添加的驱动?我还不是很清楚。希望以后发帖子时,你再多给看看啊,呵呵。
dameng机器人#6 · 2010/3/23
对对,是打印出了chosen from 1 choice ,我原来都不知道HID什么意思,现在正在慢慢看。呵呵,以后有问题还要多向你请教啊 【 在 qzp 的大作中提到: 】 : USB驱动在定义接口描述符后 : 可以定义端点描述符或HID描述符,你的HID描述符没有定义 : 我猜日志中chosen from 1 choice : ...................
dameng机器人#7 · 2010/3/23
呵呵,我是刚刚才开始学习,发现学校论坛这个版块真好 【 在 hobby 的大作中提到: 】 : 赞技术探讨,更赞独立解决问题!