




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 区块链技术创新驱动下的教育行业变革
- 半月板损伤的最好治疗
- 健康产业中的大数据应用与挑战分析
- 2025至2030中国速发酵母行业营销渠道与多元化经营战略规划报告
- 工程项目技术员个人工作总结(6篇)
- 2025学生会生活部工作计划(31篇)
- 银行个人述职报告怎样写(范文15篇)
- 前海人寿保险业务员工作总结(33篇)
- 区块链与金融科技的融合发展
- 以信任为基石推动行业创新-以教育领域为例的研究报告
- 温度传感器Pt100-阻值-温度对照表(方便实用)
- 《地球物理勘探》课件
- 河南省濮阳市清丰县2023-2024学年八年级上学期期中生物试题( 含答案解析 )
- 30道智能驾驶工程师岗位常见面试问题含HR问题考察点及参考回答
- 护林员劳务派遣投标方案(技术标)
- JGJT208-2010 后锚固法检测混凝土抗压强度技术规程
- 北师大版小学英语3-6年级单词-(三起)带音标-精华版
- 公共卫生概论课件
- 菌种计数记录
- 衡水介绍-衡水简介PPT(经典版)
- 电力建设施工现场安全文明施工标准化管理
评论
0/150
提交评论