⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbtouchscreen.c

📁 usb driver for 2.6.17
💻 C
📖 第 1 页 / 共 2 页
字号:
		.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 + -