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...