- Support for other hardware - ssr comment in the mouse array. - Use of defines for numeric constants to improve code readability. - Debian patch integrated diff -Nuar --exclude '*~' lomoco-1.0.old/src/lomoco.c lomoco-1.0/src/lomoco.c --- lomoco-1.0.old/src/lomoco.c 2006-03-01 06:10:05.000000000 -0800 +++ lomoco-1.0/src/lomoco.c 2006-04-30 02:38:05.107430674 -0700 @@ -32,11 +32,12 @@ * model: you can find on the hardware, look for M/N: ... * csr: mouse with receiver (wireless) * res: mouse has resolution control - * sms: mouse has smart control + * ssr: mouse has smart scroll reporting + * sms: mouse has smart scroll * dual: dual receiver (wireless mouse+wireless keyboard) * * product id, name, model, csr, res, ssr, sms, dual */ -mouse_t mice [] = { +static mouse_t mice [] = { {0xc00e, "Wheel Mouse Optical", "M-BJ58", 0, 1, 0, 0, 0}, {0xc00f, "MouseMan Traveler", "M-BJ79", 0, 1, 0, 0, 0}, {0xc012, "MouseMan Dual Optical", "M-BL63B", 0, 1, 0, 0, 0}, @@ -42,6 +42,7 @@ {0xc012, "MouseMan Dual Optical", "M-BL63B", 0, 1, 0, 0, 0}, {0xc01d, "MX510 Optical Mouse", "M-BS81A", 0, 1, 1, 1, 0}, {0xc01e, "MX518 Optical Mouse", "M-BS81A", 0, 1, 1, 0, 0}, + {0xc051, "MX518 Optical Mouse", "M-BS81A", 0, 1, 1, 0, 0}, {0xc024, "MX300 Optical Mouse", "M-BP82", 0, 1, 0, 0, 0}, {0xc01b, "MX310 Optical Mouse", "M-BP86", 0, 1, 0, 0, 0}, {0xc025, "MX500 Optical Mouse", "M-BP81A", 0, 1, 1, 1, 0}, @@ -49,50 +50,37 @@ {0xc041, "G5 Laser Gaming Mouse", "M-UAC113", 0, 1, 0, 1, 0}, {0xc501, "Mouse Receiver", "C-BA4-MSE", 1, 0, 0, 0, 0}, {0xc502, "Dual Receiver", "C-UA3-DUAL", 1, 0, 0, 0, 1}, - {0xc503, "Receiver for MX900 Receiver", "C-UJ16A", 1, 0, 0, 1, 0}, + {0xc503, "Receiver for MX900", "C-UJ16A", 1, 0, 0, 1, 0}, {0xc504, "Receiver for Cordless Freedom Optical", "C-BD9-DUAL", 1, 0, 0, 0, 1}, {0xc505, "Receiver for Cordless Elite Duo", "C-BG17-DUAL", 1, 0, 0, 0, 1}, {0xc506, "Receiver for MX700 Optical Mouse", "C-BF16-MSE", 1, 0, 0, 1, 0}, {0xc508, "Receiver for Cordless Optical TrackMan", "C-BA4-MSE", 1, 0, 0, 1, 0}, - {0xc702, "Receiver for Cordless Presenter", "C-UF15", 1, 0, 0, 0, 0}, - {0xc704, "Receiver for diNovo Media Desktop", "C-BQ16A", 1, 0, 1, 1, 0}, + + /* From Michele Noberasco */ + {0xc50a, "Reciveer for Cordless Optical Mouse for Notebooks", "C-BJ27-MSE", 1, 0, 0, 0, 0}, + + /* From Robin H. Johnson */ + {0xc50b, "Receiver for Cordless Desktop MX", "C-BK16A-DUAL",1, 0, 0, 1, 1}, + /* From Markus Wiesner */ {0xc50e, "Receiver for MX1000 Laser", "C-BN34", 1, 0, 1, 1, 0}, {0xc512, "Receiver for Cordless Desktop MX3100 Laser", "C-BO34", 1, 0, 0, 1, 1}, + + {0xc702, "Receiver for Cordless Presenter", "C-UF15", 1, 0, 0, 0, 0}, + {0xc704, "Receiver for diNovo Media Desktop", "C-BQ16A", 1, 0, 1, 1, 0}, {0x0000, NULL, NULL, 0, 0, 0, 0} }; - /* - * Description: Query the mouse and report all cordless mouse specific infos + * Description: Print out a set of CSR data * e.g. receiver type, mouse type, battery status * - * Parameters: mouse_t *m - * mouse struct with the mouse specs - * struct usb_dev_handle *handle - * usb device handle of the mouse - * unsigned int addr - * address for dual receivers + * Parameters: unsigned char* buf + * result from query_csr internals * * Return: void */ -static void query_csr(mouse_t *m, struct usb_dev_handle *handle, - unsigned int addr) { - unsigned char buf[12] = {0}; - - if (usb_control_msg ( handle, - USB_TYPE_VENDOR | USB_ENDPOINT_IN, - 0x09, - (0x0003 | addr), - (0x0000 | addr), - (char *) buf, - 8, - TIMEOUT ) != 8) { - - perror("Writing to USB device: CSR"); - exit(EXIT_FAILURE); - } - +static void print_csr(unsigned char* buf) { /* We have not obtained blocks P6 P0 P4 P5 P8 P9 PB0 PB1 */ /* Is a C504 receiver busy? */ @@ -111,6 +99,7 @@ case 0x3c: printf ("C508\n"); break; case 0x3d: printf ("C506\n"); break; case 0x3e: printf ("C505\n"); break; + case 0x3f: printf ("C50B\n"); break; case 0x42: printf ("C512\n"); break; default: printf ("Unknown (type %x)\n", P0); } @@ -138,6 +127,7 @@ case 0x82: printf ("Cordless Optical TrackMan\n"); break; case 0x8A: printf ("MX700 Cordless Optical Mouse\n"); break; case 0x8B: printf ("MX700 Cordless Optical Mouse (2ch)\n"); break; + case 0x94: printf ("Cordless Optical Mouse for Notebooks\n"); break; default: printf ("Unknown (type %x)\n", P4); } @@ -199,6 +189,38 @@ } } +/* + * Description: Query the mouse and report all cordless mouse specific infos + * e.g. receiver type, mouse type, battery status + * + * Parameters: mouse_t *m + * mouse struct with the mouse specs + * struct usb_dev_handle *handle + * usb device handle of the mouse + * unsigned int addr + * address for dual receivers + * + * Return: void + */ +static void query_csr(mouse_t *m, struct usb_dev_handle *handle, + unsigned int addr) { + unsigned char buf[12] = {0}; + + if (usb_control_msg ( handle, + USB_TYPE_VENDOR | USB_ENDPOINT_IN, + REQUEST_MOUSE_CSR, + (0x0003 | addr), + (0x0000 | addr), + (char *) buf, + 8, + TIMEOUT ) != 8) { + + perror("Writing to USB device: CSR"); + exit(EXIT_FAILURE); + } + print_csr(buf); + +} /* * Description: Query the mouse and report the current resolution @@ -218,8 +240,8 @@ if (usb_control_msg ( handle, USB_TYPE_VENDOR | USB_ENDPOINT_IN, - 0x01, - (0x000e | addr), + REQUEST_MOUSE_GET_RES_SSR, + (VALUE_MOUSE_GET_RES | addr), (0x0000 | addr), (char *) buf, 1, @@ -255,8 +277,8 @@ if (m->has_ssr) { if (usb_control_msg ( handle, USB_TYPE_VENDOR | USB_ENDPOINT_IN, - 0x01, - (0x0017 | addr), + REQUEST_MOUSE_GET_RES_SSR, + (VALUE_MOUSE_GET_SSR | addr), (0x0000 | addr), (char*) buf, 1, @@ -394,8 +416,8 @@ assert ((set_channel == 1) || (set_channel == 2)); if (usb_control_msg ( handle, USB_TYPE_VENDOR, - 0x02, - (0x0008 | addr), + REQUEST_MOUSE_PUT_RES_SMS, + (VALUE_MOUSE_CHANNEL | addr), ((set_channel - 1) | addr), NULL, 0, @@ -412,8 +434,8 @@ if (set_unlock) { if (usb_control_msg ( handle, USB_TYPE_VENDOR, - 0x02, - (0x06 | addr), + REQUEST_MOUSE_PUT_RES_SMS, + (VALUE_MOUSE_UNLOCK | addr), (0x1 | addr), NULL, 0, @@ -430,8 +452,8 @@ if (set_lock) { if (usb_control_msg ( handle, USB_TYPE_VENDOR, - 0x02, - (0x0006 | addr), + REQUEST_MOUSE_PUT_RES_SMS, + (VALUE_MOUSE_UNLOCK | addr), (0x0000 | addr), NULL, 0, @@ -448,8 +470,8 @@ if (set_clear) { if (usb_control_msg ( handle, USB_TYPE_VENDOR, - 0x09, - (0x0004 | addr), + REQUEST_MOUSE_CSR, + (VALUE_MOUSE_CLEAR | addr), (0x0000 | addr), NULL, 0, @@ -483,8 +505,8 @@ if (usb_control_msg ( handle, USB_TYPE_VENDOR, - 0x0002, - 0x000e, + REQUEST_MOUSE_PUT_RES_SMS, + VALUE_MOUSE_PUT_RES, (set_res / 400) + 2, NULL, 0, @@ -514,8 +536,8 @@ assert ((set_sms == 1) || (set_sms == -1)); if (usb_control_msg ( handle, USB_TYPE_VENDOR, - 0x02, - 0x0017, + REQUEST_MOUSE_PUT_RES_SMS, + VALUE_MOUSE_PUT_SSR, (set_sms == 1 ? 0x0001 : 0x0000), NULL, 0, @@ -641,7 +663,7 @@ /* Do we support this device? If so, list it. */ if ((m = find_mouse (device)) != NULL) { - printf ("%s.%s: %04x:%04x %s (%s) Caps: %s%s%s\n", + printf ("%s.%s: %04x:%04x %s (%s) Caps: %s%s%s%s\n", device->bus->dirname, device->filename, device->descriptor.idVendor, @@ -650,6 +672,7 @@ m->model, m->has_csr? "CSR ": "", m->has_res? "RES ": "", + m->has_ssr? "SSR ": "", m->has_sms? "SMS ": "" ); } @@ -667,7 +671,7 @@ device->filename, device->descriptor.idVendor, device->descriptor.idProduct, - ret ? product : "Unknown" + ret > 0 ? product : "Unknown" ); continue; } diff -Nuar --exclude '*~' lomoco-1.0.old/src/lomoco.h lomoco-1.0/src/lomoco.h --- lomoco-1.0.old/src/lomoco.h 2006-03-01 06:10:05.000000000 -0800 +++ lomoco-1.0/src/lomoco.h 2006-04-30 02:34:04.381175920 -0700 @@ -97,4 +97,17 @@ int is_dual; } mouse_t; + +#define REQUEST_MOUSE_CSR 0x09 +#define VALUE_MOUSE_GET 0x0003 +#define VALUE_MOUSE_CLEAR 0x0004 +#define REQUEST_MOUSE_GET_RES_SSR 0x01 +#define VALUE_MOUSE_GET_RES 0x000e +#define VALUE_MOUSE_GET_SSR 0x0017 +#define REQUEST_MOUSE_PUT_RES_SMS 0x02 +#define VALUE_MOUSE_UNLOCK 0x0006 +#define VALUE_MOUSE_CHANNEL 0x0008 +#define VALUE_MOUSE_PUT_RES 0x000e +#define VALUE_MOUSE_PUT_SSR 0x0017 + #endif /* __LOMOCO_H */