概述
架构
CTC 驱动程序遵循 Linux 的输入子系统。输入子系统为用户空间提供 CTC 接口。CTC 软件架构在下图中进行了说明。
CTC 软件架构包含以下部分:
输入驱动: CTC 驱动。
输入核心: 输入子系统核心驱动。它是输入驱动层和事件处理层之间的链接和桥梁,向下为硬件输入驱动层提供接口,向上为事件处理层提供接口。
事件处理器:与用户空间交互,用于将来自硬件驱动层的事件报告给用户程序。
应用:用户空间使用。一个展示如何使用 CTC 的简单示例。
更多细节请参考 Input Device Driver v5.4 或 Input Device Driver v6.6 。
实现
CTC 驱动的实现文件如下:
驱动位置 |
介绍 |
---|---|
<linux>/drivers/rtkdrivers/captouch/Kconfig |
CTC 驱动程序 Kconfig |
<linux>/drivers/rtkdrivers/captouch/Makefile |
CTC 驱动程序 Makefile |
<linux>/drivers/rtkdrivers/captouch/realtek-captouch.c |
CTC 函数 |
<linux>/drivers/rtkdrivers/captouch/realtek-captouch.h |
CTC相关的函数声明、宏定义、结构体定义以及引用的其他头文件。 |
配置
设备树配置
CTC 设备树节点:
captouch: captouch@42010000 {
compatible = "realtek,ameba-captouch";
reg = <0x42010000 0x500>
<0x420082F8 0x4>;//Control digital path input for ADC and CTC pad
interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc RTK_CKE_CTC>, <&rcc RTK_CKE_ADC>;
clock-names = "rtk_ctc_clk", "rtk_adc_clk";
rtk,ctc-diffthr = <800>, <800>, <800>, <800>, <1000>, <1000>, <1000>, <1000>, <1000>;
rtk,ctc-mbias = <0x18>, <0x17>, <16>, <0x1B>, <0x00>, <0x00>, <0x00>, <0x00>, <0x00>;
rtk,ctc-nnoise = <400>, <400>, <400>, <400>, <1000>, <1000>, <1000>, <1000>, <1000>;
rtk,ctc-pnoise = <400>, <400>, <400>, <400>, <1000>, <1000>, <1000>, <1000>, <1000>;
rtk,ctc-ch-status = <1>, <1>, <1>, <1>, <1>, <1>,<1>, <1>, <1>;
rtk,ctc-keycodes = <KEY_1>, <KEY_2>, <KEY_3>, <KEY_4>, <KEY_5>, <KEY_6>, <KEY_7>, <KEY_8>, <KEY_9>;
nvmem-cells = <&efuse_ctc_mbias>;
nvmem-cell-names = "ctc_mbias";
status = "disabled";
};
CTC 设备树的配置如下表所示。
属性 |
描述 |
可配置? |
---|---|---|
compatible |
CTC驱动的描述。默认值:”realtek,ameba-captouch” |
否 |
reg |
CTC设备的硬件地址和大小。默认值:<0x42010000 0x500> |
否 |
interrupts |
CTC设备的GIC编号。默认值:<GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH> |
否 |
clocks |
CTC设备的时钟。默认值:<&rcc RTK_CKE_CTC>, <&rcc RTK_CKE_ADC> |
否 |
rtk,ctc-diffthr |
9个通道的电容触摸差异阈值。(参见下面的注意事项) |
0~4095 |
rtk,ctc-mbias |
9个通道的电容触摸偏置电流。 (参见下面的注意事项) |
0~63 |
rtk,ctc-nnoise |
9个通道的电容触摸负噪声阈值。 (参见下面的注意事项) |
0~4095 |
rtk,ctc-pnoise |
9个通道的电容触摸正噪声阈值。 (参见下面的注意事项) |
0~4095 |
rtk,ctc-ch-status |
用于9个通道的电容式触摸通道使能控制。
|
0/1 |
rtk,ctc-keycodes |
对应9个通道的电容触摸按键代码 |
否 |
nvmem-cells |
CTC的nvmem存储单元 |
是 |
nvmem-cell-names |
CTC的nvmem存储单元的名称 |
是 |
status |
是否启用该设备。
|
是 |
备注
每个参数的 9 个值依次对应 touch0 到 touch8。
由于通道之间以及不同的电路板存在差异,建议对电容触控进行校准。
对于上表中的参数:ctc-diffthr 、 ctc-mbias 、 ctc-nnoise 、 ctc-pnoise ,厂家应对每个通道进行校准,并将其写入 EFUSE。如果 EFUSE 中的值为空,则会使用设备树文件中的值。
引脚
电容触控的引脚分配列在下表中。
端口名 |
引脚名 |
pinctrl 描述 |
---|---|---|
PA0 |
TOUCH0 |
<&captouch_pins > |
PA1 |
TOUCH1 |
<&captouch_pins > |
PA2 |
TOUCH2 |
<&captouch_pins > |
PA3 |
TOUCH3 |
<&captouch_pins > |
PA4 |
TOUCH4 |
<&captouch_pins > |
PA5 |
TOUCH5 |
<&captouch_pins > |
PA6 |
TOUCH6 |
<&captouch_pins > |
PA7 |
TOUCH7 |
<&captouch_pins > |
PA8 |
TOUCH8 |
<&captouch_pins > |
参考 pinctrl 的文档获取更多细节。
编译配置
按顺序选择
:
API
用户空间 API
sysfs 接口用于与用户空间进行交互,设备节点位于 /dev/input/eventX
。用户空间可以使用 open() 和 read() 来获取 CTC 事件。
项 |
描述 |
---|---|
evdev_open |
打开输入设备。 |
evdev_read |
从输入设备获取数据。 |
用户空间的 CTC 示例位于: <test>/captouch
。
内核空间 API
项 |
描述 |
---|---|
devm_input_allocate_device |
分配托管的输入设备。 |
input_allocate_device |
为新输入设备分配内存。 |
input_free_device |
释放被 input_dev 结构占用的内存。 |
input_register_device |
向输入核心注册设备。 |
input_unregister_device |
注销先前注册的设备。 |
input_event |
报告新的输入事件。 |
参考 Input Subsystem kernel API v5.4 或 Input Subsystem kernel API v6.6 获得更多细节。