Move drivers to the right location
[reactos.git] / reactos / drivers / usb / usbport / core_drivers / usbmouse.c
1 /*
2 This driver is based on Linux 2.5.75 usbmouse driver by Vojtech Pavlik
3 */
4
5 #define NDEBUG
6 #include "../../usb_wrapper.h"
7
8 extern USBPORT_INTERFACE UsbPortInterface;
9
10 struct usb_mouse {
11 char name[128];
12 char phys[64];
13 struct usb_device *usbdev;
14 char btn_old;
15 //struct input_dev dev;
16 struct urb *irq;
17 int open;
18
19 signed char *data;
20 dma_addr_t data_dma;
21 };
22
23 static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs)
24 {
25 struct usb_mouse *mouse = urb->context;
26 signed char *data = mouse->data;
27 int status;
28
29 switch (urb->status) {
30 case 0: /* success */
31 break;
32 case -ECONNRESET: /* unlink */
33 case -ENOENT:
34 case -ESHUTDOWN:
35 return;
36 /* -EPIPE: should clear the halt */
37 default: /* error */
38 goto resubmit;
39 }
40 /*
41 input_regs(dev, regs);
42
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);
48
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]);
52
53 input_sync(dev);
54 */
55
56 {
57 MOUSE_INPUT_DATA MouseInputData;
58 ULONG InputDataConsumed;
59
60 MouseInputData.Flags = MOUSE_MOVE_RELATIVE;
61 MouseInputData.LastX = data[1];
62 MouseInputData.LastY = data[2];
63
64 MouseInputData.ButtonFlags = 0;
65 MouseInputData.ButtonData = 0;
66
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;
71
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;
76
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;
81
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;
86
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;
91
92 if (data[3])
93 {
94 MouseInputData.ButtonFlags |= MOUSE_WHEEL;
95 MouseInputData.ButtonData = data[3];
96 }
97
98 if (UsbPortInterface.MouseConnectData->ClassService)
99 {
100 KIRQL OldIrql;
101
102 KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
103 (*(PSERVICE_CALLBACK_ROUTINE)UsbPortInterface.MouseConnectData->ClassService)(
104 UsbPortInterface.MouseConnectData->ClassDeviceObject,
105 &MouseInputData,
106 (&MouseInputData)+1,
107 &InputDataConsumed);
108 KeLowerIrql(OldIrql);
109 }
110
111 mouse->btn_old = data[0];
112
113 // debug info
114 printk("MouseInputData.Buttons=0x%03x\n", MouseInputData.Buttons);
115 }
116
117 printk("Mouse input: x %d, y %d, w %d, btn: 0x%02x\n", data[1], data[2], data[3], data[0]);
118
119 resubmit:
120 status = usb_submit_urb (urb, SLAB_ATOMIC);
121 if (status)
122 err ("can't resubmit intr, %s-%s/input0, status %d",
123 mouse->usbdev->bus->bus_name,
124 mouse->usbdev->devpath, status);
125 }
126 /*
127 static int usb_mouse_open(struct input_dev *dev)
128 {
129 struct usb_mouse *mouse = dev->private;
130
131 if (mouse->open++)
132 return 0;
133
134 mouse->irq->dev = mouse->usbdev;
135 if (usb_submit_urb(mouse->irq, GFP_KERNEL)) {
136 mouse->open--;
137 return -EIO;
138 }
139
140 return 0;
141 }
142
143 static void usb_mouse_close(struct input_dev *dev)
144 {
145 struct usb_mouse *mouse = dev->private;
146
147 if (!--mouse->open)
148 usb_unlink_urb(mouse->irq);
149 }
150 */
151
152 static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_id * id)
153 {
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;
158 int pipe, maxp;
159 char path[64];
160 char *buf;
161
162 interface = &intf->altsetting[intf->act_altsetting];
163
164 if (interface->desc.bNumEndpoints != 1)
165 return -ENODEV;
166
167 endpoint = &interface->endpoint[0].desc;
168 if (!(endpoint->bEndpointAddress & 0x80))
169 return -ENODEV;
170 if ((endpoint->bmAttributes & 3) != 3)
171 return -ENODEV;
172
173 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
174 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
175
176 if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL)))
177 return -ENOMEM;
178 memset(mouse, 0, sizeof(struct usb_mouse));
179
180 mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);
181 if (!mouse->data) {
182 kfree(mouse);
183 return -ENOMEM;
184 }
185
186 mouse->irq = usb_alloc_urb(0, GFP_KERNEL);
187 if (!mouse->irq) {
188 usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
189 kfree(mouse);
190 return -ENODEV;
191 }
192
193 mouse->usbdev = dev;
194
195 usb_make_path(dev, path, 64);
196 sprintf(mouse->phys, "%s/input0", path);
197
198 if (!(buf = kmalloc(63, GFP_KERNEL))) {
199 usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
200 kfree(mouse);
201 return -ENOMEM;
202 }
203
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);
210
211 if (!strlen(mouse->name))
212 sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x",
213 dev->descriptor.idVendor, dev->descriptor.idProduct);
214
215 kfree(buf);
216
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;
222
223 printk(KERN_INFO "input: %s on %s\n", mouse->name, path);
224
225 usb_set_intfdata(intf, mouse);
226
227 // Open device
228 mouse->irq->dev = mouse->usbdev;
229 if (usb_submit_urb(mouse->irq, GFP_KERNEL)) {
230 return -EIO;
231 }
232
233 mouse->btn_old = 0;
234
235 return 0;
236 }
237
238 static void usb_mouse_disconnect(struct usb_interface *intf)
239 {
240 struct usb_mouse *mouse = usb_get_intfdata (intf);
241
242 usb_set_intfdata(intf, NULL);
243 usbprintk("Mouse disconnected\n ");
244 if (mouse) {
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);
248 kfree(mouse);
249 }
250 }
251
252 static struct usb_device_id usb_mouse_id_table [] = {
253 { USB_INTERFACE_INFO(3, 1, 2) },
254 { } /* Terminating entry */
255 };
256
257 MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);
258
259 static struct usb_driver usb_mouse_driver = {
260 .owner = THIS_MODULE,
261 .name = "usbmouse",
262 .probe = usb_mouse_probe,
263 .disconnect = usb_mouse_disconnect,
264 .id_table = usb_mouse_id_table,
265 };
266
267 void UsbMouseInit(void)
268 {
269 if (usb_register(&usb_mouse_driver) < 0) {
270 #if mousedebug
271 printk("Unable to register Mouse driver");
272 #endif
273 return;
274 }
275 }
276
277 void UsbMouseRemove(void) {
278 usb_deregister(&usb_mouse_driver);
279 }