跳转至

单触摸屏驱动配置

本章节驱动配置过程中,以GT9XX为操作示例。

Tip

适用于瑞芯微平台的驱动配置。

驱动移植

将厂商提供的驱动移植进SDK目录,并修改添加进编译文件,驱动文件拷贝到触摸驱动的文件夹下$(SDK_DIR)\kernel-5.10\drivers\input\touchscreen

修改kconfig:

config TOUCHSCREEN_GT9XX
    tristate "GT9XX touchscreens support"

修改Makefile:

obj-$(CONFIG_TOUCHSCREEN_GT9XX)     += gt9xx/

内核配置添加CONFIG_TOUCHSCREEN_GT9XX=y,内核配置文件如arch/arm64/configs/rockchip_defconfig,不同版本的defconfig请自行在git历史记录中查找对应的版本文件。

内核设备树配置

根据主控型号,查找DTS 配置路径,i2c_gt9xx配置:

&i2c1 {
    status = "okay";
    gt9xx:gt9xx@5d {
        compatible = "goodix,gt9xx";
        status = "okay";
        reg = <0x5d>;

        gtp_resolution_x = <1024>;
        gtp_resolution_y = <600>;
        gtp_int_tarigger = <1>;
        gtp_change_x2y = <0>;
        gtp_overturn_x = <0>;
        gtp_overturn_y = <0>;
        gtp_send_cfg = <1>;
        gtp_touch_wakeup = <1>;
        goodix_rst_gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
        goodix_irq_gpio = <&gpio3 RK_PA3 IRQ_TYPE_LEVEL_LOW>;
        pinctrl-names = "default";
        pinctrl-0 = <&touch3_gpio>;

        goodix,cfg-group0 = [
            4B 00 04 58 02 01 0D 00 01 08
            28 05 50 32 03 05 00 00 00 00
            00 00 00 00 00 00 00 8B 2A 0C
            17 15 31 0D 00 00 02 BA 03 2D
            00 00 00 00 00 03 00 00 00 00
            00 0F 41 94 C5 02 07 00 00 04
            9B 11 00 77 17 00 5C 1F 00 48
            2A 00 3B 38 00 3B 00 00 00 00
            00 00 00 00 00 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00
            00 00 02 04 06 08 0A 0C 0E 10
            12 14 16 18 FF FF 00 00 00 00
            00 00 00 00 00 00 00 00 00 00
            00 00 00 02 04 06 08 0A 0C 0F
            10 12 13 16 18 1C 1D 1E 1F 20
            21 22 24 FF FF FF FF FF 00 00
            00 00 00 00 00 00 00 00 00 00
            00 00 00 00 B6 01
        ];
    };
};

旋转触摸方向

Note

5 寸显示屏不适用此方法,请阅读下文。

基于设备树调整触摸屏方向,以下方向仅适用于GT9XX驱动:

0度(默认)

gt9xx:gt9xx@5d {
    gtp_change_x2y = <0>;       
    gtp_overturn_x = <0>;
    gtp_overturn_y = <0>;
};

90度

gt9xx:gt9xx@5d {
    gtp_change_x2y = <1>;
    gtp_overturn_x = <1>;
    gtp_overturn_y = <0>;
};

180度

gt9xx:gt9xx@5d {
    gtp_change_x2y = <0>;
    gtp_overturn_x = <0>;
    gtp_overturn_y = <1>;
};

270度

gt9xx:gt9xx@5d {
    gtp_change_x2y = <0>;
    gtp_overturn_x = <1>;
    gtp_overturn_y = <0>;
};

旋转触摸方向(适用5寸)

DTS — 触控节点加属性

文件: kernel-5.10/arch/arm64/boot/dts/rockchip/ 根据实际屏幕选对应文件:

  • MIPI0 → rk3568-kickpi-lcd-mipi0-5-720-1280.dtsi
  • MIPI1 → rk3568-kickpi-lcd-mipi1-5-720-1280.dtsi

myft5x06: my-ft5x06@38 { 块里加:

focaltech,rotation = <90>;

驱动头文件 — 加字段

文件: kernel-5.10/drivers/input/touchscreen/focaltech_touch_ft8756/focaltech_core.h

max_touch_number; 之后加:

u32 rotation;

驱动源码 — 旋转逻辑

文件: kernel-5.10/drivers/input/touchscreen/focaltech_touch_ft8756/focaltech_core.c

3a. 解析属性fts_parse_dtFTS_FUNC_EXIT() 前插入:

ret = of_property_read_u32(np, "focaltech,rotation", &pdata->rotation);
if (ret) pdata->rotation = 0;
else if (pdata->rotation != 0 && pdata->rotation != 90 &&
         pdata->rotation != 180 && pdata->rotation != 270)
    pdata->rotation = 0;

3b. 交换轴范围fts_input_init 中替换原有的两行 input_set_abs_params

if (pdata->rotation == 90 || pdata->rotation == 270) {
    input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->y_min, touch_y_max, 0, 0);
    input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->x_min, touch_x_max, 0, 0);
} else {
    input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, touch_x_max, 0, 0);
    input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, touch_y_max, 0, 0);
}

3c. 坐标变换fts_input_report_binput_report_abs(ABS_MT_POSITION_X/Y...) 前插入:

{
    u32 rx = events[i].x, ry = events[i].y;
    switch (ts_data->pdata->rotation) {
    case 90:   events[i].x = ry; events[i].y = ts_data->pdata->x_max - rx; break;
    case 180:  events[i].x = ts_data->pdata->x_max - rx; events[i].y = ts_data->pdata->y_max - ry; break;
    case 270:  events[i].x = ts_data->pdata->y_max - ry; events[i].y = rx; break;
    }
}