一、输入子系统的使用步骤
1.包含相关头文件
#include <linux/input.h>
2.申请输入子系统核心结构体的填充和注册
//定义输入子系统核心结构体
struct input_dev *myDev;
//申请输入子系统核心结构体
myDev=input_allocate_device();myDev->name="xyd_key";
set_bit(EV_KEY, myDev->evbit);
set_bit(KEY_ENTER, myDev->keybit);
//注册输入子系统
null=input_register_device(myDev);

3. 注销输入子系统
input_unregister_device(myDev);

如果,代码中加入input_free_device(myDev);的话,在卸载模块的时候会报乱码。因为在input_unregister_device函数中已经调用过input_free_device函数了。
4. 事件上报和事件同步

每次事件上报完成之后需要同步函数,不然数据不能有效的传递到应用层
5. 应用层写相关逻辑代码
//包含相关头文件
#include <linux/input.h>
//在超级终端中 通过 cat /proc/bus/input/devices/
//指令查询我们设置输入设备名称
//设备文件会存在于/dev/input/event*
//定义接收结构体
struct input_event myInfo;
//然后通过read函数读取数据到结构体进行相对应的逻辑判断和处理
read(fd,&myInfo,sizeof(myInfo));
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <poll.h>
#include <linux/input.h>
int value=0;
int main(int argc,char *argv[])
{
if(argc<2)
{
printf("error\n");
return 0;
}
int fd = open(argv[1],O_RDWR);
int value =0;
struct input_event myInfo;
printf("111111111111111\n");
while(1)
{
read(fd,&myInfo,sizeof(myInfo));
if(myInfo.code== KEY_ENTER)
{
if(myInfo.value==1)
{
printf("key1 press!!!\n");
}
else if(myInfo.value==2)
{
printf("key2 press!!!\n");
}else if(myInfo.value==3){
printf("key2 unpress!!!\n");
}else if(myInfo.value==0){
printf("key1 unpress!!!\n");
}
}
}
}
二、使用输入子系统完成两个按键的检测
我们通过设备树相关中断和GPIO的配置,通过平台设备总线获取中断号和GPIO号,然后在加载函数中初始化输入子系统的相关结构体,当按键中断触发时,我们将事件同步和上报个应用层的read阻塞函数,我们就可以通过子系统获取按键的状态。main函数同上

#include <linux/module.h>
#include <linux/kernel.h>
//输入子系统的头文件
#include <linux/input.h>
//平台设备总线头文件
#include <linux/platform_device.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
//中断相关头文件
#include <linux/interrupt.h>
#include <linux/irq.h>
struct input_dev *myDev;
//定义相关结构体
struct of_device_id info =
{
.name="xyd-key",
.compatible ="key-platdata"
};
struct platform_driver myPlatdriver;
int key1_gpio=0;
int irq1_num=0;
int key2_gpio=0;
int irq2_num=0;
int null=0;
irqreturn_t key1_interrupt (int irq,void* data)
{
if(gpio_get_value(key1_gpio)==0)
{
//事件上报
input_event(myDev


957

被折叠的 条评论
为什么被折叠?



