




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档/* * $Id: usbkbd.c,v 1.27 2001/12/27 10:37:41 vojtech Exp $ * * Copyright (c) 1999-2001 Vojtech Pavlik * * USB HIDBP Keyboard support */* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so either by * e-mail - mail your message to , or by paper mail: * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */#include #include #include #include #include #include #include /* * Version Information */#define DRIVER_VERSION #define DRIVER_AUTHOR Vojtech Pavlik #define DRIVER_DESC USB HID Boot Protocol keyboard driver#define DRIVER_LICENSE GPLMODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE(DRIVER_LICENSE);static unsigned char usb_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, 10, 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,136,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,178,176,142,152,173,140;struct usb_kbd struct input_dev *dev;struct usb_device *usbdev;unsigned char old8;struct urb *irq, *led;unsigned char newleds;char name128;char phys64;unsigned char *new;struct usb_ctrlrequest *cr;unsigned char *leds;dma_addr_t cr_dma;dma_addr_t new_dma;dma_addr_t leds_dma;static void usb_kbd_irq(struct urb *urb, struct pt_regs *regs)struct usb_kbd *kbd = urb-context;int i;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(kbd-dev, regs);for (i = 0; i dev, usb_kbd_keycodei + 224, (kbd-new0 i) & 1);for (i = 2; i 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(Unknown key (scancode %#x) released., 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(Unknown key (scancode %#x) pressed., kbd-newi);input_sync(kbd-dev);memcpy(kbd-old, kbd-new, 8);resubmit:i = usb_submit_urb (urb, SLAB_ATOMIC);if (i)err (cant resubmit intr, %s-%s/input0, status %d,kbd-usbdev-bus-bus_name,kbd-usbdev-devpath, i);static int usb_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)struct usb_kbd *kbd = dev-private;if (type != EV_LED)return -1;kbd-newleds = (!test_bit(LED_KANA, dev-led) led) led) led) led);if (kbd-led-status = -EINPROGRESS)return 0;if (*(kbd-leds) = kbd-newleds)return 0;*(kbd-leds) = kbd-newleds;kbd-led-dev = kbd-usbdev;if (usb_submit_urb(kbd-led, GFP_ATOMIC)err(usb_submit_urb(leds) failed);return 0;static void usb_kbd_led(struct urb *urb, struct pt_regs *regs)struct usb_kbd *kbd = urb-context;if (urb-status)warn(led urb status %d received, 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);static int usb_kbd_open(struct input_dev *dev)struct usb_kbd *kbd = dev-private;kbd-irq-dev = kbd-usbdev;if (usb_submit_urb(kbd-irq, GFP_KERNEL)return -EIO;return 0;static void usb_kbd_close(struct input_dev *dev)struct usb_kbd *kbd = dev-private;usb_kill_urb(kbd-irq);static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_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(struct usb_ctrlrequest), SLAB_ATOMIC, &kbd-cr_dma)return -1;if (!(kbd-leds = usb_buffer_alloc(dev, 1, SLAB_ATOMIC, &kbd-leds_dma)return -1;return 0;static void usb_kbd_free_mem(struct usb_device *dev, struct usb_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-new_dma);if (kbd-cr)usb_buffer_free(dev, sizeof(struct usb_ctrlrequest), kbd-cr, kbd-cr_dma);if (kbd-leds)usb_buffer_free(dev, 1, kbd-leds, kbd-leds_dma);static int usb_kbd_probe(struct usb_interface *iface, const struct usb_device_id *id)struct usb_device *dev = interface_to_usbdev(iface);struct usb_host_interface *interface;struct usb_endpoint_descriptor *endpoint;struct usb_kbd *kbd;struct input_dev *input_dev;int i, pipe, maxp;interface = iface-cur_altsetting;if (interface-desc.bNumEndpoints != 1)return -ENODEV;endpoint = &interface-endpoint0.desc;if (!(endpoint-bEndpointAddress & 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(struct usb_kbd), GFP_KERNEL);input_dev = input_allocate_device();if (!kbd | !input_dev)goto fail1;if (usb_kbd_alloc_mem(dev, kbd)goto fail2;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);strlcat(kbd-name, dev-product, sizeof(kbd-name);if (!strlen(kbd-name)snprintf(kbd-name, sizeof(kbd-name), USB HIDBP Keyboard %04x:%04x, le16_to_cpu(dev-descriptor.idVendor), le16_to_cpu(dev-descriptor.idProduct);usb_make_path(dev, kbd-phys, sizeof(kbd-phys);strlcpy(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-ledbit0 = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);for (i = 0; i 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_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-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_set_intfdata(iface, kbd);return 0;fail2:usb_kbd_free_mem(dev,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年国网新源公司招聘考试教材及模拟题
- 2025年全断面掘进机项目合作计划书
- 抢维修作业安全措施培训课件
- 2025届北京市第一零一中学高三下学期三模物理试题(含答案)
- 扫黄打非法制课件
- 2025年丽水社工考试题目及答案
- 扇贝效应课件
- 2025年贵州文科联考试卷及答案
- 2025年荆州化学中考试题及答案
- 2025年枣阳数学月考试卷及答案
- 浙江甬岭数控刀具有限公司年产600万只U钻、50万套镗刀技改项目环评报告
- DB31/ 653-2012通信基站空调能效限定值
- GB/T 45569-2025压水堆核电厂反应堆冷却剂系统设备和管道保温层设计准则
- 金矿居间合同协议书
- 生态环境标准应用 课件 大气污染物综合排放标准2
- 酒店安全考试试题及答案
- 珠宝店员工保密协议合同
- 关节镜的使用和管理
- 2025届吉林省通化市梅河口市高考一模地理试题(原卷版+解析版)
- 租地安全管理协议书
- 弹塑性力学完整版本
评论
0/150
提交评论