20250731在荣品的PRO-RK3566开发板的Android13下跑通敦泰的FT8206触控芯片

发布于:2025-08-01 ⋅ 阅读:(24) ⋅ 点赞:(0)

20250731在荣品的PRO-RK3566开发板的Android13下跑通敦泰的FT8206触控芯片
2025/7/31 17:48


缘起:本文前置条件:已经解决FT8206和PRO-RK3566的硬件连接。
通过i2cdect可以扫描到i2c从机地址:0x38。【8位地址为0x70】


缘起:本文只分析I2C的挂载问题。

1、敦泰FT的代理商说所有的FT的驱动程序都是兼容的,不同的就是不是对应的驱动就不能升级upgrade了。
反正我也不需要升级。直接使用以前调通的FT5X06的驱动程序了。
Y:\Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c
原厂的edt-ft5x06.c不能用的。我用的是 飞凌魔改过的版本。
DTS也直接拷贝的飞凌的。

2、荣品的PRO-RK3566开发板的Android13的坐标原点在左上角。
但是TP得坐标原点是根据固件不同而异。
你需要在报点的地方进行处理,或者要求供应商/屏厂修改适合你的项目的固件并预烧录进去了。


如果你的TP/LCD屏的硬件接线正确,在Android13下使用i2cdetect扫描I2C1。
很容易得到0x38有设备,但是没有挂载驱动程序。

1、FT8206。使用 FT5X06的驱动程序。
2、I2C可以读了。请问 这些寄存器的值对不?
3、现在是 TP触摸没有反应?用示波器 点IRQ中断引脚吗?TP坏了?


我想在 开关 RK3566/RK3588+Android13下的内核。

rootroot@rootroot-X99-Turbo:~/Android13.0/kernel-5.10$ make ARCH=arm64 menuconfig
请问是这样操作吗?有点不对劲


没有问题,具体内核配置文件对应的是这个


https://doc.rpdzkj.cn/#/zh_cn/%E7%91%9E%E8%8A%AF%E5%BE%AE%E7%B3%BB%E5%88%97/rk3566-rk3568/6.Android13%E5%BC%80%E5%8F%91?id=%e5%b8%b8%e7%94%a8%e6%ba%90%e7%a0%81%e8%b7%af%e5%be%84
Android开发

常用源码路径
常用配置项    源码路径
RD-RK3588 设备树    kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts
UBOOT默认配置文件    u-boot/arch/arm/dts/rk3588-u-boot.dtsi
内核默认配置文件    kernel-5.10/arch/arm64/configs/rockchip_defconfig
Uboot Logo图片    kernel-5.10/logo.bmp
Kernel Logo图片    kernel-5.10/logo_kernel.bmp
parameter分区表    device/rockchip/rk3588/parameter.txt
device板级配置文件    device/rockchip/rk3588/rp_boards/


1、在内核中打开FT5X06的驱动程序。
Z:\Android13.0\kernel-5.10\arch\arm64\configs\rockchip_defconfig

CONFIG_TABLET_USB_KBTAB=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_EDT_FT5X06=y
CONFIG_TOUCHSCREEN_GSL3673=y
CONFIG_TOUCHSCREEN_GSL3673_800X1280=y
CONFIG_TOUCHSCREEN_GSLX680_PAD=y
CONFIG_TOUCHSCREEN_GT1X=y
CONFIG_TOUCHSCREEN_ILI210X=y
CONFIG_TOUCHSCREEN_ELAN5515=y
CONFIG_ROCKCHIP_REMOTECTL=y


如果不知道格式如何写,去.config里面找!
Z:\14TB\versions\pro3566_Android13.0\kernel-5.10\.config
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set

CONFIG_TOUCHSCREEN_EDT_FT5X06=y


# CONFIG_TABLET_USB_PEGASUS is not set
# CONFIG_TABLET_SERIAL_WACOM4 is not set
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_PROPERTIES=y
# CONFIG_TOUCHSCREEN_ADS7846 is not set
# CONFIG_TOUCHSCREEN_AD7877 is not set
# CONFIG_TOUCHSCREEN_AD7879 is not set
# CONFIG_TOUCHSCREEN_ADC is not set
# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_BU21029 is not set
# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
# CONFIG_TOUCHSCREEN_DYNAPRO is not set
# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
# CONFIG_TOUCHSCREEN_EETI is not set
# CONFIG_TOUCHSCREEN_EGALAX is not set
# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
# CONFIG_TOUCHSCREEN_EXC3000 is not set
# CONFIG_TOUCHSCREEN_FT5436 is not set
CONFIG_TOUCHSCREEN_FT5726=y
# CONFIG_TOUCHSCREEN_FT8206 is not set
# CONFIG_TOUCHSCREEN_FTS is not set

# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
CONFIG_TOUCHSCREEN_GSL3673=y
CONFIG_TOUCHSCREEN_GSL3673_800X1280=y
CONFIG_TOUCHSCREEN_GSLX680_PAD=y
CONFIG_TOUCHSCREEN_GT1X=y
# CONFIG_TOUCHSCREEN_HIDEEP is not set
CONFIG_TOUCHSCREEN_ILI210X=y
# CONFIG_TOUCHSCREEN_S6SY761 is not set
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_EKTF2127 is not set
# CONFIG_TOUCHSCREEN_ELAN is not set
CONFIG_TOUCHSCREEN_ELAN5515=y
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MCS5000 is not set
# CONFIG_TOUCHSCREEN_MMS114 is not set
# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_MK712 is not set
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
CONFIG_TOUCHSCREEN_EDT_FT5X06=y
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_PIXCIR is not set
# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
# CONFIG_TOUCHSCREEN_TSC2004 is not set
# CONFIG_TOUCHSCREEN_TSC2005 is not set
# CONFIG_TOUCHSCREEN_TSC2007 is not set
# CONFIG_TOUCHSCREEN_RM_TS is not set
# CONFIG_TOUCHSCREEN_SILEAD is not set
# CONFIG_TOUCHSCREEN_SIS_I2C is not set
# CONFIG_TOUCHSCREEN_ST1232 is not set
# CONFIG_TOUCHSCREEN_STMFTS is not set
# CONFIG_TOUCHSCREEN_SUR40 is not set
# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
# CONFIG_TOUCHSCREEN_SX8654 is not set
# CONFIG_TOUCHSCREEN_TPS6507X is not set
# CONFIG_TOUCHSCREEN_ZET6223 is not set
# CONFIG_TOUCHSCREEN_ZFORCE is not set
# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
# CONFIG_TOUCHSCREEN_IQS5XX is not set
# CONFIG_TOUCHSCREEN_ZINITIX is not set
CONFIG_TOUCHSCREEN_GT9XX=y
CONFIG_ROCKCHIP_REMOTECTL=y
CONFIG_ROCKCHIP_REMOTECTL_PWM=y


2、驱动修改部分【直接使用飞凌魔改版本!^_】
Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\Kconfig
config TOUCHSCREEN_EDT_FT5X06
    tristate "EDT FocalTech FT5x06 I2C Touchscreen support"
    depends on I2C
    help
      Say Y here if you have an EDT "Polytouch" touchscreen based
      on the FocalTech FT5x06 family of controllers connected to
      your system.

      If unsure, say N.

      To compile this driver as a module, choose M here: the
      module will be called edt-ft5x06.


Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\Makefile
obj-$(CONFIG_TOUCHSCREEN_EDT_FT5X06)    += edt-ft5x06.o


Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c


我看你们的 FT5X06的驱动程序 是修过的!
?要 这样改?
这样改 可以实现什么功能?


看上去好像是原厂的没有申请gpio中断号,所以我们添上去的gpio中断注册


Z:\14TB\versions\OK3588-android12-R5source\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c
Z:\14TB\versions\pro3566_Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c

#include <asm/unaligned.h>
#include <linux/pinctrl/consumer.h>


struct edt_ft5x06_ts_data {
    struct i2c_client *client;
    struct input_dev *input;
    struct touchscreen_properties prop;
    u16 num_x;
    u16 num_y;
    struct regulator *vcc;

    struct gpio_desc *reset_gpio;
    struct gpio_desc *wake_gpio;
    struct gpio_desc *int_gpio;

#if defined(CONFIG_DEBUG_FS)
    struct dentry *debug_dir;
    u8 *raw_buffer;
    size_t raw_bufsize;
#endif

    struct mutex mutex;
    bool factory_mode;
    enum edt_pmode suspend_mode;
    int threshold;
    int gain;
    int offset;
    int offset_x;
    int offset_y;
    int report_rate;
    int max_support_points;

    char name[EDT_NAME_LEN];

    struct edt_reg_addr reg_addr;
    enum edt_ver version;

    struct pinctrl            *pinctrl;
    struct pinctrl_state    *pins_default;

};


static int edt_ft5x06_ts_probe(struct i2c_client *client,
                     const struct i2c_device_id *id)
{
    const struct edt_i2c_chip_data *chip_data;
    struct edt_ft5x06_ts_data *tsdata;
    u8 buf[2] = { 0xfc, 0x00 };
    struct input_dev *input;
    unsigned long irq_flags;
    int error;
    char fw_version[EDT_NAME_LEN];

    dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n");

    u8 rdbuf[EDT_NAME_LEN];
    memset(rdbuf, 0, sizeof(rdbuf));

    tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL);
    if (!tsdata) {
        dev_err(&client->dev, "failed to allocate driver data.\n");
        return -ENOMEM;
    }
    
    error = edt_ft5x06_ts_readwrite(client, 1, "\xBB",
                    EDT_NAME_LEN - 1, rdbuf);
    if (error)
        return error;

    tsdata->pinctrl = devm_pinctrl_get(&client->dev);
    if (!IS_ERR(tsdata->pinctrl)) {
        tsdata->pins_default = pinctrl_lookup_state(tsdata->pinctrl, "ft5x06_defaults");
        if (IS_ERR(tsdata->pins_default))
            dev_err(&client->dev, "could not get default pinstate\n");

        if (!IS_ERR_OR_NULL(tsdata->pins_default)) {
            error = pinctrl_select_state(tsdata->pinctrl,
                    tsdata->pins_default);
            if (error < 0)
                dev_err(&client->dev, "could not set pins\n");
        }
    }

    chip_data = device_get_match_data(&client->dev);
    if (!chip_data)
        chip_data = (const struct edt_i2c_chip_data *)id->driver_data;
    if (!chip_data || !chip_data->max_support_points) {
        dev_err(&client->dev, "invalid or missing chip data\n");
        return -EINVAL;
    }


    touchscreen_parse_properties(input, true, &tsdata->prop);

    error = input_mt_init_slots(input, tsdata->max_support_points,
                INPUT_MT_DIRECT);
    if (error) {
        dev_err(&client->dev, "Unable to init MT slots.\n");
        return error;
    }

    i2c_set_clientdata(client, tsdata);

    irq_flags = irq_get_trigger_type(client->irq);
    if (irq_flags == IRQF_TRIGGER_NONE)
        irq_flags = IRQF_TRIGGER_FALLING;
    irq_flags |= IRQF_ONESHOT;
    
    tsdata->int_gpio = devm_gpiod_get_optional(&client->dev, 
            "irq", GPIOD_OUT_HIGH);
    if(IS_ERR(tsdata->int_gpio)){
        error = PTR_ERR(tsdata->int_gpio);
        dev_err(&client->dev, "Failed to request int gpio %d\n", error);
    } else {
        client->irq = gpiod_to_irq(tsdata->int_gpio);
        irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
    }


    error = devm_request_threaded_irq(&client->dev, client->irq,
                    NULL, edt_ft5x06_ts_isr, irq_flags,
                    client->name, tsdata);
    if (error) {
        dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
        return error;
    }

    error = devm_device_add_group(&client->dev, &edt_ft5x06_attr_group);
    if (error)
        return error;

    error = input_register_device(input);
    if (error)
        return error;

    edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev));

    dev_dbg(&client->dev,
        "EDT FT5x06 initialized: IRQ %d, WAKE pin %d, Reset pin %d.\n",
        client->irq,
        tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1,
        tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1);

    return 0;
}

static int edt_ft5x06_ts_remove(struct i2c_client *client)


3、DTS部分:【直接使用飞凌版本^_】
Z:\14TB\versions\OK3588-android12-R5source\kernel-5.10\arch\arm64\boot\dts\rockchip\OK3588-C-common.dtsi


&i2c2 {
    status = "okay";

    extio: tca6424@23 {
        compatible = "ti,tca6424";
        reg = <0x23>;
        interrupt-parent = <&gpio1>;
        interrupts = <RK_PA4 IRQ_TYPE_EDGE_FALLING>;
        gpio-controller;
        pinctrl-0 = <&extio_int_gpio>;
        pinctrl-names = "default";
        #gpio-cells = <2>;
        status = "okay";
    };

    ft5x06_dsi0: ft5x06@38 { //dsi0 tp
        compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
        reg = <0x38>;
        pinctrl-names = "ft5x06_defaults";
        pinctrl-0 = <&ft5x06_dsi1_gpio>;
//        interrupt-parent = <&gpio3>;
//        interrupts = <RK_PC0 IRQ_TYPE_EDGE_FALLING>;
        irq-gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>;
        touchscreen-size-x = <1024>;
        touchscreen-size-y = <600>;
        status = "okay";
    };

    gt9xx_dsi0: gt9xx@14 {
        compatible = "goodix,gt911";
        reg = <0x14>;
        pinctrl-names = "gt9xx_default";
        pinctrl-0 = <&gt911_dsi1_gpio>;
        //interrupt-parent = <&gpio3>;
        //interrupts = <RK_PC0 IRQ_TYPE_EDGE_FALLING>;
        irq-gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>;
        reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_HIGH>;
        touchscreen-size-x = <1024>;
        touchscreen-size-y = <600>;
        is-mutex;
        filter-reg = <0x38>;
        bus-reg = <0x02>;
        status = "okay";
    };
};


&pinctrl {


    lcd {
        mipi0_enable_gpio: mipi0-enable-gpio {
            rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
        };
        mipi1_enable_gpio: mipi1-enable-gpio {
            rockchip,pins = <3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };

    tp_int {
        ft5x06_dsi1_gpio:  ft5x06-dsi1-gpio {
            rockchip,pins = <3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
        };

        ft5x06_dsi2_gpio: ft5x06-dsi2-gpio {
            rockchip,pins = <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
        };

        
        gt911_dsi1_gpio:gt911-dsi0-gpio {
            rockchip,pins = <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>,
                            <3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
        };

        gt911_dsi2_gpio:gt911-dsi1-gpio {
            rockchip,pins = <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>,
                            <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
        };                    
    };

    hdmirxdet {
        hdmirx_det_gpio: hdmirx-det-gpio {
            rockchip,pins = <1 RK_PD5 RK_FUNC_GPIO &pcfg_pull_up>;
        };
    };


};


Z:\14TB\versions\pro3566_Android13.0\kernel-5.10\arch\arm64\boot\dts\rockchip\rk356x\pro-rk3566-single-lcd-gpio.dtsi

&i2c1 {
    gt9xx: goodix_ts@5d {
        status = "disabled";
        /***** tp pin ******/
            pinctrl-names = "default";
            pinctrl-0 = <&goodix_irq>;
        goodix_rst_gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
        goodix_irq_gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
    };
    gt1x: goodix_gt1x@5d {
        status = "disabled";
        /***** tp pin ******/
                pinctrl-names = "default";
                pinctrl-0 = <&goodix_irq>;
                goodix,rst-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
                goodix,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
    };
};

&pinctrl {
    lcd1 {
        lcd_rst_gpio: lcd1-rst-gpio {
            rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };
    goodix {
        goodix_irq: goodix-irq {
            rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>;
        };
    };

};


最终效果图:
Z:\Android13.0\kernel-5.10\arch\arm64\boot\dts\rockchip\rk356x\pro-rk3566-single-lcd-gpio.dtsi

&edp_panel {
    power-supply = <&vcc3v3_lcd0_n>;
    backlight = <&backlight4>;
};

&i2c1 {
//    gt9xx: goodix_ts@5d {
//        status = "disabled";
//        /***** tp pin ******/
//            pinctrl-names = "default";
//            pinctrl-0 = <&goodix_irq>;
//        goodix_rst_gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
//        goodix_irq_gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
//    };
//    
//    gt1x: goodix_gt1x@5d {
//        status = "disabled";
//        /***** tp pin ******/
//                pinctrl-names = "default";
//                pinctrl-0 = <&goodix_irq>;
//                goodix,rst-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
//                goodix,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
//    };

    ft5x06: ft5x06@38 { //dsi0 tp
        compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
        reg = <0x38>;
        pinctrl-names = "ft5x06_defaults";
        pinctrl-0 = <&ft5x06_dsi1_gpio>;
//        interrupt-parent = <&gpio0>;
//        interrupts = <RK_PB5 IRQ_TYPE_EDGE_FALLING>;
        //irq-gpio = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
        irq-gpio = <&gpio0 RK_PB5 GPIO_ACTIVE_LOW>;
        //reset-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
        reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
        touchscreen-size-x = <1200>;
        touchscreen-size-y = <1920>;
        //touchscreen-size-x = <1920>;
        //touchscreen-size-y = <1200>;
        status = "okay";
    };

};

&pinctrl {
    lcd1 {
        lcd_rst_gpio: lcd1-rst-gpio {
            rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };

//    goodix {
//        goodix_irq: goodix-irq {
//            rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>;
//        };
//    };

    tp_int {
        ft5x06_dsi1_gpio:  ft5x06-dsi1-gpio {
            rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
        };                    
    };

    
};
/********************************************/

测试效果:

使用 如上测试APK。
1根手指正常。
2根手指正常
3根手指也正常
4根手指还是正常。

5根手指。测试APK上 异常了。不能画了。


网站公告

今日签到

点亮在社区的每一天
去签到