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;}
}

相关内容

热门资讯

白银基金紧急公告,今日复牌后再... 红星资本局2月3日消息,在经历了恐慌抛售后,贵金属市场本周进入巨震模式。 资料配图 图据图虫创意 ...
2025海外仓融资企业实力排名... 近日,第三方权威机构发布《2025年度海外仓融资企业实力榜单》,从技术创新、服务覆盖广度、金融产品场...
美股三大指数均升幅收市 电讯行... 港股走势及分析 美股周一大幅反弹,美国最新经济数据表现理想,大市先跌后回稳,三大指数均录得升幅收市。...
公牛集团阮立平:锚定智能电工照... 乐居财经 李兰 1月31日下午,公牛集团2026年第十二届正能量新春联欢会暨2025年总结表彰大会举...
2026上海两会·速递|上海经... 2月3日上午,上海市第十六届人民代表大会第四次会议开幕(央广网记者 唐奇云 摄) 央广网上海2月3日...
马斯克旗下SpaceX确定与x... 2月3日上午收盘,市场早盘冲高回落后,又再度震荡拉升。三大指数盘中翻绿,创业板指此前一度涨超2%。沪...
港股AI加速寻底,513770... 2月3日,港股科技高开低走,互联网龙头延续震荡,阿里巴巴-W跌超3%,腾讯控股、哔哩哔哩-W跌逾5%...
原创 千... 导语:功能饮料“龙头”打新凉凉? 想打新功能饮料“龙头股”的投资者凉了。 2月3日,市值千亿、有“A...
阿里系前高管加入,擎天租启动全... 红星资本局2月3日消息,全球机器人租赁服务平台擎天租宣布完成新一轮关键管理层布局,阿里渠道建设专家李...
ST股极限狂奔:业绩预告现原形... 每当年报过后,就会有一批因业绩再度不达标的风险警示股黯然挥手资本市场,而业绩预告,往往成为市场观察这...
抖音电商鲜食年货买买买图鉴:生... 距2026年除夕仅剩2周,家家户户的年夜饭筹备进入冲刺阶段。承载乡愁的地标农品和南北干货、装点年味的...
SpaceX并购xAI,太空A... 截图来自xAI官网 刚刚,史上最大规模并购交易诞生。 当地时间2月2日,全球首富埃隆·马斯克(Elo...
厦门象屿启动新五年战略:重塑角... 2026年初,大宗供应链行业龙头——厦门象屿(600057.SH)正式发布《2026-2030年发展...
马斯克整合旗下版图:Space... 当地时间2月2日,美国科技富豪马斯克旗下的太空探索技术公司(SpaceX)发表声明,宣布已收购同属于...
太空光伏打开想象空间,光伏龙头... 截止2月3日10点19分,三大指数活跃上涨。光伏设备、HJT电池、国产航母等板块涨幅居前。ETF方面...
张勇复出,海底捞也不会了? 大刀阔斧地改革,砍掉那些影响发展的枝蔓。 文 | 华商韬略 杨彼得 2026年1月13日,海底捞一纸...
原创 刚... 2月3日,东鹏饮料正式在港交所主板挂牌上市,完成A+H双资本架构闭环,成为亚洲消费饮料行业近年最大规...
上交+清华团队做端侧AI:连续... 作者丨欧雪 编辑丨袁斯来 硬氪获悉,端侧AI领军应用企业上海辛米尔科技有限公司(以下简称“辛米尔”)...
白酒板块获机构看好,皇台酒业盘... 2月3日,白酒概念反复活跃,皇台酒业(000995.SZ)盘中触及涨停,金徽酒(603919.SH)...
孩子不长个?不是缺钙,是忽略了... “孩子比同龄人矮半头,是不是缺钙?”不少家长一发现孩子身高落后,就忙着补钙、补维生素D,却往往收效甚...