USB键盘驱动程序_第1页
USB键盘驱动程序_第2页
USB键盘驱动程序_第3页
USB键盘驱动程序_第4页
USB键盘驱动程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* $Id:usbkbd.c,v1.272001/12/2710:37:41vojtechExp$* Copyright(c)1999-2001VojtechPavlik* USBHIDBPKeyboardsupport*/* Thisprogramisfreesoftware;youcanredistributeitand/ormodify* itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby* theFreeSoftwareFoundation;eitherversion2oftheLicense,or* (atyouropt

2、ion)anylaterversion.* Thisprogramisdistributedinthehopethatitwillbeuseful,* butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof* MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSSEe.ethe* GNUGeneralPublicLicenseformoredetails.* YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense* alongwiththisprogra

3、m;ifnot,writetotheFreeSoftware* Foundation,Inc.,59TemplePlace,Suite330,Boston,MA02111-1307USA* Shouldyouneedtocontactme,theauthor,youcandosoeitherby* e-mail-mailyourmessageto<>,orbypapermail:* VojtechPavlik,Simunkova1594,Prague8,18200CzechRepublic*/#include<linux/kernel.h>#include<lin

4、ux/slab.h>#include<linux/module.h>#include<linux/input.h>#include<linux/init.h>#include<linux/usb.h>#include<linux/usb_input.h>/* VersionInformation* /#defineDRIVER_VERSION""#defineDRIVER_AUTHOR"VojtechPavlik<>"#defineDRIVER_DESC"USBHID

5、BootProtocolkeyboarddriver"#defineDRIVER_LICENSE"GPL"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE(DRIVER_LICENSE);staticunsignedcharusb_kbd_keycode256=0,0,0,0,30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,2,3,4,5,6,7,8,9,1

6、0,11,28,1,14,15,57,12,13,26,27,43,43,39,40,41,51,52,53,58,59,60,61,62,63,64,65,66,67,68,87,88,99,70,119,110,102,104,111,107,109,106,105,108,103,69,98,55,74,78,96,79,80,81,75,76,77,71,72,73,82,83,86,127,116,117,183,184,185,186,187,188,189,190,191,192,193,194,134,138,130,132,128,129,131,137,133,135,13

7、6,113,115,114,0,0,0,121,0,89,93,124,92,94,95,0,0,0,122,123,90,91,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,42,56,125,97,54,100,126,164,166,165,163,161,115,114,113,150,158,159,128,136,177

8、,178,176,142,152,173,140;structusb_kbdstructinput_dev*dev;structusb_device*usbdev;unsignedcharold8;structurb*irq,*led;unsignedcharnewleds;charname128;charphys64;unsignedchar*new;structusb_ctrlrequest*cr;unsignedchar*leds;dma_addr_tcr_dma;dma_addr_tnew_dma;dma_addr_tleds_dma;staticvoidusb_kbd_irq(str

9、ucturb*urb,structpt_regs*regs)structusb_kbd*kbd=urb->context;inti;switch(urb->status)case0:/*success*/break;case-ECONNRESET:/*unlink*/case-ENOENT:case-ESHUTDOWN:return;/*-EPIPE:shouldclearthehalt*/default:/*error*/gotoresubmit;input_regs(kbd->dev,regs);for(i=0;i<8;i+)input_report_key(kbd

10、->dev,usb_kbd_keycodei+224,(kbd->new0>>i)&1);for(i=2;i<8;i+)if(kbd->oldi>3&&memscan(kbd->new+2,kbd->oldi,6)=kbd->new+8)if(usb_kbd_keycodekbd->oldi)input_report_key(kbd->dev,usb_kbd_keycodekbd->oldi,0);elseinfo("Unknownkey(scancode%#x)released.&

11、quot;,kbd->oldi);if(kbd->newi>3&&memscan(kbd->old+2,kbd->newi,6)=kbd->old+8)if(usb_kbd_keycodekbd->newi)input_report_key(kbd->dev,usb_kbd_keycodekbd->newi,1);elseinfo("Unknownkey(scancode%#x)pressed.",kbd->newi);input_sync(kbd->dev);memcpy(kbd->o

12、ld,kbd->new,8);resubmit:i=usb_submit_urb(urb,SLAB_ATOMIC);if(i)err("can'tresubmitintr,%s-%s/input0,status%d",kbd->usbdev->bus->bus_name,kbd->usbdev->devpath,i);staticintusb_kbd_event(structinput_dev*dev,unsignedinttype,unsignedintcode,intvalue)structusb_kbd*kbd=dev-&g

13、t;private;if(type!=EV_LED)return-1;kbd->newleds=(!test_bit(LED_KANA,dev->led)<<3)|(!test_bit(LED_COMPOSE,dev->led)<<3)|(!test_bit(LED_SCROLLL,dev->led)<<2)|(!test_bit(LED_CAPSL,dev->led)<<1)|(!test_bit(LED_NUML,dev->led);if(kbd->led->status=-EINPROGRES

14、S)return0;if(*(kbd->leds)=kbd->newleds)return0;*(kbd->leds)=kbd->newleds;kbd->led->dev=kbd->usbdev;if(usb_submit_urb(kbd->led,GFP_ATOMIC)err("usb_submit_urb(leds)failed");return0;staticvoidusb_kbd_led(structurb*urb,structpt_regs*regs)structusb_kbd*kbd=urb->contex

15、t;if(urb->status)warn("ledurbstatus%dreceived",urb->status);if(*(kbd->leds)=kbd->newleds)return;*(kbd->leds)=kbd->newleds;kbd->led->dev=kbd->usbdev;if(usb_submit_urb(kbd->led,GFP_ATOMIC)err("usb_submit_urb(leds)failed");staticintusb_kbd_open(structin

16、put_dev*dev)structusb_kbd*kbd=dev->private;kbd->irq->dev=kbd->usbdev;if(usb_submit_urb(kbd->irq,GFP_KERNEL)return-EIO;return0;staticvoidusb_kbd_close(structinput_dev*dev)structusb_kbd*kbd=dev->private;usb_kill_urb(kbd->irq);staticintusb_kbd_alloc_mem(structusb_device*dev,structu

17、sb_kbd*kbd)if(!(kbd->irq=usb_alloc_urb(0,GFP_KERNEL)return-1;if(!(kbd->led=usb_alloc_urb(0,GFP_KERNEL)return-1;if(!(kbd->new=usb_buffer_alloc(dev,8,SLAB_ATOMIC,&kbd->new_dma)return-1;if(!(kbd->cr=usb_buffer_alloc(dev,sizeof(structusb_ctrlrequest),SLAB_ATOMIC,&kbd->cr_dma)re

18、turn-1;if(!(kbd->leds=usb_buffer_alloc(dev,1,SLAB_ATOMIC,&kbd->leds_dma)return-1;return0;staticvoidusb_kbd_free_mem(structusb_device*dev,structusb_kbd*kbd)if(kbd->irq)usb_free_urb(kbd->irq);if(kbd->led)usb_free_urb(kbd->led);if(kbd->new)usb_buffer_free(dev,8,kbd->new,kbd-

19、>new_dma);if(kbd->cr)usb_buffer_free(dev,sizeof(structusb_ctrlrequest),kbd->cr,kbd->cr_dma);if(kbd->leds)usb_buffer_free(dev,1,kbd->leds,kbd->leds_dma);staticintusb_kbd_probe(structusb_interface*iface,conststructusb_device_id*id)structusb_device*dev=interface_to_usbdev(iface);st

20、ructusb_host_interface*interface;structusb_endpoint_descriptor*endpoint;structusb_kbd*kbd;structinput_dev*input_dev;inti,pipe,maxp;interface=iface->cur_altsetting;if(interface->desc.bNumEndpoints!=1)return-ENODEV;endpoint=&interface->endpoint0.desc;if(!(endpoint->bEndpointAddress&

21、;USB_DIR_IN)return-ENODEV;if(endpoint->bmAttributes&USB_ENDPOINT_XFERTYPE_MASK)!=USB_ENDPOINT_XFER_INT)return-ENODEV;pipe=usb_rcvintpipe(dev,endpoint->bEndpointAddress);maxp=usb_maxpacket(dev,pipe,usb_pipeout(pipe);kbd=kzalloc(sizeof(structusb_kbd),GFP_KERNEL);input_dev=input_allocate_devi

22、ce();if(!kbd|!input_dev)gotofail1;if(usb_kbd_alloc_mem(dev,kbd)gotofail2;kbd->usbdev=dev;kbd->dev=input_dev;if(dev->manufacturer)strlcpy(kbd->name,dev->manufacturer,sizeof(kbd->name);if(dev->product)if(dev->manufacturer)strlcat(kbd->name,"",sizeof(kbd->name);s

23、trlcat(kbd->name,dev->product,sizeof(kbd->name);if(!strlen(kbd->name)snprintf(kbd->name,sizeof(kbd->name),"USBHIDBPKeyboard%04x:%04x",le16_to_cpu(dev->descriptor.idVendor),le16_to_cpu(dev->descriptor.idProduct);usb_make_path(dev,kbd->phys,sizeof(kbd->phys);str

24、lcpy(kbd->phys,"/input0",sizeof(kbd->phys);input_dev->name=kbd->name;input_dev->phys=kbd->phys;usb_to_input_id(dev,&input_dev->id);input_dev->cdev.dev=&iface->dev;input_dev->private=kbd;input_dev->evbit0=BIT(EV_KEY)|BIT(EV_LED)|BIT(EV_REP);input_dev

25、->ledbit0=BIT(LED_NUML)|BIT(LED_CAPSL)|BIT(LED_SCROLLL)|BIT(LED_COMPOSE)|BIT(LED_KANA);for(i=0;i<255;i+)set_bit(usb_kbd_keycodei,input_dev->keybit);clear_bit(0,input_dev->keybit);input_dev->event=usb_kbd_event;input_dev->open=usb_kbd_open;input_dev->close=usb_kbd_close;usb_fill_

26、int_urb(kbd->irq,dev,pipe,kbd->new,(maxp>8?8:maxp),usb_kbd_irq,kbd,endpoint->bInterval);kbd->irq->transfer_dma=kbd->new_dma;kbd->irq->transfer_flags|=URB_NO_TRANSFER_DMA_MAP;kbd->cr->bRequestType=USB_TYPE_CLASS|USB_RECIP_INTERFACE;kbd->cr->bRequest=0x09;kbd->

27、;cr->wValue=cpu_to_le16(0x200);kbd->cr->wIndex=cpu_to_le16(interface->desc.bInterfaceNumber);kbd->cr->wLength=cpu_to_le16(1);usb_fill_control_urb(kbd->led,dev,usb_sndctrlpipe(dev,0),(void*)kbd->cr,kbd->leds,1,usb_kbd_led,kbd);kbd->led->setup_dma=kbd->cr_dma;kbd->led->transfer_dma=kbd->leds_dma;kbd->led->transfer_flags|=(URB_NO_TRANSFER_DMA_MAP|URB_NO_SETUP_DMA_MAP);input_register_device(kbd->dev);usb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论