input子系统一:输入设备驱动编写

input子系统一:输入设备驱动编写

在学习input子系统内核代码之前,先来看看我们如何编写一个符合input子系统框架的输入设备驱动,以最简单的按键为例子。

1、驱动编写步骤

1、分配一个struct input_dev结构体
2、设置设备能产生哪类和哪些事件
3、注册
4、硬件相关的操作(中断、上报事件等)

2、接口函数

在编写之前先来看看会用到的几个关键的函数:
1、分配相关的函数

struct input_dev *input_allocate_device(void)
return:成功 返回struct input_dev 失败 NULL
NOTE:当注册不成功时使用 input_free_device() 来释放设备,如果注册成功了应该使用 input_unregister_device() 来注销设备
---------------------------------------------------------------------
struct input_dev *devm_input_allocate_device(struct device *dev)
@dev:拥有正在创建的输入设备的设备,如果你的设备时一个i2c设备 那这里就是
	i2c_client->dev
return:成功 返回struct input_dev 失败 NULL
NOTE:如果调用这个函数来分配一个输入设备struct input_dev,就不再需要我们自己来主动释放这个设备,内核会在驱动卸载的时候自动释放

2、设置相关的函数

void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)
@dev:用前面说的函数申请的结构体struct input_dev
@type:能产生哪类事件,按键就是按键类事件 EV_KEY
@code:能产生这类事件中的哪些事件,比如键盘上的字母,空格,enter,鼠标的左右键等
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在开发输入子系统设备驱动时,通常遵循以下步骤: 1. 包含必要的头文件:在驱动程序的源文件中,你需要包含一些必要的头文件,例如`linux/input.h`、`linux/module.h`、`linux/init.h`等。 2. 定义驱动模块:使用`module_init`宏定义一个初始化函数,用来加载驱动程序。例如: ```c static int __init myinput_init(void) { // 驱动初始化逻辑 return 0; } module_init(myinput_init); ``` 3. 注册输入设备:在初始化函数中,你需要创建一个输入设备并进行注册。你可以使用`input_allocate_device`函数分配一个输入设备结构体,并设置一些属性,例如设备名称、支持的事件类型等。然后,使用`input_register_device`函数注册输入设备。例如: ```c static int __init myinput_init(void) { struct input_dev *myinput_dev; myinput_dev = input_allocate_device(); if (!myinput_dev) { pr_err("Failed to allocate input device\n"); return -ENOMEM; } // 设置设备名称、支持的事件类型等 input_register_device(myinput_dev); return 0; } ``` 4. 处理输入事件:注册完输入设备后,你需要实现一个中断处理函数或者定时器处理函数,用来处理输入事件。当触发输入事件时,驱动程序会调用该函数进行处理。你可以使用`input_report_*`系列函数上报输入事件,例如鼠标移动、按键按下等。例如: ```c static irqreturn_t myinput_interrupt(int irq, void *dev_id) { // 处理输入事件的逻辑 input_report_key(myinput_dev, KEY_A, 1); // 模拟按下 A 键 input_sync(myinput_dev); // 同步输入事件 return IRQ_HANDLED; } ``` 这只是一个简单的示例,实际的输入子系统设备驱动可能还需要处理更多的细节和特定的硬件接口。更详细的编写方法和实现细节可以参考Linux内核源码中的驱动示例和相关文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值