usb驅動程式初步編寫

fight_onlyfor_you發表於2017-03-20

今天我們的目標是將USB滑鼠用做按鍵

比如說左鍵按下就相當於字母L

右鍵按下就相當於字母S

滾輪按下就相當於回車


相當於一個輸入子系統,怎麼做呢??

1.分配一個input_device結構體

2.設定它能夠產生按鍵類事件,能夠產生這三個按鍵

3.註冊

4.硬體相關的操作

使用USB匯流排下路的收發函式來讀寫資料

我們今天寫的驅動程式和以前寫的驅動程式有什麼差別,差別就是硬體操作不一樣

我們在probe函式裡面做這四件事情,怎麼寫這個驅動程式呢,



怎麼寫USB裝置驅動程式

1.分配和設定usb_driver結構體,還有註冊

usb_driver下面有什麼東西呢??

1.id_table 表示它能夠支援哪些裝置

2.probe函式  表示如果能夠支援這個裝置的話就呼叫這個函式

3.disconnect函式 表示把這個裝置拔掉之後呼叫這個函式

2.註冊


在寫驅動程式之前,我們看一看參考的例子

usbmouse.c這是一個例子,他是一個真正的USB滑鼠驅動程式。看驅動程式就要從入口函式看起


註冊一個USB結構體


看我們driver結構體有什麼東西呢?


有id_table表示能夠支援哪一些裝置,有probe函式,有disconnect函式。

看一下這個probe函式,假設有一個它能夠支援的裝置出現了,USB相關的操作先不管,我們看核心部分


分配一個input_dev結構體。



這裡是設定,能夠產生按鍵類事件,能夠產生相對位移事件

REL_WHELL是滾輪類事件

按鍵類事件裡面 左鍵,右鍵,中鍵。

相對位移呢 是x方向,y方向,還有滾輪,測鍵,額外的按鍵

然後就是註冊


我們來看看id_table是什麼東西


別人的id_table是這麼一個巨集,這個巨集是什麼意思,我們開啟這個看一下


match_flage表示匹配裝置描述符裡面的哪一項

int是Interface的縮寫 匹配結構的信,匹配類,子類以及協議

回到這個例子程式中,只要你的類是HID 子類是boot,協議是MOUSE  就能夠支援你


來看看我們的probe函式

static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)

看這個probe函式的引數,挺有意思。

我們usb_driver是支援某種interface 是支援介面的,我們之前知道一個USB硬體,可能有多個邏輯上的裝置,這個邏輯上的裝置就是用usb_interface表示的



最簡單的usb驅動程式程式碼

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


static struct usb_device_id usbmouse_as_key_id_table[] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,USB_INTERFACE_PROTOCOL_MOUSE) },
{ } /* Terminating entry */
};


static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
printk("found usbmouse!!!\n");
return 0;
}


static void usbmouse_as_key_disconnect(struct usb_interface *intf)
{
printk("disconnect usbmouse!!!\n");
}
/*1.分配/設定usb_driver*/
static struct usb_driver usbmouse_as_key_driver = {
.name = "usbmouse_as_key",
.probe = usbmouse_as_key_probe,
.disconnect = usbmouse_as_key_disconnect,
.id_table = usbmouse_as_key_id_table,
};
static int usbmouse_as_key_init(void)
{
/*2.註冊usb_driver結構體*/
usb_register(&usbmouse_as_key_driver);






return 0;


}


static void usbmouse_as_key_exit(void)
{


usb_deregister(&usbmouse_as_key_driver);
}


module_init(usbmouse_as_key_init);
module_exit(usbmouse_as_key_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EIGHT");



測試驅動程式

1.make menuconfig 去掉原理的USB滑鼠驅動

在device driver的 HID device

 把這前面的* 給去掉USB Human Interface Device (full HID) support 

2. make 用新核心啟動


3.insmod usb_mouse_as_key.ko 


4.插入 拔出


現象如圖











相關文章