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

📄 usbmouse.c

📁 ReactOs中的USB驱动
💻 C
字号:
/*
 This driver is based on Linux 2.5.75 usbmouse driver by Vojtech Pavlik
*/
#define NDEBUG#include "../../miniport/usb_wrapper.h"
extern USBPORT_INTERFACE UsbPortInterface;
struct usb_mouse {	char name[128];	char phys[64];	struct usb_device *usbdev;	char btn_old;	//struct input_dev dev;	struct urb *irq;	int open;	signed char *data;	dma_addr_t data_dma;};static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs){	struct usb_mouse *mouse = urb->context;	signed char *data = mouse->data;	int status;	switch (urb->status) {	case 0:			/* success */		break;	case -ECONNRESET:	/* unlink */	case -ENOENT:	case -ESHUTDOWN:		return;	/* -EPIPE:  should clear the halt */	default:		/* error */		goto resubmit;	}/*	input_regs(dev, regs);	input_report_key(dev, BTN_LEFT,   data[0] & 0x01);	input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);	input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);	input_report_key(dev, BTN_SIDE,   data[0] & 0x08);	input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);	input_report_rel(dev, REL_X,     data[1]);	input_report_rel(dev, REL_Y,     data[2]);	input_report_rel(dev, REL_WHEEL, data[3]);	input_sync(dev);*/	{		MOUSE_INPUT_DATA MouseInputData;
		ULONG InputDataConsumed;

		MouseInputData.Flags = MOUSE_MOVE_RELATIVE;
		MouseInputData.LastX = data[1];
		MouseInputData.LastY = data[2];

		MouseInputData.ButtonFlags = 0;
		MouseInputData.ButtonData = 0;

		if ((data[0] & 0x01) && ((mouse->btn_old & 0x01) != (data[0] & 0x01)))
			MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
		else if (!(data[0] & 0x01) && ((mouse->btn_old & 0x01) != (data[0] & 0x01)))
			MouseInputData.ButtonFlags |= MOUSE_LEFT_BUTTON_UP;

		if ((data[0] & 0x02) && ((mouse->btn_old & 0x02) != (data[0] & 0x02)))
			MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
		else if (!(data[0] & 0x02) && ((mouse->btn_old & 0x02) != (data[0] & 0x02)))
			MouseInputData.ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;

		if ((data[0] & 0x04) && ((mouse->btn_old & 0x04) != (data[0] & 0x04)))
			MouseInputData.ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
		else if (!(data[0] & 0x04) && ((mouse->btn_old & 0x04) != (data[0] & 0x04)))
			MouseInputData.ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;

		if ((data[0] & 0x08) && ((mouse->btn_old & 0x08) != (data[0] & 0x08)))
			MouseInputData.ButtonFlags |= MOUSE_BUTTON_4_DOWN;
		else if (!(data[0] & 0x08) && ((mouse->btn_old & 0x08) != (data[0] & 0x08)))
			MouseInputData.ButtonFlags |= MOUSE_BUTTON_4_UP;

		if ((data[0] & 0x10) && ((mouse->btn_old & 0x10) != (data[0] & 0x10)))
			MouseInputData.ButtonFlags |= MOUSE_BUTTON_5_DOWN;
		else if (!(data[0] & 0x10) && ((mouse->btn_old & 0x10) != (data[0] & 0x10)))
			MouseInputData.ButtonFlags |= MOUSE_BUTTON_5_UP;

		if (data[3])
		{
			MouseInputData.ButtonFlags |= MOUSE_WHEEL;
			MouseInputData.ButtonData = data[3];
		}
        
		if (UsbPortInterface.MouseConnectData->ClassService)
		{
			KIRQL OldIrql;

			KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
			(*(PSERVICE_CALLBACK_ROUTINE)UsbPortInterface.MouseConnectData->ClassService)(
				UsbPortInterface.MouseConnectData->ClassDeviceObject,
				&MouseInputData,
				(&MouseInputData)+1,
				&InputDataConsumed);
			KeLowerIrql(OldIrql);
		}

		mouse->btn_old = data[0];

		// debug info
		printk("MouseInputData.Buttons=0x%03x\n", MouseInputData.Buttons);
	}
	printk("Mouse input: x %d, y %d, w %d, btn: 0x%02x\n", data[1], data[2], data[3], data[0]);resubmit:	status = usb_submit_urb (urb, SLAB_ATOMIC);	if (status)		err ("can't resubmit intr, %s-%s/input0, status %d",				mouse->usbdev->bus->bus_name,				mouse->usbdev->devpath, status);}/*static int usb_mouse_open(struct input_dev *dev){	struct usb_mouse *mouse = dev->private;	if (mouse->open++)		return 0;	mouse->irq->dev = mouse->usbdev;	if (usb_submit_urb(mouse->irq, GFP_KERNEL)) {		mouse->open--;		return -EIO;	}	return 0;}static void usb_mouse_close(struct input_dev *dev){	struct usb_mouse *mouse = dev->private;	if (!--mouse->open)		usb_unlink_urb(mouse->irq);}*/static int usb_mouse_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 usb_mouse *mouse;	int pipe, maxp;	char path[64];	char *buf;	interface = &intf->altsetting[intf->act_altsetting];	if (interface->desc.bNumEndpoints != 1) 		return -ENODEV;	endpoint = &interface->endpoint[0].desc;	if (!(endpoint->bEndpointAddress & 0x80)) 		return -ENODEV;	if ((endpoint->bmAttributes & 3) != 3) 		return -ENODEV;	pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);	maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));	if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL))) 		return -ENOMEM;	memset(mouse, 0, sizeof(struct usb_mouse));	mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);	if (!mouse->data) {		kfree(mouse);		return -ENOMEM;	}	mouse->irq = usb_alloc_urb(0, GFP_KERNEL);	if (!mouse->irq) {		usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);		kfree(mouse);		return -ENODEV;	}	mouse->usbdev = dev;	usb_make_path(dev, path, 64);	sprintf(mouse->phys, "%s/input0", path);	if (!(buf = kmalloc(63, GFP_KERNEL))) {		usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);		kfree(mouse);		return -ENOMEM;	}	if (dev->descriptor.iManufacturer &&		usb_string(dev, dev->descriptor.iManufacturer, buf, 63) > 0)			strcat(mouse->name, buf);	if (dev->descriptor.iProduct &&		usb_string(dev, dev->descriptor.iProduct, buf, 63) > 0)			sprintf(mouse->name, "%s %s", mouse->name, buf);	if (!strlen(mouse->name))		sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x",			dev->descriptor.idVendor, dev->descriptor.idProduct);	kfree(buf);	usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,			 (maxp > 8 ? 8 : maxp),			 usb_mouse_irq, mouse, endpoint->bInterval);	//mouse->irq->transfer_dma = mouse->data_dma;	//mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;	printk(KERN_INFO "input: %s on %s\n", mouse->name, path);	usb_set_intfdata(intf, mouse);	// Open device	mouse->irq->dev = mouse->usbdev;	if (usb_submit_urb(mouse->irq, GFP_KERNEL)) {		return -EIO;	}	mouse->btn_old = 0;	return 0;}static void usb_mouse_disconnect(struct usb_interface *intf){	struct usb_mouse *mouse = usb_get_intfdata (intf);		usb_set_intfdata(intf, NULL);	usbprintk("Mouse disconnected\n ");
	if (mouse) {		usb_unlink_urb(mouse->irq);		usb_free_urb(mouse->irq);		usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);		kfree(mouse);	}}static struct usb_device_id usb_mouse_id_table [] = {	{ USB_INTERFACE_INFO(3, 1, 2) },    { }						/* Terminating entry */};MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);static struct usb_driver usb_mouse_driver = {	.owner		= THIS_MODULE,	.name		= "usbmouse",	.probe		= usb_mouse_probe,	.disconnect	= usb_mouse_disconnect,	.id_table	= usb_mouse_id_table,};void UsbMouseInit(void)
{
	if (usb_register(&usb_mouse_driver) < 0) {
		#if mousedebug
		printk("Unable to register Mouse driver");
		#endif
		return;
	}       
}

void UsbMouseRemove(void) {
	usb_deregister(&usb_mouse_driver);
}

⌨️ 快捷键说明

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