主题 : usbmouse驱动问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 51213
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
综合积分: 54 分
注册时间: 2011-06-30
最后登录: 2013-02-01
楼主  发表于: 2012-04-13 17:11

 usbmouse驱动问题

之前signed char *mouse_buffer;定义为char *mouse_buffer,鼠标就是不行,鼠标动下小箭头就消失了,但鼠标按键是可以的,signed char *等价于char *,但我换成signed char *mouse_buffer就可以正常使用了。内核里自带的usbmouse.c  signed char *换成char *两个都可以 下面是我的代码

#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>

struct mouse {
    int pipe;
    int len;

    dma_addr_t mouse_dma_addr;
    struct usb_device *mouse_usb_dev;
    struct input_dev *mouse_input_dev;
    struct urb *mouse_urb;
};

//static struct mouse *usb_mouse;
static signed    char *mouse_buffer;

static void usb_mouse_irq (struct urb *urb)
{
    struct mouse *usb_mouse = urb->context;

#if 0
    int i;

    for (i=0; i<usb_mouse->len; i++) {
        printk ("%02x ", usb_mouse->mouse_buffer);
    }

    printk ("\n");
#endif
#if 1
    input_report_key (usb_mouse->mouse_input_dev, BTN_LEFT, mouse_buffer[0] & (1<<0));
    input_report_key (usb_mouse->mouse_input_dev, BTN_RIGHT, mouse_buffer[0] & (1<<1));
    input_report_key (usb_mouse->mouse_input_dev, BTN_MIDDLE, mouse_buffer[0] & (1<<2));
    input_report_rel (usb_mouse->mouse_input_dev, REL_X, mouse_buffer[1]);
    input_report_rel (usb_mouse->mouse_input_dev, REL_Y, mouse_buffer[2]);
    input_report_rel (usb_mouse->mouse_input_dev ,REL_WHEEL, mouse_buffer[3]);

    input_sync (usb_mouse->mouse_input_dev);
#endif
    usb_submit_urb (usb_mouse->mouse_urb, GFP_KERNEL);
}


static int usb_mouse_probe (struct usb_interface *intf, const struct usb_device_id *id)
{
    struct mouse *usb_mouse;

    struct usb_device *dev = interface_to_usbdev (intf);
    struct usb_host_interface *usb_mouse_interface;
    struct usb_endpoint_descriptor *usb_mouse_endpoint;

    usb_mouse = kzalloc (sizeof(struct mouse), GFP_KERNEL);
    if (usb_mouse == NULL) {
        printk ("can not kmalloc usb_mouse\n");
        return -ENOMEM;
    }

    usb_mouse_interface = intf->cur_altsetting;
    usb_mouse_endpoint = &usb_mouse_interface->endpoint[0].desc;

    usb_mouse->mouse_input_dev = input_allocate_device ();
    set_bit (EV_KEY, usb_mouse->mouse_input_dev->evbit);
    set_bit (EV_REL, usb_mouse->mouse_input_dev->evbit);

    set_bit (BTN_MOUSE, usb_mouse->mouse_input_dev->keybit);
    set_bit (BTN_LEFT, usb_mouse->mouse_input_dev->keybit);    
    set_bit (BTN_RIGHT, usb_mouse->mouse_input_dev->keybit);    
    set_bit (BTN_MIDDLE, usb_mouse->mouse_input_dev->keybit);    
    set_bit (REL_X, usb_mouse->mouse_input_dev->relbit);
    set_bit (REL_Y, usb_mouse->mouse_input_dev->relbit);
    set_bit (REL_WHEEL, usb_mouse->mouse_input_dev->relbit);

    

    usb_mouse->pipe = usb_rcvintpipe (dev, usb_mouse_endpoint->bEndpointAddress);
    usb_mouse->len = usb_mouse_endpoint->wMaxPacketSize;
    mouse_buffer = usb_buffer_alloc (dev, usb_mouse->len, GFP_ATOMIC, &usb_mouse->mouse_dma_addr);

    usb_mouse->mouse_urb = usb_alloc_urb (0, GFP_KERNEL);
    usb_fill_int_urb (usb_mouse->mouse_urb, dev, usb_mouse->pipe, mouse_buffer, usb_mouse->len, usb_mouse_irq, usb_mouse, usb_mouse_endpoint->bInterval);
    usb_mouse->mouse_urb->transfer_dma = usb_mouse->mouse_dma_addr;
    usb_mouse->mouse_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

    input_register_device (usb_mouse->mouse_input_dev);

    usb_submit_urb (usb_mouse->mouse_urb, GFP_KERNEL);

    usb_set_intfdata(intf, usb_mouse);

    return 0;
}

static void usb_mouse_disconnect (struct usb_interface *intf)
{
    struct usb_device *dev = interface_to_usbdev (intf);
    struct mouse *usb_mouse = usb_get_intfdata (intf);

    usb_set_intfdata(intf, NULL);
    
    usb_kill_urb (usb_mouse->mouse_urb);
    usb_free_urb (usb_mouse->mouse_urb);
    usb_buffer_free (dev, usb_mouse->len, mouse_buffer , usb_mouse->mouse_dma_addr);
    input_unregister_device (usb_mouse->mouse_input_dev);
    input_free_device (usb_mouse->mouse_input_dev);
    kfree (usb_mouse);
}

static struct usb_device_id usb_mouse_idtable[] = {
    { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
        USB_INTERFACE_PROTOCOL_MOUSE) },
    { }    /* Terminating entry */
};

static struct usb_driver usb_mouse_driver = {
    .name = "myusbmouse",
    .probe = usb_mouse_probe,
    .disconnect = usb_mouse_disconnect,
    .id_table = usb_mouse_idtable,
};

static int __init usbmouse_init (void)
{
    int ret;
    
    ret = usb_register (&usb_mouse_driver);
    if (ret) {
        printk ("can not register usbmouse driver\n");
    }

    return ret;
}

static void __exit usbmouse_exit (void)
{
    usb_deregister (&usb_mouse_driver);
}

module_init (usbmouse_init);
module_exit (usbmouse_exit);

MODULE_LICENSE ("GPL");