📄 wacom.c
字号:
case 0x096: wacom->tool[idx] = BTN_TOOL_LENS; break; /* Lens cursor */ case 0x82a: case 0x85a: case 0x91a: case 0x0fa: wacom->tool[idx] = BTN_TOOL_RUBBER; break; /* Eraser */ case 0x112: wacom->tool[idx] = BTN_TOOL_AIRBRUSH; break; /* Airbrush */ default: wacom->tool[idx] = BTN_TOOL_PEN; break; /* Unknown tool */ } input_report_key(dev, wacom->tool[idx], 1); input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); return; } if ((data[1] & 0xfe) == 0x80) { /* Exit report */ input_report_key(dev, wacom->tool[idx], 0); input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); return; } input_report_abs(dev, ABS_X, ((__u32)data[2] << 8) | data[3]); input_report_abs(dev, ABS_Y, ((__u32)data[4] << 8) | data[5]); input_report_abs(dev, ABS_DISTANCE, data[9] >> 4); if ((data[1] & 0xb8) == 0xa0) { /* general pen packet */ input_report_abs(dev, ABS_PRESSURE, t = ((__u32)data[6] << 2) | ((data[7] >> 6) & 3)); input_report_abs(dev, ABS_TILT_X, ((data[7] << 1) & 0x7e) | (data[8] >> 7)); input_report_abs(dev, ABS_TILT_Y, data[8] & 0x7f); input_report_key(dev, BTN_STYLUS, data[1] & 2); input_report_key(dev, BTN_STYLUS2, data[1] & 4); input_report_key(dev, BTN_TOUCH, t > 10); } if ((data[1] & 0xbc) == 0xb4) { /* airbrush second packet */ input_report_abs(dev, ABS_WHEEL, ((__u32)data[6] << 2) | ((data[7] >> 6) & 3)); input_report_abs(dev, ABS_TILT_X, ((data[7] << 1) & 0x7e) | (data[8] >> 7)); input_report_abs(dev, ABS_TILT_Y, data[8] & 0x7f); } if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0) { /* 4D mouse or Lens cursor packets */ if (data[1] & 0x02) { /* Rotation packet */ input_report_abs(dev, ABS_RZ, (data[7] & 0x20) ? ((__u32)data[6] << 2) | ((data[7] >> 6) & 3): (-(((__u32)data[6] << 2) | ((data[7] >> 6) & 3))) - 1); } else { input_report_key(dev, BTN_LEFT, data[8] & 0x01); input_report_key(dev, BTN_MIDDLE, data[8] & 0x02); input_report_key(dev, BTN_RIGHT, data[8] & 0x04); if ((data[1] & 0x10) == 0) { /* 4D mouse packets */ input_report_key(dev, BTN_SIDE, data[8] & 0x20); input_report_key(dev, BTN_EXTRA, data[8] & 0x10); input_report_abs(dev, ABS_THROTTLE, (data[8] & 0x08) ? ((__u32)data[6] << 2) | ((data[7] >> 6) & 3) : -((__u32)data[6] << 2) | ((data[7] >> 6) & 3)); } else { /* Lens cursor packets */ input_report_key(dev, BTN_SIDE, data[8] & 0x10); input_report_key(dev, BTN_EXTRA, data[8] & 0x08); } } } input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);}#define WACOM_INTUOS_TOOLS (BIT(BTN_TOOL_BRUSH) | BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS))#define WACOM_INTUOS_BUTTONS (BIT(BTN_SIDE) | BIT(BTN_EXTRA))#define WACOM_INTUOS_ABS (BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE))struct wacom_features wacom_features[] = { { "Wacom Penpartner", 7, 5040, 3780, 255, 32, wacom_penpartner_irq, 0, 0, 0, 0 }, { "Wacom Graphire", 8, 10206, 7422, 511, 32, wacom_graphire_irq, BIT(EV_REL), 0, BIT(REL_WHEEL), 0 }, { "Wacom Graphire2 4x5", 8, 10206, 7422, 511, 32, wacom_graphire_irq, BIT(EV_REL), 0, BIT(REL_WHEEL), 0 }, { "Wacom Graphire2 5x7", 8, 10206, 7422, 511, 32, wacom_graphire_irq, BIT(EV_REL), 0, BIT(REL_WHEEL), 0 }, { "Wacom Intuos 4x5", 10, 12700, 10360, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos 6x8", 10, 20320, 15040, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos 9x12", 10, 30480, 23060, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos 12x12", 10, 30480, 30480, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos 12x18", 10, 47720, 30480, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom PL400", 8, 12328, 9256, 511, 32, wacom_pl_irq, 0, 0, 0, 0 }, { "Wacom PL500", 8, 12328, 9256, 511, 32, wacom_pl_irq, 0, 0, 0, 0 }, { "Wacom PL600", 8, 12328, 9256, 511, 32, wacom_pl_irq, 0, 0, 0, 0 }, { "Wacom PL600SX", 8, 12328, 9256, 511, 32, wacom_pl_irq, 0, 0, 0, 0 }, { "Wacom PL550", 8, 12328, 9256, 511, 32, wacom_pl_irq, 0, 0, 0, 0 }, { "Wacom PL800", 8, 12328, 9256, 511, 32, wacom_pl_irq, 0, 0, 0, 0 }, { "Wacom Intuos2 4x5", 10, 12700, 10360, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos2 6x8", 10, 20320, 15040, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos2 9x12", 10, 30480, 23060, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos2 12x12", 10, 30480, 30480, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { "Wacom Intuos2 12x18", 10, 47720, 30480, 1023, 15, wacom_intuos_irq, 0, WACOM_INTUOS_ABS, 0, WACOM_INTUOS_BUTTONS, WACOM_INTUOS_TOOLS }, { NULL , 0 }};struct usb_device_id wacom_ids[] = { { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x00), driver_info: 0 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x10), driver_info: 1 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x11), driver_info: 2 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12), driver_info: 3 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20), driver_info: 4 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21), driver_info: 5 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22), driver_info: 6 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x23), driver_info: 7 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x24), driver_info: 8 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x30), driver_info: 9 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x31), driver_info: 10 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x32), driver_info: 11 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33), driver_info: 12 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34), driver_info: 13 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35), driver_info: 14 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41), driver_info: 15 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42), driver_info: 16 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43), driver_info: 17 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44), driver_info: 18 }, { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45), driver_info: 19 }, { }};MODULE_DEVICE_TABLE(usb, wacom_ids);static int wacom_open(struct input_dev *dev){ struct wacom *wacom = dev->private; if (wacom->open++) return 0; wacom->irq.dev = wacom->usbdev; if (usb_submit_urb(&wacom->irq)) return -EIO; return 0;}static void wacom_close(struct input_dev *dev){ struct wacom *wacom = dev->private; if (!--wacom->open) usb_unlink_urb(&wacom->irq);}static void *wacom_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id){ struct usb_endpoint_descriptor *endpoint; struct wacom *wacom; char rep_data[2] = {0x02, 0x02}; if (!(wacom = kmalloc(sizeof(struct wacom), GFP_KERNEL))) return NULL; memset(wacom, 0, sizeof(struct wacom)); wacom->features = wacom_features + id->driver_info; wacom->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC) | wacom->features->evbit; wacom->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) | BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | wacom->features->absbit; wacom->dev.relbit[0] |= wacom->features->relbit; wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | wacom->features->btnbit; wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2) | wacom->features->digibit; wacom->dev.mscbit[0] |= BIT(MSC_SERIAL); wacom->dev.absmax[ABS_X] = wacom->features->x_max; wacom->dev.absmax[ABS_Y] = wacom->features->y_max; wacom->dev.absmax[ABS_PRESSURE] = wacom->features->pressure_max; wacom->dev.absmax[ABS_DISTANCE] = wacom->features->distance_max; wacom->dev.absmax[ABS_TILT_X] = 127; wacom->dev.absmax[ABS_TILT_Y] = 127; wacom->dev.absmax[ABS_WHEEL] = 1023; wacom->dev.absmin[ABS_RZ] = -900; wacom->dev.absmax[ABS_RZ] = 899; wacom->dev.absmin[ABS_THROTTLE] = -1023; wacom->dev.absmax[ABS_THROTTLE] = 1023; wacom->dev.absfuzz[ABS_X] = 4; wacom->dev.absfuzz[ABS_Y] = 4; wacom->dev.private = wacom; wacom->dev.open = wacom_open; wacom->dev.close = wacom_close; wacom->dev.name = wacom->features->name; wacom->dev.idbus = BUS_USB; wacom->dev.idvendor = dev->descriptor.idVendor; wacom->dev.idproduct = dev->descriptor.idProduct; wacom->dev.idversion = dev->descriptor.bcdDevice; wacom->usbdev = dev; endpoint = dev->config[0].interface[ifnum].altsetting[0].endpoint + 0; usb_set_idle(dev, dev->config[0].interface[ifnum].altsetting[0].bInterfaceNumber, 0, 0); FILL_INT_URB(&wacom->irq, dev, usb_rcvintpipe(dev, endpoint->bEndpointAddress), wacom->data, wacom->features->pktlen, wacom->features->irq, wacom, endpoint->bInterval); input_register_device(&wacom->dev); /* ask the tablet to report tablet data */ usb_set_report(dev, ifnum, 3, 2, rep_data, 2); usb_set_report(dev, ifnum, 3, 5, rep_data, 0); usb_set_report(dev, ifnum, 3, 6, rep_data, 0); printk(KERN_INFO "input%d: %s on usb%d:%d.%d\n", wacom->dev.number, wacom->features->name, dev->bus->busnum, dev->devnum, ifnum); return wacom;}static void wacom_disconnect(struct usb_device *dev, void *ptr){ struct wacom *wacom = ptr; usb_unlink_urb(&wacom->irq); input_unregister_device(&wacom->dev); kfree(wacom);}static struct usb_driver wacom_driver = { name: "wacom", probe: wacom_probe, disconnect: wacom_disconnect, id_table: wacom_ids,};static int __init wacom_init(void){ usb_register(&wacom_driver); info(DRIVER_VERSION " " DRIVER_AUTHOR); info(DRIVER_DESC); return 0;}static void __exit wacom_exit(void){ usb_deregister(&wacom_driver);}module_init(wacom_init);module_exit(wacom_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -