input.h中的结构体

本文详细解析了input_dev(输入设备代表)、input_handler(事件处理函数)和input_handle(设备与处理者连接)在输入系统中的作用,介绍了注册函数及其关联。重点在于理解设备注册和事件处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看的话,不一定都能看懂,博客主要是记录,便于查阅,有一个整体的记忆。

input.h里面有4个结构体。

struct
   |
    ------ input_value
   |
    ------ input_dev
   |
    ------ input_handler
   |
    ------ input_handle
   |
    ------ ff_device
struct input_value {
    __u16 type;                //按键,坐标,等
    __u16 code;                //上报的码,KEY_F1, KEY_HOME, KEY_Power等
    __s32 value;               // 按下,抬起,长按,x坐标值,y坐标值等
};


---------
struct input_dev - repesents an input device

struct input_handler - implements one of interfaces for input devices

struct input_handle - links input device with an input handler

白话:

1. input_dev代表一个输入设备,在驱动初始化是有一个input_dev对象,填充对象的成员,代表它的功能,并通过input_register_device(input_dev)注册一个输入设备。

2. 输入设备物理触发对应一个事件,产生相应中断,也就有相应的处理函数。就需要input_handler对象,该对象的成员是一些函数指针(指针变量,指向事件处理的函数)。

3. 上述两个(input_dev,input_handler)通过一个结构体联系起来,那就是input_handle。联系起来,及时这个结构体里面有上述两个结构体的指针,实例化对象时,有成员指向。


input_dev的注册函数时input_resiter_dev(input_dev).
input_hanlder的注册函数是input_register_handler(input_handler).
input_handle的注册函数是input_register_handle(input_handle).

### 配置 `linux/input.h` 的使用方法 #### 正确配置和使用 `linux/input.h` 在 Linux 内核开发中,`linux/input.h` 是一个核心头文件,主要用于处理输入子系统的事件和设备管理。为了正确配置并使用该头文件,开发者需要遵循以下原则: 1. **引入必要的头文件** 开发者应确保在源代码中包含 `linux/input.h` 和其他相关的内核头文件。例如,可以结合 `<linux/module.h>` 或 `<linux/init.h>` 来实现模块化支持[^1]。 2. **初始化输入设备结构体** 输入设备的核心数据结构是 `struct input_dev`,它位于 `drivers/input/input.c` 文件中定义,并通过 `input_allocate_device()` 函数分配实例。以下是创建输入设备的一个简单示例: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/input.h> // 引入 input 子系统头文件 #include <linux/slab.h> static struct input_dev *my_input_dev; static int __init my_module_init(void) { int ret; // 分配一个新的输入设备对象 my_input_dev = input_allocate_device(); if (!my_input_dev) { printk(KERN_ERR "Failed to allocate input device\n"); return -ENOMEM; } // 设置输入设备的能力 (按键、鼠标等) set_bit(EV_KEY, my_input_dev->evbit); // 支持按键事件 set_bit(KEY_ENTER, my_input_dev->keybit); // 注册 Enter 键 // 注册输入设备到内核 ret = input_register_device(my_input_dev); if (ret) { printk(KERN_ERR "Failed to register input device: %d\n", ret); input_free_device(my_input_dev); return ret; } printk(KERN_INFO "Input device registered successfully.\n"); return 0; } static void __exit my_module_exit(void) { input_unregister_device(my_input_dev); // 卸载输入设备 printk(KERN_INFO "Input device unregistered.\n"); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Example Developer"); MODULE_DESCRIPTION("A simple example of using the input subsystem."); ``` 上述代码展示了如何动态分配输入设备资源以及设置其能力位图。这一步骤对于自定义硬件驱动程序尤为重要。 3. **利用 DMA 映射操作优化性能** 如果涉及高性能的数据传输场景,则可能需要用到 DMA 技术来提升效率。此时可以通过 `<linux/dma-mapping.h>` 提供的功能完成内存映射工作[^2]。例如: ```c #include <linux/dma-mapping.h> dma_addr_t dma_handle; void *buffer = kmalloc(SIZE, GFP_KERNEL); if (buffer) { dma_handle = dma_map_single(dev, buffer, SIZE, DMA_TO_DEVICE); } ``` 此片段说明了如何将一块物理地址空间转换成适合 DMA 访问的形式。 4. **命令行参数解析工具 CLI11 应用案例** 虽然 CLI11 主要应用于用户态 C++ 程序设计领域而非内核编程环境,但它同样能够帮助简化复杂选项的解析逻辑[^3]。假设我们需要构建一款调试工具用来测试前面提到的输入设备行为模式时,可参考如下方式快速搭建框架: ```cpp #include <CLI/CLI.hpp> #include <iostream> int main(int argc, char **argv) { CLI::App app{"Debugging tool for custom input devices"}; bool verbose{false}; std::string event_type; app.add_flag("-v,--verbose", verbose, "Enable detailed logging")->default_val(false); app.add_option("--event-type", event_type, "Specify type of events to monitor")->required(); try { app.parse(argc, argv); } catch(const CLI::ParseError &e) { return app.exit(e); } if(verbose){ std::cout << "Verbose mode enabled." << std::endl; } std::cout << "Monitoring '" << event_type << "' events..." << std::endl; return 0; } ``` 这段脚本允许终端用户提供额外标志控制输出详尽程度或者指定感兴趣的特定类别消息流。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值