<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    Rss & SiteMap

    曙海教育集團論壇 http://www.bjzhda.cn

    曙海教育集團論壇
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
    [瀏覽完整版]

    標題:寫Linux下的USB鍵盤驅動

    1樓
    wangxinxin 發表于:2010-11-24 10:36:29
    1.   指定USB鍵盤驅動所需的頭文件: % x/ M8 {9 G4 Y, G/ O6 o

    + m( H! q+ I2 d8 V. @, D0 Y8 l

    #include <linux/kernel.h>/*內核頭文件,含有內核一些常用函數的原型定義*/

    6 i' B1 I7 @3 ]1 _

    #include <linux/slab.h>/*定義內存分配的一些函數*/


    9 |/ l3 Q/ F! }0 D% E# h' B3 W

    #include <linux/module.h>/*模塊編譯必須的頭文件*/

    ( {6 G2 G: U4 L8 b( J

    #include <linux/input.h>/*輸入設備相關函數的頭文件*/


    $ Z! t- D* ^% J2 H; W+ b# c

    #include <linux/init.h>/*linux初始化模塊函數定義*/

    1 f8 B0 ?( i4 l. z

    #include <linux/usb.h> /*USB設備相關函數定義*/


    / L  {, X, t" U* ?2.   定義鍵盤碼表數組: 7 ]" F0 a( V) p" Z; s

    /*使用第一套鍵盤掃描碼表:A-1E;B-30;C-2E*/


    - j- S, z% `, s( Y( O

    static unsigned char usb_kbd_keycode[256] = {


    1 V+ g# X4 S" n

        0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,


    7 t9 d- b- _9 v; t3 r2 K; Z+ _: o

        50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,


    & S! S% t* A7 w- P7 d4 c! h7 S

        4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,


    / Q+ b. r( D, k" }0 f' {; z

        27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,


    8 P- y6 M* g; a* w4 M$ [

        65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,

    - B0 m) ?7 J- P

        105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,

    6 R2 v- Q2 i: p4 N- Y

        72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,

    ' L; [8 t0 ^8 U8 |8 ?4 F

        191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,

    2 o/ p0 u- @/ h- I7 z

        115,114, 0, 0, 0,121, 0, 89, 93,124, 92, 94, 95, 0, 0, 0,

    * D+ N% W" M5 W- t

        122,123, 90, 91, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    7 {* N: s  j* u3 t6 w* s4 ^+ c

        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    ) l, D# \8 V; o5 l4 W0 c9 `2 e

        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    # w# I+ y* j$ b# ]* }4 g7 ]$ h

        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    ! q) k  I3 ^4 v3 e

        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,


    6 ?! P4 F  m- g+ W- `

        29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,

    ( k, J2 d" i3 h

        150,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*/


    , K( l5 ^& Q8 W" A: a

        { }           /* Terminating entry */


    & P3 ^8 E* }* W+ b' u& \

    };


    4 Z4 ~( {/ _  K1 ]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 {


    & D) _/ ]4 c+ H5 |! P+ ]

        struct input_dev *dev; /*定義一個輸入設備*/


    0 `8 \  w* R, ]2 Z3 f" u& V

        struct usb_device *usbdev;/*定義一個usb設備*/

    * i/ d" y, \; u" D& E; D/ i# V. E

        unsigned char old[8]; /*按鍵離開時所用之數據緩沖區*/


    + m% u( P! T& d& B

        struct urb *irq/*usb鍵盤之中斷請求塊*/, *led/*usb鍵盤之指示燈請求塊*/;


    # b, O; c. u* a( `' F6 v

        unsigned char newleds;/*目標指定燈狀態*/


    ' A6 Q8 [, E9 J: w2 n# N

        char name[128];/*存放廠商名字及產品名字*/


    2 f2 z$ m3 m& D% Z, B& Z

        char phys[64];/*設備之節點*/


    6 w/ ?9 ?# E8 Y6 }6 v  O7 Q
    , j, ?. y8 g% k/ N& A

        unsigned char *new;/*按鍵按下時所用之數據緩沖區*/


    ; `4 |+ B8 i2 s. E$ L

        struct usb_ctrlrequest *cr;/*控制請求結構*/

    4 q1 N6 R3 ~4 d0 U, O% ?

        unsigned char *leds;/*當前指示燈狀態*/


    * U7 i% `* G4 a/ E4 H) A) ?4 `. Z

        dma_addr_t cr_dma; /*控制請求DMA緩沖地址*/

    $ ?; S* u% Q! S8 F* {- `

        dma_addr_t new_dma; /*中斷urb會使用該DMA緩沖區*/


    8 o9 ?$ K1 B9 T6 z4 F& t

        dma_addr_t leds_dma; /*指示燈DAM緩沖地址*/


    ( a0 C! {/ a# G' Z) S6 o" c% v}; " `# T6 H$ d# x5 a- B3 ^
    5.   編寫USB鍵盤驅動結構(任何一個LINUX下的驅動都有個類似的驅動結構) ( u; \" u" V2 d2 Y

    /*USB鍵盤驅動結構體*/

    0 P7 V1 G4 I# o# s# N9 n

    static struct usb_driver usb_kbd_driver = {


    ; F) L9 Q/ s$ F# h

        .name =   "usbkbd",/*驅動名字*/

    ( Z5 |/ Q* X4 Y! \# f9 C

        .probe = usb_kbd_probe,/*驅動探測函數,加載時用到*/


    # {" n5 \1 t6 K  j1 v

        .disconnect = usb_kbd_disconnect,/*驅動斷開函數,在卸載時用到*/


    2 S) |0 K, a  o/ f, `; F

        .id_table =   usb_kbd_id_table,/*驅動設備ID表,用來指定設備或接口*/

    - |" s( J; g! Z; n7 i

    };

    . K9 [0 h. ?4 a, B( O
    6.   編寫模塊加載函數(每個驅動都會有一個加載函數,由module_init調用) 9 H1 \  a( y" t+ t3 [  ^

    /*驅動程序生命周期的開始點,向 USB core 注冊這個鍵盤驅動程序。*/


    9 K: P) y8 ?- d

    static int __init usb_kbd_init(void)


    4 O7 @  r. r9 ^$ q. G

    {

    $ y9 m8 w0 V2 r# h; |6 f  N: G

        int result = usb_register(&usb_kbd_driver);/*注冊USB鍵盤驅動*/


    7 w/ S: x. p+ N' g1 R) k9 ]1 H

        if (result == 0) /*注冊失敗*/


    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

    Copyright © 2000 - 2009 曙海教育集團
    Powered By 曙海教育集團 Version 2.2
    Processed in .01758 s, 2 queries.
    主站蜘蛛池模板: 久久66热这里只会有精品| 午夜三级黄色片| 99国产欧美久久久精品| 成人影院wwwwwwwwwww| 亚洲午夜一区二区电影院| 男人j插入女人p| 国产免费观看a大片的网站| 99国内精品久久久久久久| 性一交一乱一伦一色一情| 乱人伦中文视频在线| 欧美日本免费一区二区三区| 十八在线观观看免费视频| 草莓视频成人在线观看| 国产精品看高国产精品不卡| 三人交bangbangbang| 日本xxxx色视频在线播放| 亚洲天堂电影网| 波多野结衣中出在线| 四虎在线最新永久免费| 边吃奶边摸下面| 国产精品亚洲产品一区二区三区| 一区二区三区视频| 手机小视频在线观看| 亚洲AV网址在线观看| 欧美国产一区二区| 免费a级在线观看播放| 精品国产第一国产综合精品| 国产婷婷成人久久av免费高清 | 爽爽影院在线看| 四虎成人精品无码| 菠萝蜜视频在线观看入口| 国产精品一区二区久久沈樵| a级毛片免费网站| 女人18片毛片60分钟| 中文字幕日韩精品麻豆系列| 日产码一卡二卡三国产乱码| 亚洲aⅴ男人的天堂在线观看| 欧美国产一区二区三区激情无套 | 久久精品电影免费动漫| 樱桃黄高清完整版在线观看| 亚洲精品无码专区在线|