25 3 2 USB鍵盤驅動

2021-06-16 03:37:42 字數 3829 閱讀 2302

usb

鍵盤驅動與串列埠驅動結構類似,不同的是,使用

usb裝置核心提供的

usb_keyboard_driver

結構作為裝置核心結構。下面講解

usb鍵盤驅動的重點部分。

1.驅動初始和登出

usb鍵盤驅動初始化和登出函式定義如下:

static int _ _init usb_kbd_init(void)

static void _ _exit usb_kbd_exit(void)

usb_kbd_init()

函式在驅動載入的時候呼叫,該函式使用

usb_register()

函式向核心註冊乙個

usb裝置驅動;

usb_kbd_exit()

函式在解除安裝驅動程式的時候呼叫,該函式使用

usb_deregister()

函式登出

usb裝置。初始化和登出函式使用了

usb_keyboard

結構變數,用於描述

usb鍵盤驅動程式,定義如下:

//usb_driver

結構體static struct usb_driver usb_keyboard =;

從usb_keyboard

結構定義看出,

usb_kbd_probe()

函式是裝置檢測函式;

usb_kbd_disconnect()

函式是斷開裝置連線函式。在

usb_keyboard

結構中還用了乙個

usb_kbd_id_table

結構變數描述裝置

id,定義如下:

static struct usb_device_id usb_kbd_id_table = ,

};module_device_table (usb, usb_kbd_id_table); 2

.裝置檢測函式

裝置檢測函式在插入

usb裝置的時候被

usb檔案系統呼叫,負責檢測裝置型別是否與驅動相符。如果裝置型別與驅動匹配,則向

usb核心註冊裝置。函式定義如下:

static int usb_kbd_probe(struct usb_inte***ce

*iface, const struct usb_device_id

*id)

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);//

輸入裝置id

input_dev->cdev.dev = &iface->dev;

input_dev->private = kbd;

input_dev->evbit[0] = bit(ev_key) | bit(ev_led) | bit(ev_rep);

input_dev->ledbit[0] = 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_keycode[i], 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;

/*初始化中斷

urb */

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_inte***ce;

kbd->cr->brequest = 0x09;

kbd->cr->wvalue = cpu_to_le16(0x200);

kbd->cr->windex = cpu_to_le16(inte***ce->desc.binte***cenumber);

kbd->cr->wlength = cpu_to_le16(1);

/*初始化控制

urb */

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, kbd);

fail1: input_free_device(input_dev);

kfree(kbd);

return- enomem; }

函式一開始檢測裝置型別,如果與驅動程式匹配,則建立

usb裝置端點,分配裝置驅動結構占用的記憶體。分配好裝置驅動使用的結構後,申請乙個鍵盤裝置驅動節點,然後設定鍵盤驅動,最後設定

usb裝置的中斷

urb和控制

urb,供

usb裝置核心使用。

3.裝置斷開連線函式

在裝置斷開連線的時候,

usb檔案系統會呼叫

usb_kbd_disconnect()

函式,釋放裝置占用的資源。函式定義如下:

static void usb_kbd_disconnect(struct usb_inte***ce

*intf)

} usb_kbd_disconnect()

函式釋放

usb鍵盤裝置占用的

urb資源,然後登出裝置,最後呼叫

usb_kbd_free_mem()

函式,釋放裝置驅動結構變數占用的記憶體。

USB驅動 USB列舉

一 列舉詳細過程 usb主機在檢測到usb裝置插入後,就要對裝置進行列舉了。為什麼要列舉呢?列舉就是主機host從裝置讀取一些資訊,知道裝置是什麼樣的裝置,如何進行通訊,這樣主機就可以根據這些資訊來載入合適的驅動程式。除錯usb裝置,很重要的一點就是usb的列舉過程,只要列舉成功了,那麼就已經成功大...

聯想USB鍵盤功能鍵驅動問題

聯想usb鍵盤功能鍵驅動問題 1.問題 f1 f12系統下會預設為快捷鍵 功能鍵 而非f1 f12實際功能。可能會導致在使用習慣上的不適應。2.可關閉鍵盤的特殊功能,方法如下 win10系統開始選單,搜尋low profile usb keyboard,彈出對話方塊如下,打鉤確定 3.補充 附 自檢...

USB驅動初探

調了n久68013,最後還是放棄了,使用stm32的usb 調到驅動,建立驅動環境,win7調驅動總感覺格格不入,在xp下建立開發環境 vc6,xpddk 2600,driverstudio 3.2 先安裝vc6,安裝ddk,最後安裝driverstudio 安裝完後,開啟vc6,設定ddk bui...