簡單注冊示例如下:
#include <linux/module.h>
#include <linux/init.h> #include <linux/input.h> #define DRIVER_NAME "my_input_driver" #define DEVICE_NAME "my_input_device" static struct input_dev *input_device; static int my_input_open(struct input_dev *dev) { // 處理設(shè)備打開操作 return 0; } static void my_input_close(struct input_dev *dev) { // 處理設(shè)備關(guān)閉操作 } static int __init my_input_driver_init(void) { int err; // 分配輸入設(shè)備 input_device = input_allocate_device(); if (!input_device) { pr_err("Failed to allocate input devicen"); return -ENOMEM; } // 設(shè)置輸入設(shè)備的屬性 input_device->name = DEVICE_NAME; input_device->phys = "my_input_driver/0"; input_device->id.bustype = BUS_VIRTUAL; // 設(shè)置輸入設(shè)備支持的事件類型和事件碼 input_device->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); input_device->keybit[BIT_WORD(KEY_ENTER)] = BIT_MASK(KEY_ENTER); // 設(shè)置輸入設(shè)備的打開和關(guān)閉回調(diào)函數(shù) input_device->open = my_input_open; input_device->close = my_input_close; // 注冊輸入設(shè)備 err = input_register_device(input_device); if (err) { pr_err("Failed to register input device: %dn", err); input_free_device(input_device); return err; } pr_info("Input device registeredn"); return 0; } static void __exit my_input_driver_exit(void) { // 注銷輸入設(shè)備 input_unregister_device(input_device); input_free_device(input_device); pr_info("Input device unregisteredn"); } module_init(my_input_driver_init); module_exit(my_input_driver_exit); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("Sample Input Driver"); MODULE_LICENSE("GPL"); |
上述示例中,我們定義了一個名為my_input_driver的輸入設(shè)備驅(qū)動程序,它使用Input子系統(tǒng)提供的API來創(chuàng)建和注冊輸入設(shè)備。
在驅(qū)動程序的初始化函數(shù)my_input_driver_init中,我們首先通過input_allocate_device分配一個輸入設(shè)備結(jié)構(gòu)體input_device。然后,我們設(shè)置輸入設(shè)備的名稱、物理地址和總線類型。接下來,我們指定輸入設(shè)備支持的事件類型和事件碼,這里我們選擇了鍵盤事件,支持Enter鍵。最后,我們注冊輸入設(shè)備通過調(diào)用input_register_device函數(shù)進行注冊。
在驅(qū)動程序的卸載函數(shù)my_input_driver_exit中,我們通過input_unregister_device注銷輸入設(shè)備,并通過input_free_device釋放分配的輸入設(shè)備結(jié)構(gòu)體。