以文本方式查看主題 - 曙海教育集團論壇 (http://www.xinguifushi.cn/bbs/index.asp) -- Linux驅動開發 (http://www.xinguifushi.cn/bbs/list.asp?boardid=33) ---- 寫Linux下的USB鍵盤驅動 (http://www.xinguifushi.cn/bbs/dispbbs.asp?boardid=33&id=1720) |
-- 作者:wangxinxin -- 發布時間:2010-11-24 10:36:29 -- 寫Linux下的USB鍵盤驅動 1. 指定USB鍵盤驅動所需的頭文件: % x/ M8 {9 G4 Y, G/ O6 o #include <linux/kernel.h>/*內核頭文件,含有內核一些常用函數的原型定義*/ 6 i\' B1 I7 @3 ]1 _#include <linux/slab.h>/*定義內存分配的一些函數*/ #include <linux/module.h>/*模塊編譯必須的頭文件*/ ( {6 G2 G: U4 L8 b( J#include <linux/input.h>/*輸入設備相關函數的頭文件*/ #include <linux/init.h>/*linux初始化模塊函數定義*/ 1 f8 B0 ?( i4 l. z#include <linux/usb.h> /*USB設備相關函數定義*/ 2. 定義鍵盤碼表數組: 7 ]" F0 a( V) p" Z; s /*使用第一套鍵盤掃描碼表:A-1E;B-30;C-2E…*/ static unsigned char usb_kbd_keycode[256] = { 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, - B0 m) ?7 J- P105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, 6 R2 v- Q2 i: p4 N- Y72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190, \' L; [8 t0 ^8 U8 |8 ?4 F191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113, 2 o/ p0 u- @/ h- I7 z115,114, 0, 0, 0,121, 0, 89, 93,124, 92, 94, 95, 0, 0, 0, * D+ N% W" M5 W- t122,123, 90, 91, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 {* N: s j* u3 t6 w* s4 ^+ c0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ) l, D# \\8 V; o5 l4 W0 c9 `2 e0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # w# I+ y* j$ b# ]* }4 g7 ]$ h0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! q) k I3 ^4 v3 e0, 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, ( k, J2 d" i3 h150,158,159,128,136,177,178,176,142,152,173,140 , u. ]) |9 R5 v5 e}; 3 Q5 Z0 m! L% y$ V4 r1 G6 A# R 3. 編寫設備ID表: ( u" @, F2 t0 N) ~ static struct usb_device_id usb_kbd_id_table [] = { + h% l/ [8 V; g7 Y4 ]\' ~) K{ USB_INTERFACE_INFO(3, 1, 1) },/*3,1,1分別表示接口類,接口子類,接口協議;3,1,1為鍵盤接口類;鼠標為3,1,2*/ { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, usb_kbd_id_table);/*指定設備ID表*/ ( Y7 a; y* h\' n 4. 定義USB鍵盤結構體: " T5 s( ^. V) K. `. e1 f0 v+ c! U struct usb_kbd { struct input_dev *dev; /*定義一個輸入設備*/ struct usb_device *usbdev;/*定義一個usb設備*/ * i/ d" y, \\; u" D& E; D/ i# V. Eunsigned char old[8]; /*按鍵離開時所用之數據緩沖區*/ struct urb *irq/*usb鍵盤之中斷請求塊*/, *led/*usb鍵盤之指示燈請求塊*/; unsigned char newleds;/*目標指定燈狀態*/ char name[128];/*存放廠商名字及產品名字*/ char phys[64];/*設備之節點*/ unsigned char *new;/*按鍵按下時所用之數據緩沖區*/ struct usb_ctrlrequest *cr;/*控制請求結構*/ 4 q1 N6 R3 ~4 d0 U, O% ?unsigned char *leds;/*當前指示燈狀態*/ dma_addr_t cr_dma; /*控制請求DMA緩沖地址*/ $ ?; S* u% Q! S8 F* {- `dma_addr_t new_dma; /*中斷urb會使用該DMA緩沖區*/ dma_addr_t leds_dma; /*指示燈DAM緩沖地址*/ }; " `# T6 H$ d# x5 a- B3 ^ 5. 編寫USB鍵盤驅動結構(任何一個LINUX下的驅動都有個類似的驅動結構): ( u; \\" u" V2 d2 Y /*USB鍵盤驅動結構體*/ 0 P7 V1 G4 I# o# s# N9 nstatic struct usb_driver usb_kbd_driver = { .name = "usbkbd",/*驅動名字*/ ( Z5 |/ Q* X4 Y! \\# f9 C.probe = usb_kbd_probe,/*驅動探測函數,加載時用到*/ .disconnect = usb_kbd_disconnect,/*驅動斷開函數,在卸載時用到*/ .id_table = usb_kbd_id_table,/*驅動設備ID表,用來指定設備或接口*/ - |" s( J; g! Z; n7 i}; . K9 [0 h. ?4 a, B( O6. 編寫模塊加載函數(每個驅動都會有一個加載函數,由module_init調用): 9 H1 \\ a( y" t+ t3 [ ^ /*驅動程序生命周期的開始點,向 USB core 注冊這個鍵盤驅動程序。*/ static int __init usb_kbd_init(void) { $ y9 m8 w0 V2 r# h; |6 f N: Gint result = usb_register(&usb_kbd_driver);/*注冊USB鍵盤驅動*/ if (result == 0) /*注冊失敗*/ |