📄 usbtouchscreen.c
字号:
.min_xc = 0x0, .max_xc = 0x07ff, .min_yc = 0x0, .max_yc = 0x07ff, .rept_size = 16, .flags = USBTOUCH_FLG_BUFFER, .process_pkt = egalax_process, .read_data = egalax_read_data, },#endif#ifdef CONFIG_USB_TOUCHSCREEN_PANJIT [DEVTYPE_PANJIT] = { .min_xc = 0x0, .max_xc = 0x0fff, .min_yc = 0x0, .max_yc = 0x0fff, .rept_size = 8, .read_data = panjit_read_data, },#endif#ifdef CONFIG_USB_TOUCHSCREEN_3M [DEVTYPE_3M] = { .min_xc = 0x0, .max_xc = 0x4000, .min_yc = 0x0, .max_yc = 0x4000, .rept_size = 11, .read_data = mtouch_read_data, .init = mtouch_init, },#endif#ifdef CONFIG_USB_TOUCHSCREEN_ITM [DEVTYPE_ITM] = { .min_xc = 0x0, .max_xc = 0x0fff, .min_yc = 0x0, .max_yc = 0x0fff, .max_press = 0xff, .rept_size = 8, .read_data = itm_read_data, },#endif};/***************************************************************************** * Generic Part */static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, struct pt_regs *regs, unsigned char *pkt, int len){ int x, y, touch, press; struct usbtouch_device_info *type = usbtouch->type; if (!type->read_data(pkt, &x, &y, &touch, &press)) return; input_regs(usbtouch->input, regs); input_report_key(usbtouch->input, BTN_TOUCH, touch); if (swap_xy) { input_report_abs(usbtouch->input, ABS_X, y); input_report_abs(usbtouch->input, ABS_Y, x); } else { input_report_abs(usbtouch->input, ABS_X, x); input_report_abs(usbtouch->input, ABS_Y, y); } if (type->max_press) input_report_abs(usbtouch->input, ABS_PRESSURE, press); input_sync(usbtouch->input);}static void usbtouch_irq(struct urb *urb, struct pt_regs *regs){ struct usbtouch_usb *usbtouch = urb->context; int retval; switch (urb->status) { case 0: /* success */ break; case -ETIMEDOUT: /* this urb is timing out */ dbg("%s - urb timed out - was the device unplugged?", __FUNCTION__); return; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; default: dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); goto exit; } usbtouch->type->process_pkt(usbtouch, regs, usbtouch->data, urb->actual_length);exit: retval = usb_submit_urb(urb, GFP_ATOMIC); if (retval) err("%s - usb_submit_urb failed with result: %d", __FUNCTION__, retval);}static int usbtouch_open(struct input_dev *input){ struct usbtouch_usb *usbtouch = input->private; usbtouch->irq->dev = usbtouch->udev; if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) return -EIO; return 0;}static void usbtouch_close(struct input_dev *input){ struct usbtouch_usb *usbtouch = input->private; usb_kill_urb(usbtouch->irq);}static void usbtouch_free_buffers(struct usb_device *udev, struct usbtouch_usb *usbtouch){ if (usbtouch->data) usb_buffer_free(udev, usbtouch->type->rept_size, usbtouch->data, usbtouch->data_dma); kfree(usbtouch->buffer);}static int usbtouch_probe(struct usb_interface *intf, const struct usb_device_id *id){ struct usbtouch_usb *usbtouch; struct input_dev *input_dev; struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct usb_device *udev = interface_to_usbdev(intf); struct usbtouch_device_info *type; int err; interface = intf->cur_altsetting; endpoint = &interface->endpoint[0].desc; usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); input_dev = input_allocate_device(); if (!usbtouch || !input_dev) goto out_free; type = &usbtouch_dev_info[id->driver_info]; usbtouch->type = type; if (!type->process_pkt) type->process_pkt = usbtouch_process_pkt; usbtouch->data = usb_buffer_alloc(udev, type->rept_size, SLAB_KERNEL, &usbtouch->data_dma); if (!usbtouch->data) goto out_free; if (type->flags & USBTOUCH_FLG_BUFFER) { usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL); if (!usbtouch->buffer) goto out_free_buffers; } usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); if (!usbtouch->irq) { dbg("%s - usb_alloc_urb failed: usbtouch->irq", __FUNCTION__); goto out_free_buffers; } usbtouch->udev = udev; usbtouch->input = input_dev; if (udev->manufacturer) strlcpy(usbtouch->name, udev->manufacturer, sizeof(usbtouch->name)); if (udev->product) { if (udev->manufacturer) strlcat(usbtouch->name, " ", sizeof(usbtouch->name)); strlcat(usbtouch->name, udev->product, sizeof(usbtouch->name)); } if (!strlen(usbtouch->name)) snprintf(usbtouch->name, sizeof(usbtouch->name), "USB Touchscreen %04x:%04x", le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idProduct)); usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys)); strlcpy(usbtouch->phys, "/input0", sizeof(usbtouch->phys)); input_dev->name = usbtouch->name; input_dev->phys = usbtouch->phys; usb_to_input_id(udev, &input_dev->id); input_dev->cdev.dev = &intf->dev; input_dev->private = usbtouch; input_dev->open = usbtouch_open; input_dev->close = usbtouch_close; input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); input_set_abs_params(input_dev, ABS_X, type->min_xc, type->max_xc, 0, 0); input_set_abs_params(input_dev, ABS_Y, type->min_yc, type->max_yc, 0, 0); if (type->max_press) input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press, type->max_press, 0, 0); usb_fill_int_urb(usbtouch->irq, usbtouch->udev, usb_rcvintpipe(usbtouch->udev, 0x81), usbtouch->data, type->rept_size, usbtouch_irq, usbtouch, endpoint->bInterval); usbtouch->irq->transfer_dma = usbtouch->data_dma; usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; /* device specific init */ if (type->init) { err = type->init(usbtouch); if (err) { dbg("%s - type->init() failed, err: %d", __FUNCTION__, err); goto out_free_buffers; } } err = input_register_device(usbtouch->input); if (err) { dbg("%s - input_register_device failed, err: %d", __FUNCTION__, err); goto out_free_buffers; } usb_set_intfdata(intf, usbtouch); return 0;out_free_buffers: usbtouch_free_buffers(udev, usbtouch);out_free: input_free_device(input_dev); kfree(usbtouch); return -ENOMEM;}static void usbtouch_disconnect(struct usb_interface *intf){ struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); dbg("%s - called", __FUNCTION__); if (!usbtouch) return; dbg("%s - usbtouch is initialized, cleaning up", __FUNCTION__); usb_set_intfdata(intf, NULL); usb_kill_urb(usbtouch->irq); input_unregister_device(usbtouch->input); usb_free_urb(usbtouch->irq); usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch); kfree(usbtouch);}MODULE_DEVICE_TABLE(usb, usbtouch_devices);static struct usb_driver usbtouch_driver = { .name = "usbtouchscreen", .probe = usbtouch_probe, .disconnect = usbtouch_disconnect, .id_table = usbtouch_devices,};static int __init usbtouch_init(void){ return usb_register(&usbtouch_driver);}static void __exit usbtouch_cleanup(void){ usb_deregister(&usbtouch_driver);}module_init(usbtouch_init);module_exit(usbtouch_cleanup);MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");MODULE_ALIAS("touchkitusb");MODULE_ALIAS("itmtouch");MODULE_ALIAS("mtouchusb");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -