2 This driver is based on Linux 2.5.75 usbmouse driver by Vojtech Pavlik
6 #include "../../usb_wrapper.h"
8 extern USBPORT_INTERFACE UsbPortInterface
;
13 struct usb_device
*usbdev
;
15 //struct input_dev dev;
23 static void usb_mouse_irq(struct urb
*urb
, struct pt_regs
*regs
)
25 struct usb_mouse
*mouse
= urb
->context
;
26 signed char *data
= mouse
->data
;
29 switch (urb
->status
) {
32 case -ECONNRESET
: /* unlink */
36 /* -EPIPE: should clear the halt */
41 input_regs(dev, regs);
43 input_report_key(dev, BTN_LEFT, data[0] & 0x01);
44 input_report_key(dev, BTN_RIGHT, data[0] & 0x02);
45 input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);
46 input_report_key(dev, BTN_SIDE, data[0] & 0x08);
47 input_report_key(dev, BTN_EXTRA, data[0] & 0x10);
49 input_report_rel(dev, REL_X, data[1]);
50 input_report_rel(dev, REL_Y, data[2]);
51 input_report_rel(dev, REL_WHEEL, data[3]);
57 MOUSE_INPUT_DATA MouseInputData
;
58 ULONG InputDataConsumed
;
60 MouseInputData
.Flags
= MOUSE_MOVE_RELATIVE
;
61 MouseInputData
.LastX
= data
[1];
62 MouseInputData
.LastY
= data
[2];
64 MouseInputData
.ButtonFlags
= 0;
65 MouseInputData
.ButtonData
= 0;
67 if ((data
[0] & 0x01) && ((mouse
->btn_old
& 0x01) != (data
[0] & 0x01)))
68 MouseInputData
.ButtonFlags
|= MOUSE_LEFT_BUTTON_DOWN
;
69 else if (!(data
[0] & 0x01) && ((mouse
->btn_old
& 0x01) != (data
[0] & 0x01)))
70 MouseInputData
.ButtonFlags
|= MOUSE_LEFT_BUTTON_UP
;
72 if ((data
[0] & 0x02) && ((mouse
->btn_old
& 0x02) != (data
[0] & 0x02)))
73 MouseInputData
.ButtonFlags
|= MOUSE_RIGHT_BUTTON_DOWN
;
74 else if (!(data
[0] & 0x02) && ((mouse
->btn_old
& 0x02) != (data
[0] & 0x02)))
75 MouseInputData
.ButtonFlags
|= MOUSE_RIGHT_BUTTON_UP
;
77 if ((data
[0] & 0x04) && ((mouse
->btn_old
& 0x04) != (data
[0] & 0x04)))
78 MouseInputData
.ButtonFlags
|= MOUSE_MIDDLE_BUTTON_DOWN
;
79 else if (!(data
[0] & 0x04) && ((mouse
->btn_old
& 0x04) != (data
[0] & 0x04)))
80 MouseInputData
.ButtonFlags
|= MOUSE_MIDDLE_BUTTON_UP
;
82 if ((data
[0] & 0x08) && ((mouse
->btn_old
& 0x08) != (data
[0] & 0x08)))
83 MouseInputData
.ButtonFlags
|= MOUSE_BUTTON_4_DOWN
;
84 else if (!(data
[0] & 0x08) && ((mouse
->btn_old
& 0x08) != (data
[0] & 0x08)))
85 MouseInputData
.ButtonFlags
|= MOUSE_BUTTON_4_UP
;
87 if ((data
[0] & 0x10) && ((mouse
->btn_old
& 0x10) != (data
[0] & 0x10)))
88 MouseInputData
.ButtonFlags
|= MOUSE_BUTTON_5_DOWN
;
89 else if (!(data
[0] & 0x10) && ((mouse
->btn_old
& 0x10) != (data
[0] & 0x10)))
90 MouseInputData
.ButtonFlags
|= MOUSE_BUTTON_5_UP
;
94 MouseInputData
.ButtonFlags
|= MOUSE_WHEEL
;
95 MouseInputData
.ButtonData
= data
[3];
98 if (UsbPortInterface
.MouseConnectData
->ClassService
)
102 KeRaiseIrql(DISPATCH_LEVEL
, &OldIrql
);
103 (*(PSERVICE_CALLBACK_ROUTINE
)UsbPortInterface
.MouseConnectData
->ClassService
)(
104 UsbPortInterface
.MouseConnectData
->ClassDeviceObject
,
108 KeLowerIrql(OldIrql
);
111 mouse
->btn_old
= data
[0];
114 printk("MouseInputData.Buttons=0x%03x\n", MouseInputData
.Buttons
);
117 printk("Mouse input: x %d, y %d, w %d, btn: 0x%02x\n", data
[1], data
[2], data
[3], data
[0]);
120 status
= usb_submit_urb (urb
, SLAB_ATOMIC
);
122 err ("can't resubmit intr, %s-%s/input0, status %d",
123 mouse
->usbdev
->bus
->bus_name
,
124 mouse
->usbdev
->devpath
, status
);
127 static int usb_mouse_open(struct input_dev *dev)
129 struct usb_mouse *mouse = dev->private;
134 mouse->irq->dev = mouse->usbdev;
135 if (usb_submit_urb(mouse->irq, GFP_KERNEL)) {
143 static void usb_mouse_close(struct input_dev *dev)
145 struct usb_mouse *mouse = dev->private;
148 usb_unlink_urb(mouse->irq);
152 static int usb_mouse_probe(struct usb_interface
* intf
, const struct usb_device_id
* id
)
154 struct usb_device
* dev
= interface_to_usbdev(intf
);
155 struct usb_host_interface
*interface
;
156 struct usb_endpoint_descriptor
*endpoint
;
157 struct usb_mouse
*mouse
;
162 interface
= &intf
->altsetting
[intf
->act_altsetting
];
164 if (interface
->desc
.bNumEndpoints
!= 1)
167 endpoint
= &interface
->endpoint
[0].desc
;
168 if (!(endpoint
->bEndpointAddress
& 0x80))
170 if ((endpoint
->bmAttributes
& 3) != 3)
173 pipe
= usb_rcvintpipe(dev
, endpoint
->bEndpointAddress
);
174 maxp
= usb_maxpacket(dev
, pipe
, usb_pipeout(pipe
));
176 if (!(mouse
= kmalloc(sizeof(struct usb_mouse
), GFP_KERNEL
)))
178 memset(mouse
, 0, sizeof(struct usb_mouse
));
180 mouse
->data
= usb_buffer_alloc(dev
, 8, SLAB_ATOMIC
, &mouse
->data_dma
);
186 mouse
->irq
= usb_alloc_urb(0, GFP_KERNEL
);
188 usb_buffer_free(dev
, 8, mouse
->data
, mouse
->data_dma
);
195 usb_make_path(dev
, path
, 64);
196 sprintf(mouse
->phys
, "%s/input0", path
);
198 if (!(buf
= kmalloc(63, GFP_KERNEL
))) {
199 usb_buffer_free(dev
, 8, mouse
->data
, mouse
->data_dma
);
204 if (dev
->descriptor
.iManufacturer
&&
205 usb_string(dev
, dev
->descriptor
.iManufacturer
, buf
, 63) > 0)
206 strcat(mouse
->name
, buf
);
207 if (dev
->descriptor
.iProduct
&&
208 usb_string(dev
, dev
->descriptor
.iProduct
, buf
, 63) > 0)
209 sprintf(mouse
->name
, "%s %s", mouse
->name
, buf
);
211 if (!strlen(mouse
->name
))
212 sprintf(mouse
->name
, "USB HIDBP Mouse %04x:%04x",
213 dev
->descriptor
.idVendor
, dev
->descriptor
.idProduct
);
217 usb_fill_int_urb(mouse
->irq
, dev
, pipe
, mouse
->data
,
218 (maxp
> 8 ? 8 : maxp
),
219 usb_mouse_irq
, mouse
, endpoint
->bInterval
);
220 //mouse->irq->transfer_dma = mouse->data_dma;
221 //mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
223 printk(KERN_INFO
"input: %s on %s\n", mouse
->name
, path
);
225 usb_set_intfdata(intf
, mouse
);
228 mouse
->irq
->dev
= mouse
->usbdev
;
229 if (usb_submit_urb(mouse
->irq
, GFP_KERNEL
)) {
238 static void usb_mouse_disconnect(struct usb_interface
*intf
)
240 struct usb_mouse
*mouse
= usb_get_intfdata (intf
);
242 usb_set_intfdata(intf
, NULL
);
243 usbprintk("Mouse disconnected\n ");
245 usb_unlink_urb(mouse
->irq
);
246 usb_free_urb(mouse
->irq
);
247 usb_buffer_free(interface_to_usbdev(intf
), 8, mouse
->data
, mouse
->data_dma
);
252 static struct usb_device_id usb_mouse_id_table
[] = {
253 { USB_INTERFACE_INFO(3, 1, 2) },
254 { } /* Terminating entry */
257 MODULE_DEVICE_TABLE (usb
, usb_mouse_id_table
);
259 static struct usb_driver usb_mouse_driver
= {
260 .owner
= THIS_MODULE
,
262 .probe
= usb_mouse_probe
,
263 .disconnect
= usb_mouse_disconnect
,
264 .id_table
= usb_mouse_id_table
,
267 void UsbMouseInit(void)
269 if (usb_register(&usb_mouse_driver
) < 0) {
271 printk("Unable to register Mouse driver");
277 void UsbMouseRemove(void) {
278 usb_deregister(&usb_mouse_driver
);