按键驱动
简介
按键驱动 是 TuyaOpen 中用于处理用户输入的核心组件。它提供了统一的接口来管理不同类型的按键设备,支持多种按键事件检测和处理机制。通过这个驱动,应用可以轻松地实现按键输入检测、事件处理和状态管理,而无需关心底层硬件的具体实现细节。
前置概念
名词 | 解释 |
---|---|
GPIO | 通用输入输出引脚,用于连接按键等外部设备 |
消抖 | 按键在按下或松开时会产生机械抖动,需要通过软件或硬件方式消除 |
上拉/下拉 | GPIO引脚的电平配置方式,用于确定按键未按下时的默认状态 |
中断 | 硬件事件触发的异步通知机制,可实现低功耗的按键检测 |
轮询 | 定时检查按键状态的检测方式,适用于简单应用场景 |
有效电平 | 按键按下时GPIO引脚的电平状态,可配置为高电平或低电平有效 |
边沿触发 | 中断触发方式,可配置为上升沿、下降沿或双边沿触发 |
状态机 | 用于管理按键事件检测和处理的逻辑控制机制 |
按键连接框架
根据硬件设计的不同,按键连接方式也会有所不同。常见的连接方式包括上拉按键和下拉按键两种。
上拉按键连接框架

下拉按键连接框架

功能模块
TuyaOpen 旨在提供一个标准化的、与平台无关的按键解决方案,核心的设计思想是分层解耦。它将应用层对按键的需求与底层具体的硬件实现分离开。
- 对应用开发者而言:无论底层用的是什么芯片的GPIO,应用层都只需要调用一套统一的、标准化的 API(tdl_button_xxx 系列函数),如 tdl_button_create, tdl_button_event_register 等。这大大降低了应用开发的复杂性,提高了代码的可移植性。
- 对驱动开发者而言:当需要支持一款新的硬件平台时,只需要遵循
tdl_button_driver.h
定义的标准接口,编写一个新的 TDD 层驱动(类似tdd_button_gpio.c
),然后注册到TDL管理层即可,无需改动任何应用层代码。
抽象管理模块:TDL (Tuya Driver Layer)
这是最高层的抽象,面向应用层提供统一的按键服务接口。
- tdl_button_manage.c/h: 实现了按键驱动的管理核心。它维护一个链表,用于注册和管理不同类型(或不同平台)的按键设备驱动。应用通过调用 tdl_button_create、tdl_button_event_register 等函数来使用按键功能,而无需关心底层的具体实现。
- tdl_button_driver.h: 定义了所有按键设备驱动必须遵守的"标准化接口"(TDL_BUTTON_CTRL_INFO),包括 button_create, button_delete, read_value等函数指针。这确保了 tdl_button_manage 可以统一地调用任何符合该标准的底层驱动。
实例化注册模块:TDD (Tuya Device Driver)
这是驱动的中间层,是特定硬件平台的具体实现。
- tdd_button_gpio.c/h: 针对GPIO按键的驱动实现。它负责承上启下,向上实现了 TDL 所定义的 TDL_BUTTON_CTRL_INFO 标准接口;向下调用 TKL 层的GPIO接口来控制真实的硬件。tdd_gpio_button_register 函数会将这个驱动的实现(函数指针)注册到 TDL 层。
功能介绍
a. 按键事件检测
- 多种事件类型:支持按下、松开、单击、双击、多击、长 按开始、长按保持等多种按键事件。
- 异步事件回调:驱动采用回调机制(TDL_BUTTON_EVENT_CB)将检测到的按键事件实时推送给应用层。应用层无需主动轮询按键状态,而是被动接收事件通知,效率更高。
- 状态机处理:内部使用状态机来管理按键的各种状态转换,确保事件检测的准确性和可靠性。
b. 按键扫描模式
- 定时扫描模式:通过定时器定期检查按键状态,适用于对功耗要求不高的应用场景。
- 中断扫描模式:利用GPIO中断机制检测按键状态变化,实现低功耗的按键检测,适用于电池供电设备。
c. 消抖处理
- 软件消抖:通过可配置的消抖时间参数,有效消除按键机械抖动带来的误触发。
- 灵活配置:消抖时间可根据不同按键的特性进行个性化配置。
d. 长按功能
- 可配置的长按检测:支持配置长按开始时间和长按保持触发间隔。
- 长按事件分离:区分长按开始事件和长按保持事件,满足不同应用需求。
e. 多击检测
- 双击/多击支持:支持双击和多击事件检测,可配置多击的有效次数和时间窗口。
- 灵活的时间配置:可配置多击事件的有效时间间隔。
f. 可扩展的驱动管理
- 动态注册与发现:系统可以同时注册多个不同的按键驱动。
- 按名查找:应用层可以通过一个字符串名称来查找并获取特定按键设备的句柄,实现了灵活的设备选择。
支持外设列表
按键类型 | 轮询扫描 | 中断扫描 |
---|---|---|
GPIO按键 | ✅ | ✅ |
矩阵键盘 | ✅ | ✅ |
电容触摸按键 | ❌ | ❌ |
ADC按键 | ❌ | ❌ |
工作流程
以 GPIO 按键为例,介绍按键驱动框架工作流程。
开发指导
Kconfig 配置
如果想要将驱动加入编译,需要在编译前检查是否开启相关 Kconfig 选项。在目标工程路径下,终端执行 tos.py config menu
查看以下配置选项。
配置宏 | 类型 | 说明 |
---|---|---|
enable button | 布尔 | 该宏被打开,驱动代码才会参与编译。 |
the num of button | 整型 | 配置按键数量 |
the name of button 1 | 字符串 | 配置第一个按键的设备名 |
the name of button 2 | 字符串 | 配置第二个按键的设备名 |
the name of button 3 | 字符串 | 配置第三个按键的设备名 |
the name of button 4 | 字符串 | 配置第四个按键的设备名 |

提示
以上配置项须在 src/peripherals/button/Kconfig
和 boards/<target_platform>/<target_board>/Kconfig
(选择自己目标开发板查看 Kconfig 文件)中支持,若没有发现相关配置项,请检查这两个文件内容。