之前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");