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 = <>911_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上 異常了。不能畫了。