返回信息流这是在下写得一个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);
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #7857同步于 2010/3/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
求救:linux 2.6.30.4 usb鼠标驱动编程
dameng
2010/3/20镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 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函数却没有执行。
【 在 qzp 的大作中提到: 】
: 确定是probe出问题么,给一些其他信息,printk和日志
同学,谢谢你了。我刚找到解决办法了:配置内核时,把“USB Human Interface Device (full HID) support”那一项去掉就好了。是不是因为系统把那个热插拔的消息截获后自己处理了,而没有执行我添加的驱动?我还不是很清楚。希望以后发帖子时,你再多给看看啊,呵呵。
USB驱动在定义接口描述符后
可以定义端点描述符或HID描述符,你的HID描述符没有定义
我猜日志中chosen from 1 choice
指在内核中指默认的HID描述符优先
赞技术探讨,更赞独立解决问题!
【 在 dameng 的大作中提到: 】
: 同学,谢谢你了。我刚找到解决办法了:配置内核时,把“USB Human Interface Device (full HID) support”那一项去掉就好了。是不是因为系统把那个热插拔的消息截获后自己处理了,而没有执行我添加的驱动?我还不是很清楚。希望以后发帖子时,你再多给看看啊,呵呵。
对对,是打印出了chosen from 1 choice ,我原来都不知道HID什么意思,现在正在慢慢看。呵呵,以后有问题还要多向你请教啊
【 在 qzp 的大作中提到: 】
: USB驱动在定义接口描述符后
: 可以定义端点描述符或HID描述符,你的HID描述符没有定义
: 我猜日志中chosen from 1 choice
: ...................