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

📄 phidgetkit.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		kit->sensors[0] = buffer[2] + (buffer[3] & 0x0f) * 256;		kit->sensors[1] = buffer[4] + (buffer[3] & 0xf0) * 16;		kit->sensors[2] = buffer[5] + (buffer[6] & 0x0f) * 256;		kit->sensors[3] = buffer[7] + (buffer[6] & 0xf0) * 16;	}resubmit:	status = usb_submit_urb(urb, SLAB_ATOMIC);	if (status)		err("can't resubmit intr, %s-%s/interfacekit0, status %d",			kit->udev->bus->bus_name,			kit->udev->devpath, status);}#define show_set_output(value)		\static ssize_t set_output##value(struct device *dev, struct device_attribute *attr, const char *buf, 	\							size_t count)	\{									\	struct usb_interface *intf = to_usb_interface(dev);		\	struct phidget_interfacekit *kit = usb_get_intfdata(intf);	\	int enabled;							\	int retval;							\									\	if (sscanf(buf, "%d", &enabled) < 1) {				\		return -EINVAL;						\	}								\									\	retval = change_outputs(kit, value - 1, enabled ? 1 : 0);	\									\	return retval ? retval : count;					\}									\									\static ssize_t show_output##value(struct device *dev, struct device_attribute *attr, char *buf)	\{									\	struct usb_interface *intf = to_usb_interface(dev);		\	struct phidget_interfacekit *kit = usb_get_intfdata(intf);	\									\	return sprintf(buf, "%d\n", kit->outputs[value - 1]);		\}									\static DEVICE_ATTR(output##value, S_IWUGO | S_IRUGO,			\		show_output##value, set_output##value);show_set_output(1);show_set_output(2);show_set_output(3);show_set_output(4);show_set_output(5);show_set_output(6);show_set_output(7);show_set_output(8);	/* should be MAX_INTERFACES - 1 */#define show_input(value)	\static ssize_t show_input##value(struct device *dev, struct device_attribute *attr, char *buf)	\{									\	struct usb_interface *intf = to_usb_interface(dev);		\	struct phidget_interfacekit *kit = usb_get_intfdata(intf);	\									\	return sprintf(buf, "%d\n", kit->inputs[value - 1]);		\}									\static DEVICE_ATTR(input##value, S_IRUGO, show_input##value, NULL);show_input(1);show_input(2);show_input(3);show_input(4);show_input(5);show_input(6);show_input(7);show_input(8);		/* should be MAX_INTERFACES - 1 */#define show_sensor(value)	\static ssize_t show_sensor##value(struct device *dev, struct device_attribute *attr, char *buf)	\{									\	struct usb_interface *intf = to_usb_interface(dev);		\	struct phidget_interfacekit *kit = usb_get_intfdata(intf);	\									\	return sprintf(buf, "%d\n", kit->sensors[value - 1]);		\}									\static DEVICE_ATTR(sensor##value, S_IRUGO, show_sensor##value, NULL);show_sensor(1);show_sensor(2);show_sensor(3);show_sensor(4);show_sensor(5);show_sensor(6);show_sensor(7);show_sensor(8);		/* should be MAX_INTERFACES - 1 */static int interfacekit_probe(struct usb_interface *intf, const struct usb_device_id *id){	struct usb_device *dev = interface_to_usbdev(intf);	struct usb_host_interface *interface;	struct usb_endpoint_descriptor *endpoint;	struct phidget_interfacekit *kit;	struct driver_interfacekit *ifkit;	int pipe, maxp;	ifkit = (struct driver_interfacekit *)id->driver_info;	if (!ifkit)		return -ENODEV;	interface = intf->cur_altsetting;	if (interface->desc.bNumEndpoints != 1)		return -ENODEV;	endpoint = &interface->endpoint[0].desc;	if (!(endpoint->bEndpointAddress & 0x80)) 		return -ENODEV;	/*	 * bmAttributes	 */	pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);	maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));		kit = kmalloc(sizeof(*kit), GFP_KERNEL);	if (kit  == NULL) {		dev_err(&intf->dev, "%s - out of memory\n", __FUNCTION__);		return -ENOMEM;	}	memset(kit, 0, sizeof(*kit));	kit->ifkit = ifkit;	kit->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &kit->data_dma);	if (!kit->data) {		kfree(kit);		return -ENOMEM;	}	kit->irq = usb_alloc_urb(0, GFP_KERNEL);	if (!kit->irq) {		usb_buffer_free(dev, 8, kit->data, kit->data_dma);		kfree(kit);		return -ENOMEM;	}	kit->udev = usb_get_dev(dev);	kit->intf = intf;	usb_fill_int_urb(kit->irq, kit->udev, pipe, kit->data,			(maxp > 8 ? 8 : maxp),			interfacekit_irq, kit, endpoint->bInterval);	kit->irq->transfer_dma = kit->data_dma;	kit->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;	usb_set_intfdata(intf, kit);	if (usb_submit_urb(kit->irq, GFP_KERNEL)) {		return -EIO;	}	if (ifkit->outputs >= 4) {		device_create_file(&intf->dev, &dev_attr_output1);		device_create_file(&intf->dev, &dev_attr_output2);		device_create_file(&intf->dev, &dev_attr_output3);		device_create_file(&intf->dev, &dev_attr_output4);	}	if (ifkit->outputs == 8) {		device_create_file(&intf->dev, &dev_attr_output5);		device_create_file(&intf->dev, &dev_attr_output6);		device_create_file(&intf->dev, &dev_attr_output7);		device_create_file(&intf->dev, &dev_attr_output8);	} 	if (ifkit->inputs >= 4) {		device_create_file(&intf->dev, &dev_attr_input1);		device_create_file(&intf->dev, &dev_attr_input2);		device_create_file(&intf->dev, &dev_attr_input3);		device_create_file(&intf->dev, &dev_attr_input4);	}	if (ifkit->inputs == 8) {		device_create_file(&intf->dev, &dev_attr_input5);		device_create_file(&intf->dev, &dev_attr_input6);		device_create_file(&intf->dev, &dev_attr_input7);		device_create_file(&intf->dev, &dev_attr_input8);	}	if (ifkit->sensors >= 4) {		device_create_file(&intf->dev, &dev_attr_sensor1);		device_create_file(&intf->dev, &dev_attr_sensor2);		device_create_file(&intf->dev, &dev_attr_sensor3);		device_create_file(&intf->dev, &dev_attr_sensor4);	}	if (ifkit->sensors >= 7) {		device_create_file(&intf->dev, &dev_attr_sensor5);		device_create_file(&intf->dev, &dev_attr_sensor6);		device_create_file(&intf->dev, &dev_attr_sensor7);	}	if (ifkit->sensors == 8) {		device_create_file(&intf->dev, &dev_attr_sensor8);	}	if (ifkit->has_lcd)		device_create_file(&intf->dev, &dev_attr_lcd);	dev_info(&intf->dev, "USB PhidgetInterfaceKit %d/%d/%d attached\n",			ifkit->sensors, ifkit->inputs, ifkit->outputs);	return 0;}static void interfacekit_disconnect(struct usb_interface *interface){	struct phidget_interfacekit *kit;	kit = usb_get_intfdata(interface);	usb_set_intfdata(interface, NULL);	if (!kit)		return;	if (kit->ifkit->outputs >= 4) {		device_remove_file(&interface->dev, &dev_attr_output1);		device_remove_file(&interface->dev, &dev_attr_output2);		device_remove_file(&interface->dev, &dev_attr_output3);		device_remove_file(&interface->dev, &dev_attr_output4);	}	if (kit->ifkit->outputs == 8) {		device_remove_file(&interface->dev, &dev_attr_output5);		device_remove_file(&interface->dev, &dev_attr_output6);		device_remove_file(&interface->dev, &dev_attr_output7);		device_remove_file(&interface->dev, &dev_attr_output8);	}	if (kit->ifkit->inputs >= 4) {		device_remove_file(&interface->dev, &dev_attr_input1);		device_remove_file(&interface->dev, &dev_attr_input2);		device_remove_file(&interface->dev, &dev_attr_input3);		device_remove_file(&interface->dev, &dev_attr_input4);	}	if (kit->ifkit->inputs == 8) {		device_remove_file(&interface->dev, &dev_attr_input5);		device_remove_file(&interface->dev, &dev_attr_input6);		device_remove_file(&interface->dev, &dev_attr_input7);		device_remove_file(&interface->dev, &dev_attr_input8);	}	if (kit->ifkit->sensors >= 4) {		device_remove_file(&interface->dev, &dev_attr_sensor1);		device_remove_file(&interface->dev, &dev_attr_sensor2);		device_remove_file(&interface->dev, &dev_attr_sensor3);		device_remove_file(&interface->dev, &dev_attr_sensor4);	}	if (kit->ifkit->sensors >= 7) {		device_remove_file(&interface->dev, &dev_attr_sensor5);		device_remove_file(&interface->dev, &dev_attr_sensor6);		device_remove_file(&interface->dev, &dev_attr_sensor7);	}	if (kit->ifkit->sensors == 8) {		device_remove_file(&interface->dev, &dev_attr_sensor8);	}	if (kit->ifkit->has_lcd)		device_remove_file(&interface->dev, &dev_attr_lcd);	dev_info(&interface->dev, "USB PhidgetInterfaceKit %d/%d/%d detached\n",		kit->ifkit->sensors, kit->ifkit->inputs, kit->ifkit->outputs);	usb_kill_urb(kit->irq);	usb_free_urb(kit->irq);	usb_buffer_free(kit->udev, 8, kit->data, kit->data_dma);	usb_put_dev(kit->udev);	kfree(kit);}static struct usb_driver interfacekit_driver = {	.owner = THIS_MODULE,	.name = "phidgetkit",	.probe = interfacekit_probe,	.disconnect = interfacekit_disconnect,	.id_table = id_table};static int __init interfacekit_init(void){	int retval = 0;	retval = usb_register(&interfacekit_driver);	if (retval)		err("usb_register failed. Error number %d", retval);	return retval;}static void __exit interfacekit_exit(void){	usb_deregister(&interfacekit_driver);}module_init(interfacekit_init);module_exit(interfacekit_exit);MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -