前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第54篇技术报告,由张国栋整理,题目为:
“Zephyr的输入子系统”
作者简介
![](/__local/4/96/9F/59A2F7F196C727F0383DA270C85_9CBE8840_1312E.png)
Fabio是Google ChromeOS嵌入式控制器项目的软件工程师。他是一名电子爱好者和嵌入式爱好者,并且是Zephyr v3.2 的发布经理。
为什么要引入Zephyr的输入子系统?
当前使用输入设备的方式只有通过设备驱动提供的API,但其存在以下缺陷:
API过于单一:如果使用API,就只能注册一个监听器;但是如果想同时做多件事,会需要多个监听器,这就会有一定的限制。
有限的用例:API是为键盘设计的,它仅限于可以在行列中表示的任何内容。
API冗余:比如设备电源管理操作,只需要实现启用和禁用功能,并不是真正需要的API,它们可以在驱动程序级别以通用方式实现。
许多都不是输入设备而是传感器:如下图所示,是nrf52上的正交解码器的驱动程序,它们通常用于实现鼠标和键盘,被实现为传感器。
![](/__local/7/D4/A5/FB486A0ADFF496CAC7DB22F9FBE_57D6C599_2BFA9.png)
![](/__local/E/60/DD/DC6B5C6CCA9F43DF17E3F0100BC_0FE6CE0A_3ED67.png)
在引入zephyr子系统之前,一些简单的尝试:
![](/__local/F/8F/C1/0FC0BA4FA72E77FA2746E56FE10_EA197D01_6708F.png)
![](/__local/1/4D/DD/224F8E64F0B258A579A96ABC917_0CC47111_2ECBB.png)
Linux输入事件的处理流程
分配设备:在Linux输入子系统中,首先需要为输入设备分配资源。涉及到内核模块的加载、设备树的配置或者其他相关的设置。
设置功能:一旦设备被分配,接下来需要设置设备的功能和属性。这包括指定设备的类型、协议和其他与硬件相关的信息。
注册设备:在输入子系统中,设备注册是将设备添加到系统中,使其能够与输入核心进行通信的过程。通常,这包括将输入设备的结构体注册到输入子系统。
发送报告和同步:输入设备在产生事件时需要向输入子系统发送报告。报告包含事件的类型、代码和值。同步是指设备发送同步消息,用于同步多个输入设备的状态。
从/dev/input/event接收事件:在用户空间,应用程序可以通过读取 /dev/input/event 文件来接收输入事件,这些事件包括按键、鼠标移动等。
Zephyr输入子系统
Zephyr输入子系统需要满足以下几点要求:支持多对多模型在构建时注册监听器、支持来自任何类型输入设备的事件、向后兼容kscan、提供可扩展性框架。具体实现了以下内容:
![](/__local/3/31/52/3FC3CC5EBB494B18EC274E28848_B7EC7AF6_2CE28.png)
![](/__local/9/53/2B/A60F23D12260C3180CFB60E2873_7B1D5CB1_1F4D7.png)
![](/__local/F/A5/C6/3DEE4CF14E19C77B13F2D531CD5_10D855A0_29F26.png)
当今情况:
输入子系统的状态如下图所示,已经完成了大部分的功能。接下来的计划包括:完成现有驱动程序的转换、Zbus 集成、添加一些键盘扫描矩阵的通用代码、为LVGL 编写本机接收器、放弃使用Kscan。
![](/__local/C/2A/B3/063FD2EBE5174AD4D92840FAAA0_E5319379_1E875.png)