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.插入 拔出
現象如圖
相關文章
- garmin USB: linux USB host驅動Linux
- Linux驅動開發筆記(一):helloworld驅動原始碼編寫、makefile編寫以及驅動編譯Linux筆記原始碼編譯
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- USB驅動正常,USB沒有反應
- Linux RN6752 驅動編寫Linux
- extcon驅動及其在USB驅動中的應用
- linux裝置驅動編寫入門Linux
- 如何編寫linux下nandflash驅動-4LinuxNaN
- Linux USB ECM Gadget 驅動介紹Linux
- HarmonyOS USB DDK助你輕鬆實現USB驅動開發
- linux 觸控式螢幕驅動編寫Linux
- Ace Editor 擴充套件編寫初步(轉)套件
- Asahi Lina講述了使用Rust編寫Linux驅動程式的經驗RustLinux
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- 如何從USB驅動器執行Jutoh?
- 【IDL〕編寫程式啟動介面
- Linux驅動開發筆記(三):基於ubuntu的驅動、makefile編寫以及編譯載入流程Linux筆記Ubuntu編譯
- USB xHCI Compliant Host Controller驅動是指支援USB 3.0及以上標準的主機控制器驅動程式。這種驅動程式允許計算機系統與USB 3.0及更高版本的裝置進行通訊和資料傳輸。Controller計算機
- 對USB驅動下載失敗的解決
- 效能測試——壓測工具locust——指令碼初步編寫指令碼
- Android多程式之手動編寫Binder類Android
- Linux驅動實踐:帶你一步一步編譯核心驅動程式Linux編譯
- Linux驅動實踐:你知道【字元裝置驅動程式】的兩種寫法嗎?Linux字元
- Qt編譯MySQL驅動QT編譯MySql
- 08_第一個相對完整的驅動實踐編寫
- Java程式編寫Java
- usb音效卡win10顯示驅動錯誤如何修復_win10系統usb音效卡驅動錯誤處理方法Win10
- Linux MIPI 攝像頭驅動框架編寫(RN6752解碼晶片)Linux框架晶片
- 案例十:shell編寫nginx服務啟動程式Nginx
- Python編寫守護程式程式Python
- Sublime 編寫編譯 swift程式碼編譯Swift
- macOS Big Sur無法識別USB外接驅動器怎麼辦Mac
- 驅動開發常見縮寫
- 彙編初步瞭解筆記筆記
- Python編寫shellcode注入程式Python
- PHP 編寫守護程式PHP
- USB3.0與USB2.0編碼方式的區別
- win10系統usb驅動安裝失敗怎麼解決Win10
- Centos7.3編譯RAID驅動(一)CentOS編譯AI