概述

架构

CTC 驱动程序遵循 Linux 的输入子系统。输入子系统为用户空间提供 CTC 接口。CTC 软件架构在下图中进行了说明。

../../rst_linux/8_cap_touch/figures/ctc_software_architecture.svg

CTC 软件架构包含以下部分:

  • 输入驱动: CTC 驱动。

  • 输入核心: 输入子系统核心驱动。它是输入驱动层和事件处理层之间的链接和桥梁,向下为硬件输入驱动层提供接口,向上为事件处理层提供接口。

  • 事件处理器:与用户空间交互,用于将来自硬件驱动层的事件报告给用户程序。

  • 应用:用户空间使用。一个展示如何使用 CTC 的简单示例。

更多细节请参考 Input Device Driver v5.4Input 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个通道的电容式触摸通道使能控制。

  • 1: 开启

  • 0: 关闭

0/1

rtk,ctc-keycodes

对应9个通道的电容触摸按键代码

nvmem-cells

CTC的nvmem存储单元

nvmem-cell-names

CTC的nvmem存储单元的名称

status

是否启用该设备。

  • disabled

  • okay

备注

  • 每个参数的 9 个值依次对应 touch0 到 touch8。

  • 由于通道之间以及不同的电路板存在差异,建议对电容触控进行校准。

  • 对于上表中的参数:ctc-diffthrctc-mbiasctc-nnoisectc-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 的文档获取更多细节。

编译配置

按顺序选择 Device Drivers > Drivers for Realtek > Captouch driver

../../rst_linux/8_cap_touch/figures/cap_touch_build_configuration.png

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.4Input Subsystem kernel API v6.6 获得更多细节。