usb驅動程式初步編寫
今天我們的目標是將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.插入 拔出
現象如圖
相關文章
- Linux驅動開發筆記(一):helloworld驅動原始碼編寫、makefile編寫以及驅動編譯Linux筆記原始碼編譯
- garmin USB: linux USB host驅動Linux
- USB驅動程式之滑鼠用做鍵盤
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- Linux網路驅動程式編寫(四)(轉)Linux
- Linux網路驅動程式編寫(三)(轉)Linux
- Linux網路驅動程式編寫(二)(轉)Linux
- Linux網路驅動程式編寫(一)(轉)Linux
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- Windows95的裝置驅動程式的編寫 (轉)Windows
- Linux RN6752 驅動編寫Linux
- 編寫安全的驅動程式之輸入輸出檢查
- extcon驅動及其在USB驅動中的應用
- linux裝置驅動編寫入門Linux
- 如何編寫linux下nandflash驅動-4LinuxNaN
- linux裝置驅動編寫基礎Linux
- HarmonyOS USB DDK助你輕鬆實現USB驅動開發
- 編寫軟體動態載入NT式驅動
- 如何從USB驅動器執行Jutoh?
- linux 觸控式螢幕驅動編寫Linux
- Ace Editor 擴充套件編寫初步(轉)套件
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- Linux USB ECM Gadget 驅動介紹Linux
- linux usb 驅動開發 抓包工具Linux
- Windows7禁USB自動安裝驅動功能Windows
- Linux下的硬體驅動——USB裝置(上)(驅動配置部分)(轉)Linux
- Linux驅動開發筆記(三):基於ubuntu的驅動、makefile編寫以及編譯載入流程Linux筆記Ubuntu編譯
- 對USB驅動下載失敗的解決
- usb驅動開發1之學習準備
- 乾坤合一:Linux裝置驅動之USB主機和裝置驅動Linux
- Linux下的硬體驅動——USB裝置(下)(驅動開發部分)(轉)Linux
- Linux系統核心模組和驅動的編寫(轉)Linux
- Asahi Lina講述了使用Rust編寫Linux驅動程式的經驗RustLinux
- 效能測試——壓測工具locust——指令碼初步編寫指令碼
- Qt編譯MySQL驅動QT編譯MySql
- 寫作驅動學習
- 利用Django通用類檢視(class-based view)編寫資料驅動(ModeForm)WEB程式整理DjangoViewORMWeb
- 入門文章:教你學會編寫Linux裝置驅動(轉)Linux