Introduce input subsystem
本 MR 为 CSK6 多模态开发套件引入了 Zephyr Input Subsystem 支持。相比于 GPIO interrupt 和 KSCAN 等传统方式,Input Subsystem 提供了更好的抽象,开发者侧可以以统一的 API 处理这些输入,而不再需要关心具体的外设类型。
关联 MR
主要变化
- 更新了 Zephyr 仓的版本,引入了一个 ADC Key 的 input 驱动
- 为
csk6_duomotai_devkit
和csk6012_nano
定义了 input subsystem 的 DTS 节点
使用方式
overlay 和 conf 配置
详见:
应用层代码
#include <zephyr/kernel.h>
#include <zephyr/input/input.h>
static uint16_t last_key = 0;
static void input_work_cb(struct k_work *work)
{
ARG_UNUSED(work);
switch (last_key) {
case INPUT_KEY_1:
/* CH32_KEY: K1 */
break;
case INPUT_KEY_2:
/* CH32_KEY: K2 */
break;
case INPUT_KEY_B:
/* CSK_KEY: BOOT */
break;
case INPUT_KEY_3:
/* CSK_KEY: K3 */
break;
}
}
K_WORK_DEFINE(input_work, input_work_cb);
static void input_cb(struct input_event *evt)
{
/* 回调发生在 input subsys 内部线程中,通常需要提交到 system workqueue 处理 */
if (evt->type == INPUT_EV_KEY && evt->value) {
last_key = evt->code;
k_work_submit(&input_work);
}
}
INPUT_LISTENER_CB_DEFINE(NULL, input_cb);
示例
lisa zep build -b csk6_duomotai_devkit -s .sdk/zephyr/samples/subsys/input/input_dump -p
-- 已打开串口 /dev/cu.usbmodem124201,波特率 115200 --
-- 按 Ctrl + C 退出 --
*** Booting Zephyr OS build zephyr-v3.4.0-50-g72d38e2eb481 ***
*** ListenAI CSK SDK Version: 2.0.0.0-92d7a8039a ***
Input sample started
input event: dev=adc-keys SYN type= 1 code= 2 value=1
input event: dev=adc-keys SYN type= 1 code= 2 value=0
input event: dev=adc-keys SYN type= 1 code= 3 value=1
input event: dev=adc-keys SYN type= 1 code= 3 value=0
input event: dev=gpio-keys SYN type= 1 code= 48 value=1
input event: dev=gpio-keys SYN type= 1 code= 48 value=0
input event: dev=gpio-keys SYN type= 1 code= 4 value=1
input event: dev=gpio-keys SYN type= 1 code= 4 value=0