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

📄 linux_usb_driver.txt

📁 基于LINUX操作系统下的各种详细配置(如FTP
💻 TXT
📖 第 1 页 / 共 2 页
字号:

下面是具体看到的信息 


T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 
B: Alloc= 11/900 us ( 1%), #Int= 1, #Iso= 0 
D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 
P: Vendor=0000 ProdID=0000 Rev= 0.00 
S: Product=USB UHCI Root Hub 
S: SerialNumber=d800 
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA 
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub 
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms 
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 3 Spd=12 MxCh= 3 
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 
P: Vendor=07e4 ProdID=9473 Rev= 0.02 
S: Manufacturer=ALCOR 
S: Product=Movado USB Keyboard 
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA 
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub 
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms 



找到相应的信息后就可开始工作了。实际上,飞梭的定义和键盘键码通常是一样的,所以我们参照drivers/usb/usbkbd..c代码进行一些改动就可以了。因为没能拿到相应的硬件USB协议,我无从知道飞梭在按下时通讯协议众到底发什么,我只能把它的信息打出来进行分析。幸好,它比较简单,在下面代码的usb_kbd_irq函数中if(kbd->new[0] == (char)0x01)和if(((kbd->new[1]>>4)&0x0f)!=0x7)就是判断飞梭左旋。usb_kbd_irq函数就是键盘中断响应函数。他的挂接,就是在usb_kbd_probe函数中 
FILL_INT_URB(&kbd->irq, dev, pipe, kbd->new, maxp > 8 ? 8 : maxp, 
usb_kbd_irq, kbd, endpoint->bInterval); 



一句中实现。 

从usb骨架中我们知道,usb_kbd_probe函数就是在USB设备被系统发现是运行的。其他部分就都不是关键了。你可以根据具体的探测值(Vendor=07e4 ProdID=9473等)进行一些修改就可以了。值得一提的是,在键盘中断中,我们的做法是收到USB飞梭消息后,把它模拟成左方向键和右方向键,在这里,就看你想怎么去响应它了。当然你也可以响应模拟成F14、F15等扩展键码。 

在了解了此基本的驱动后,对于一个你已经拿到通讯协议的键盘所带手写板,你就应该能进行相应驱动的开发了吧。



附一个键盘飞梭的源码

使用此驱动要注意的问题:在加载此驱动时你必须先把hid设备卸载,加载完usbhkey.o模块后再加载hid.o。因为若hid存在,它的probe会屏蔽系统去利用我们的驱动发现我们的设备。其实,飞梭本来就是一个hid设备,正确的方法,或许你应该修改hid的probe函数,然后把我们的驱动融入其中。 


键盘飞梭驱动 


#include <linux/kernel.h> 
#include <linux/slab.h> 
#include <linux/module.h> 
#include <linux/input.h> 
#include <linux/init.h> 
#include <linux/usb.h> 
#include <linux/kbd_ll.h> 

/* 
* Version Information 
*/ 
#define DRIVER_VERSION "" 
#define DRIVER_AUTHOR "TGE HOTKEY " 
#define DRIVER_DESC "USB HID Tge hotkey driver" 

#define USB_HOTKEY_VENDOR_ID 0x07e4 
#define USB_HOTKEY_PRODUCT_ID 0x9473 
//厂商和产品ID信息就是/proc/bus/usb/devices中看到的值 

MODULE_AUTHOR( DRIVER_AUTHOR ); 
MODULE_DESCRIPTION( DRIVER_DESC ); 

struct usb_kbd { 
struct input_dev dev; 
struct usb_device *usbdev; 
unsigned char new[8]; 
unsigned char old[8]; 
struct urb irq, led; 
// devrequest dr; 
//这一行和下一行的区别在于kernel2.4.20版本对usb_kbd键盘结构定义发生了变化 
struct usb_ctrlrequest dr; 
unsigned char leds, newleds; 
char name[128]; 
int open; 
}; 
//此结构来自内核中drivers/usb/usbkbd..c 

static void usb_kbd_irq(struct urb *urb) 
{ 
struct usb_kbd *kbd = urb->context; 
int *new; 
new = (int *) kbd->new; 

if(kbd->new[0] == (char)0x01) 
{ 
if(((kbd->new[1]>>4)&0x0f)!=0x7) 
{ 
handle_scancode(0xe0,1); 
handle_scancode(0x4b,1); 
handle_scancode(0xe0,0); 
handle_scancode(0x4b,0); 
} 
else 
{ 
handle_scancode(0xe0,1); 
handle_scancode(0x4d,1); 
handle_scancode(0xe0,0); 
handle_scancode(0x4d,0); 
} 
} 


printk("new=%x %x %x %x %x %x %x %x", 
kbd->new[0],kbd->new[1],kbd->new[2],kbd->new[3], 
kbd->new[4],kbd->new[5],kbd->new[6],kbd->new[7]); 

} 

static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum, 
const struct usb_device_id *id) 
{ 
struct usb_interface *iface; 
struct usb_interface_descriptor *interface; 
struct usb_endpoint_descriptor *endpoint; 
struct usb_kbd *kbd; 
int pipe, maxp; 

iface = &dev->actconfig->interface[ifnum]; 
interface = &iface->altsetting[iface->act_altsetting]; 

if ((dev->descriptor.idVendor != USB_HOTKEY_VENDOR_ID) || 
(dev->descriptor.idProduct != USB_HOTKEY_PRODUCT_ID) || 
(ifnum != 1)) 
{ 
return NULL; 
} 
if (dev->actconfig->bNumInterfaces != 2) 
{ 
return NULL; 
} 

if (interface->bNumEndpoints != 1) return NULL; 

endpoint = interface->endpoint + 0; 

pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); 
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); 

usb_set_protocol(dev, interface->bInterfaceNumber, 0); 
usb_set_idle(dev, interface->bInterfaceNumber, 0, 0); 

printk(KERN_INFO "GUO: Vid = %.4x, Pid = %.4x, Device = %.2x, ifnum = %.2x, bufCount = %.8x\\n", 
dev->descriptor.idVendor,dev->descriptor.idProduct,dev->descriptor.bcdDevice, ifnum, maxp); 

if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) return NULL; 
memset(kbd, 0, sizeof(struct usb_kbd)); 

kbd->usbdev = dev; 

FILL_INT_URB(&kbd->irq, dev, pipe, kbd->new, maxp > 8 ? 8 : maxp, 
usb_kbd_irq, kbd, endpoint->bInterval); 

kbd->irq.dev = kbd->usbdev; 

if (dev->descriptor.iManufacturer) 
usb_string(dev, dev->descriptor.iManufacturer, kbd->name, 63); 

if (usb_submit_urb(&kbd->irq)) { 
kfree(kbd); 
return NULL; 
} 

printk(KERN_INFO "input%d: %s on usb%d:%d.%d\\n", 
kbd->dev.number, kbd->name, dev->bus->busnum, dev->devnum, ifnum); 

return kbd; 
} 

static void usb_kbd_disconnect(struct usb_device *dev, void *ptr) 
{ 
struct usb_kbd *kbd = ptr; 
usb_unlink_urb(&kbd->irq); 
kfree(kbd); 

} 

static struct usb_device_id usb_kbd_id_table [] = { 
{ USB_DEVICE(USB_HOTKEY_VENDOR_ID, USB_HOTKEY_PRODUCT_ID) }, 
{ } /* Terminating entry */ 
}; 

MODULE_DEVICE_TABLE (usb, usb_kbd_id_table); 

static struct usb_driver usb_kbd_driver = { 
name: "Hotkey", 
probe: usb_kbd_probe, 
disconnect: usb_kbd_disconnect, 
id_table: usb_kbd_id_table, 
NULL, 
}; 

static int __init usb_kbd_init(void) 
{ 
usb_register(&usb_kbd_driver); 
info(DRIVER_VERSION ":" DRIVER_DESC); 
return 0; 
} 

static void __exit usb_kbd_exit(void) 
{ 
usb_deregister(&usb_kbd_driver); 
} 

module_init(usb_kbd_init); 
module_exit(usb_kbd_exit);

⌨️ 快捷键说明

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