Linux 学习笔记:input 子系统
admin
2024-02-29 01:55:51
0

一、概述

input 子系统是管理输入的子系统,和pinctrl、gpio 子系统一样,都是Linux 内核针对某一类设备而创建的框架。

input 子系统分为 input 驱动层、input 核心层、input 事件处理层,最终给用户空间提供可访问的设备节点。

二、使用input 子系统编写设备驱动的流程

2.1 驱动入口

2.1.1 申请 input_dev

struct input_dev *input_allocate_device(void)

返回值:申请到的input_dev

2.1.2 初始化 input_dev

需要初始化的内容主要为事件类型(evbit) 和 事件值(keybit)这两种。

keyinputdev.inputdev = input_allocate_device();
keyinputdev.inputdev->name = KEYINPUT_NAME;
keyinputdev.inputdev->evbit[0] = BIT_MASK( EV_KEY ) | BIT_MASK( EV_REP );
input_set_capability( keyinputdev.inputdev, EV_KEY, KEY_3 );

2.1.3 注册 input_dev

int input_register_device(struct input_dev *dev)

dev : 要注册的input_dev

返回值:0,input_dev 注册成功;负值,input_dev 注册失败。

2.2 上报事件

2.2.1 上报事件的时机

利用input 子系统编写按键驱动,input 子系统并不负责按键按下的检测。为了实现按键的检测,我们还是需要:

  1. 读取设备树,获取按键的GPIO;
  2. 为这个IO申请中断;
  3. 在中断处理函数,开启定时器,进行防抖处理。
  4. 在定时器处理函数,读取gpio 的输入状态。

在上面的第4步,读取到gpio 的输入值之后,调用input 子系统的上报函数,上报输入事件。

2.2.2 上报按键事件的API

不同的事件,其上报事件的API 函数不同。按键事件的上报API 如下:

static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
{input_event(dev, EV_KEY, code, !!value);
}

2.2.3 上报同步事件

我们需要上报同步事件,告知input 子系统 上报结束

static inline void input_sync(struct input_dev *dev)
{input_event(dev, EV_SYN, SYN_REPORT, 0);
}

2.2.4 上报事件的底层实现函数 input_event

从上面可以看到,上报按键事件和上报同步事件,调用的都是input_event 函数。input_event 函数可以上报所有的事件类型和事件值。下面是input_event 的声明:

void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)

函数参数和返回值含义如下:

dev : 需要上报的input_dev 。

type: 上报的事件类型,比如:EV_KEY 。

code : 事件码,也就是我们注册的按键编号,比如:KEY_0

value : 事件值,比如1表示按键按下,0表示按键松开。

2.3 驱动出口

卸载input 驱动的时候,需要先注销input_dev

void input_unregister_device( struct input_dev *dev );

然后释放 input_dev

void input_free_device( struct input_dev *dev );

三、应用层读取input event

3. 1 input_event 结构体

Linux 内核使用input_event 这个结构体来表示所有的输入事件,结构体定义在 include/uapi/linux/input.h 文件中。

struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;
};
  • time : 时间,也就是此事件发生的时间。
  • type : 事件类型,比如EV_KEY, 表示此次时间为按键事件。
  • code : 事件码,比如在EV_KEY 事件中,code 就表示具体的按键码,如:KEY_0,KEY_1
  • value : 值,比如EV_KEY 事件中value 就是按键值。为1表示按键按下,为0表示按键松开。

3.2 应用层读取

err = read( fd, &inputevent, sizeof( inputevent ) );
//读取数据成功
if ( err > 0 )
{switch ( inputevent.type ){case EV_KEY:if ( inputevent.code < BTN_MISC ){printf( "key %d %s\r\n", inputevent.code, inputevent.value ? "press": "release" );}else{printf( "button %d %s\r\n", inputevent.code, inputevent.value ? "press": "release" );}break;}
}

相关内容

热门资讯

海南自贸港“样板间”抢抓开放机... 中新网海口5月16日电 (记者 王子谦)洋浦经济开发区是海南自贸港“样板间”,也是外界观察自贸港建设...
净利增速2.98%,违规频发!... 近期,中信银行2025年年报与2026年一季报接连公布,报告显示,中信银行总资产站稳10万亿元台阶,...
原创 放... 全网的人几乎都在挤破头往海外大都市扎,可有一个女博主,却偏偏反着来。她拥有五百多万粉丝,本可以继续在...
原创 在... 在中国,买卖虚拟货币,到底行不行? 这个问题,很多人心里都犯嘀咕。有人说,法无禁止即可为;也有人说,...
龙粤慈善事业高质量发展与互联网... 近日,为加快培育数字慈善新生态,助力“善行边疆”活动走深走实,“龙粤慈善事业高质量发展与互联网公开募...
黄金大局已定:不出意外的话,2... 在投资领域,贵金属一直是备受关注的资产类别,尤其是黄金,其价格走势和投资价值牵动着无数投资者的心。随...
后巴菲特时代,伯克希尔哈撒韦新... 【导读】伯克希尔哈撒韦最新持仓公布!清仓亚马逊,建仓达美航空 中国基金报记者 张舟 伯克希尔哈撒韦“...
布朗46分胡金秋20+8 广厦... 【搜狐体育战报】北京时间5月16日CBA季后赛,主场作战的浙江浙商证券以111-102击败深圳马可波...
美联储任命鲍威尔担任临时主席 美国联邦储备委员会理事会5月15日发布公告,任命杰罗姆·鲍威尔担任美联储临时主席,直至凯文·沃什宣誓...
李从悠:白癜风患者,夏季防汗疹... 夏季高温多雨,白癜风患者皮肤屏障受损,出汗后汗液无法及时蒸发,易堵塞毛孔,诱发汗疹(热疹),汗疹引发...
最低涨价60元!4款非标茅台酒... 在飞天茅台涨价之后,部分非标茅台酒也提了价。 5月16日早间,贵州茅台自营渠道i茅台发布公告,宣布对...
邯郸10亿共享智造基金落地,撬... 图片为AI生成 据天眼查App显示,近日邯郸市共享智造股权投资基金(有限合伙)正式登记成立,总出资额...
AI制药行业深度:行业概况、市... 一、AI制药行业概况 1、AI药物研发概述 AI制药是指将NLP、深度神经网络,生成模型等AI技...
世界杯在即:国产彩电的出海故事... 球还没看,彩电先破防了 撰文/ 孟会缘 编辑/ 陈邓新 排版/ Annalee 国产彩电品牌,正深陷...
医疗健康领域投融资日报(5月1... 据亿欧数据统计,昨日(2026年5月15日)共披露16起投融资事件,涉及15家国内企业,1家国外企业...
深圳中创商业咨询携手海旗控股集... 海旗控股集团旗下宁波锦曼程新材料有限公司,自创立以来始终深耕高分子材料领域,秉承推动行业创新与可持续...
原创 关... 前言 大家好,我是老金。 国际地缘博弈的棋盘上,从来没有绝对的秘密,只有刻意或无意的战略试探,近期...
原创 欧... 今天来给大家聊一下最近的欧盟,自从特朗普说要来访华,欧洲的动作有点让人看不懂。从四月中旬到五月初,欧...
心系投资者 携手共行动 ——人... 为落实监管工作要求,切实维护金融消费者合法权益,在 “5・15 全国投资者保护宣传日” 当天,人保寿...
黄仁勋打卡蜜雪冰城 同款产品销... 财联社5月16日讯(记者 沈娇娇)5月15日上午,英伟达CEO黄仁勋现身北京南锣鼓巷,并且进入一家蜜...