首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
  • M4-R1

    • 一、简介

      • M4-R1简介
    • 二、快速上手

      • 01 OpenHarmony概述
      • 02 镜像烧录
      • 03 应用开发快速上手
      • 04 设备开发快速上手
    • 三、应用开发

      • 01 ArkUI

        • 1 ArkTS语言简介
        • 2 UI 组件-Row 容器介绍
        • 3 UI 组件-Column 容器介绍
        • 4 UI 组件-Text 组件
        • 5 UI 组件-Toggle 组件
        • 6 UI 组件-Slider 组件
        • 7 UI 组件-Animation 组件&Transition 组件
      • 02 资料获取

        • 1 OpenHarmony 官方资料
      • 03 开发须知

        • 1 Full-SDK替换教程
        • 2 引入和使用三方库
        • 3 HDC调试
        • 4 命令行恢复出厂模式
        • 5 升级App为system权限
      • 04 构建第一个应用

        • 1 构建第一个ArkTs应用-HelloWorld
      • 05 案例

        • 01 串口调试助手应用案例
        • 02 手写板应用案例
        • 03 数字时钟应用案例
        • 04 WIFI 信息获取应用案例
    • 四、设备开发

      • 1 Ubuntu环境开发

        • 01 环境搭建
        • 02 下载源码
        • 03 编译源码
      • 2 使用DevEco Device Tool 工具

        • 01 工具简介
        • 02 开发环境的搭建
        • 03 导入SDK
        • 04 HUAWEI DevEco Tool 功能介绍
    • 五、内核外设与接口

      • 01 指南
      • 02 设备树介绍
      • 03 GPIO介绍
      • 04 I2C通讯
      • 05 SPI通信
      • 06 PWM 控制
      • 07 串口通讯
      • 08 TF卡
      • 09 屏幕
      • 10 触摸
      • 11 Ethernet(以太网)
      • 12 M.2 硬盘
      • 13 音频
      • 13 WIFI & BT
      • 14 摄像头
    • 六、资料下载

      • 资料下载
  • M5-R1

    • 一、简介

      • M5-R1简介
    • 二、快速上手

      • 镜像烧录
      • 环境搭建
      • 下载源码
    • 三、外设与接口

      • 树莓派接口
      • GPIO 接口
      • I2C 接口
      • SPI通信
      • PWM控制
      • 串口通讯
      • TF Card
      • 屏幕
      • 触摸
      • 音频
      • RTC
      • Ethernet
      • M.2
      • MINI-PCIE
      • Camera
      • WIFI&BT
    • 四、资料下载

      • 资料下载

10 触摸

1 触摸介绍

1.1 触摸屏介绍

触摸屏很早就有了,一开始是电阻触摸屏,电阻触摸屏只能单点触摸,在以前的学习机、功能机时代被广泛使用。2007年1月9日苹果发布了划时代的第一代iPhone,也就是iPhone 2G,iPhone 2G上使用了多点电容触摸屏,而当时的手机基本都是使用的电阻触摸屏。电容触摸屏优秀的触摸品质和手感瞬间征服了消费者,带来了手机触摸屏的大变革,后面新出的手机也都采用了多点电容触摸屏。

电容触摸屏与电阻触摸屏的对比:

  • 多点触摸支持:电容触摸屏最大的优点是支持多点触摸(后面的电阻屏也支持多点触摸,但是为时已晚)
  • 触摸灵敏度:电容屏只需要手指轻触即可,而电阻屏是需要手指给予一定的压力才有反应
  • 校准需求:电容屏不需要校准,使用更便捷

如今多点电容触摸屏已经得到了广泛的应用,手机、平板、电脑、广告机等等,如果要做人机交互设备的开发,多点电容触摸屏基本是不可能绕过去的。所以本章我们就来学习一下如何使用多点触摸屏,如何获取到多点触摸值。关于电容屏的物理原理我们就不去研究了,毕竟我们不是开发电容屏的,而是电容屏的使用者,我们只需要关注如何使用电容屏,如何得到其多点触摸坐标值即可。

触摸屏的组成结构:

屏幕其实是由显示面板+触摸屏组合起来的。底下是显示面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的屏幕。电容触摸屏也是需要一个驱动IC的,驱动IC一般会提供一个I2C接口给主控制器,主控制器可以通过I2C接口来读取驱动IC里面的触摸坐标数据。

注意: M4-R1开发板搭载了一组I2C触摸接口,目前适配的驱动为gt911、FT5X06、FT5406等。与前文中来自Linux内核的驱动程序不同,该驱动为HDF框架下的驱动,用户可以在 /drivers/hdf_core/framework/model/input/driver/touchscreen/ 路径下看到支持的触摸IC。

1.2 Linux下的input子系统介绍

input就是输入的意思,因此input子系统就是管理输入的子系统,是Linux内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同。

input子系统架构:

  • input驱动层:负责具体硬件设备的驱动实现
  • input核心层:提供统一的接口和管理机制
  • input事件处理层:处理和分发输入事件

最终给用户空间提供可访问的设备节点,input子系统框架如下图所示:

input子系统框架图

对于应用开发来说,我们只需要关心内核空间发送给用户空间的数据即可。

2 I2C触摸板卡接口

I2C触摸板卡接口

3 触摸屏使用---命令行方式

3.1 设备树解析

提示

下文的文件路径:out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/ 需要先编译码源。

下面简单的解析一下挂载在I2C1总线上的触摸屏控制器节点的描述。

注意

有两个触摸屏控制器都挂载在 SoC 的 I2C1 总线上,下文以测试屏幕搭载的汇顶科技的GT911触摸IC节点为例进行介绍.

首先是基础定义层( rk3568.dtsi ):

i2c1: i2c@fe5a0000 {
    compatible = "rockchip,rk3399-i2c";
    reg = <0x0 0xfe5a0000 0x0 0x1000>;
    clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
    clock-names = "i2c", "pclk";
    interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
    pinctrl-names = "default";
    pinctrl-0 = <&i2c1_xfer>;
    #address-cells = <1>;
    #size-cells = <0>;
    status = "disabled";
};

rk提供的基础定义设备树源文件中,并不提供直接的I2C触摸控制器节点描述,而是提供了I2C总线上的通用I2C控制器节点描述,原因也很简单:为了防止设备树又臭又长,这也正是我们使用设备树的初衷,下面对i2c1节点进行简单的分析。

  • compatible : 指定兼容性,支持RK3399 I2C控制器
  • reg : 寄存器地址范围(0xfe5a0000-0xfe5a0fff)
  • interrupts : 中断号47,高电平触发
  • clocks : I2C功能时钟(CLK_I2C1)和APB时钟(PCLK_I2C1)
  • pinctrl-0 : 默认使用i2c1_xfer引脚组
  • status : 默认禁用状态

下面是引脚配置层( rk3568-pinctrl.dtsi )

i2c1_xfer: i2c1-xfer {
    rockchip,pins =
        /* i2c1_scl */
        <0 RK_PB3 1 &pcfg_pull_none_smt>,
        /* i2c1_sda */
        <0 RK_PB4 1 &pcfg_pull_none_smt>;
};
..............

touch_gpio: touch-gpio {
    rockchip,pins =
        /* 中断引脚 */
        <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>,
        /* 复位引脚 */
        <0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;
};

以上两个节点分别是I2C1总线和触摸芯片的引脚配置节点,分别对应了I2C1的SCL和SDA引脚,以及触摸芯片的中断引脚和复位引脚。

  • i2c1_xfer : I2C1总线引脚,使用GPIO0_B3作为SCL,GPIO0_B4作为SDA
  • touch_gpio : 触摸芯片控制引脚,GPIO0_B5作为中断引脚(上拉),GPIO0_B6作为复位引脚

最后再看板级配置层( rk3568-toybrick.dtsi ):

&i2c1 {
    status = "okay";

    gt9xx: gt9xx@5d {
        compatible = "goodix,gt9xx";
        status = "okay";
        reg = <0x5d>;
        reset-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
        touch-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW>;
        max-x = <7200>;
        max-y = <1280>;
        tp-size = <911>;
        pinctrl-names = "default";
        pinctrl-0 = <&touch_gpio>;
        power-supply = <&vcc3v3_lcd0_n>;
    };
};

该节点用于设置触摸屏的相关参数,如最大坐标、触摸点数量等,具体内容如下:

  • &i2c1 : 引用基础定义中的i2c1节点
  • status = "okay" : 使能I2C1控制器和gt9xx触摸芯片
  • reg = <0x5d> : gt911芯片的I2C从设备地址为0x5d
  • reset-gpio : 复位引脚使用GPIO0_B6,高电平有效
  • touch-gpio : 中断引脚使用GPIO0_B5,低电平触发
  • max-x/max-y : 触摸屏分辨率7200x1280
  • tp-size = <911> : 指定触摸芯片型号为gt911
  • power-supply : 电源供应来自vcc3v3_lcd0_n

3.2 应用层对触摸相关设备的测试方法

触摸屏属于input输入子系统设备,input子系统是Linux对输入设备提供的统一驱动框架。如按键、键盘、触摸屏和鼠标等输入设备的驱动方式是类似的,使用input子系统驱动的输入设备可以通过统一的数据结构提交给内核,该数据结构包括输入的时间、类型、代号以及具体的键值或坐标,内核通过 /dev/input 目录下的文件接口传递给用户空间。

getevent调试工具:

input输入子设备系统可以通过 getevent 命令来获取设备上报给系统的事件:

  • getevent 是一个Android/Linux系统下的调试工具
  • 用于监听并显示内核输入子系统产生的原始输入事件
  • 可以看到最底层的、未经任何处理的硬件输入信号

板卡中内置了 getevent 命令,可以用该命令来调试触摸屏是否正常工作。

在 /dev/input 目录下,使用指令:

getevent

可以获取到所有input子设备,并监听所有设备上报事件。 事件格式解析:

返回的事件格式:设备: 类型 代码 值

事件类型表:

类型代码事件类型说明
0000EV_SYN同步事件
0001EV_KEY按键事件
0003EV_ABS绝对坐标事件(触摸屏)

事件代码表:

代码名称说明
0035ABS_MT_POSITION_XX坐标
0036ABS_MT_POSITION_YY坐标
0039ABS_MT_TRACKING_ID触摸点ID
0000SYN_REPORT报告同步
0002SYN_MT_REPORT多点触控报告

事件值说明:

值类型含义
坐标值十六进制坐标
00000000新触摸点开始
ffffffff触摸点结束
00000001按键按下
00000000按键释放

监听特定设备:

如果想要监听具体的子设备及其上报的事件类型,可以使用指令:

getevent -l /dev/input/event*

它会实时反馈十六进制坐标信息(x,y)和触摸点ID和同步事件,下面对事件类型和事件代码进行解释。

Linux输入事件类型:

事件类型功能典型应用
EV_KEY按键事件电源键、音量键
EV_ABS绝对坐标事件触摸屏、游戏摇杆
EV_REL相对坐标事件鼠标移动、滚轮
EV_SYN同步事件数据帧结束标志
EV_MSC杂项事件其他类型事件
EV_SW开关事件盖子开合、耳机插拔

触摸屏常用事件代码:

代码名称功能说明
ABS_MT_TRACKING_ID触摸点ID正数=新触摸,ffffffff=触摸结束
ABS_MT_POSITION_XX坐标触摸点横坐标
ABS_MT_POSITION_YY坐标触摸点纵坐标
ABS_MT_PRESSURE压力值触摸压力大小
ABS_MT_TOUCH_MAJOR触摸面积接触面积大小

3.3 具体功能演示

3.3.1 查看输入设备

首先进入目录 /dev/input/,可以查看到几个输入事件:

输入设备列表

3.3.2 识别触摸屏设备

使用指令 getevent 查看输入事件对应的输入设备:

getevent设备识别

显然,设备名为"touchscreen"的设备就是我们的触摸屏。

3.3.3 监听触摸事件

在亮屏状态下,点击屏幕,即可在终端查看到对应的触摸事件:

原始触摸事件

3.3.4 可读性更高的事件显示

我们使用可读性更高的指令 getevent -l /dev/input/event* 再次进行测试,点击屏幕后看到屏幕返回信息如下:

可读触摸事件
在 GitHub 上编辑此页
上次更新:
贡献者: fxx, hjf
Prev
09 屏幕
Next
11 Ethernet(以太网)