20250731在荣品的PRO-RK3566开发板的Android13下解决敦泰的FT8206触控芯片的只有4点触控功能
20250731在荣品的PRO-RK3566开发板的Android13下调通敦泰的FT8206触控芯片的10点触控功能
20250731在荣品的PRO-RK3566开发板的Android13下解决敦泰的FT8206触控芯片的只有4点触控功能
2025/7/31 15:25
缘起:敦泰的FT8206触控芯片最大只支持4点触控,再加一根手指到5点就会出现Android13没有响应的情况!
看一下驱动中有没有限制点数
正常是10点的
我也看见了。FT8206支持10点 144HZ。但是 所使用 TP最高支持多少呢?
最大是可以支持10点的
这个有DTS设置吗?
或者你直接读02寄存器,读一下多指触摸时的点数
你这个好像是没有点数设置的
参考的代码是有点数设置
10指,X,Y坐标沿着对角线调换过来了
缘起:本文只分析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坏了?
Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c
中断处理函数:
static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
{
struct edt_ft5x06_ts_data *tsdata = dev_id;
struct device *dev = &tsdata->client->dev;
u8 cmd;
u8 rdbuf[63];
int i, type, x, y, id;
int offset, tplen, datalen, crclen;
int error;
printk("**** wyb 2024/4/3 19:57 %s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
switch (tsdata->version) {
case EDT_M06:
cmd = 0xf9; /* tell the controller to send touch data */
offset = 5; /* where the actual touch data starts */
tplen = 4; /* data comes in so called frames */
crclen = 1; /* length of the crc data */
break;
case EDT_M09:
case EDT_M12:
case EV_FT:
case GENERIC_FT:
cmd = 0x0;
offset = 3;
tplen = 6;
crclen = 0;
break;
default:
goto out;
}
memset(rdbuf, 0, sizeof(rdbuf));
datalen = tplen * tsdata->max_support_points + offset + crclen;
error = edt_ft5x06_ts_readwrite(tsdata->client,
sizeof(cmd), &cmd,
datalen, rdbuf);
if (error) {
dev_err_ratelimited(dev, "Unable to fetch data, error: %d\n",
error);
goto out;
}
/* M09/M12 does not send header or CRC */
if (tsdata->version == EDT_M06) {
if (rdbuf[0] != 0xaa || rdbuf[1] != 0xaa ||
rdbuf[2] != datalen) {
dev_err_ratelimited(dev,
"Unexpected header: %02x%02x%02x!\n",
rdbuf[0], rdbuf[1], rdbuf[2]);
goto out;
}
if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen))
goto out;
}
for (i = 0; i < tsdata->max_support_points; i++) {
u8 *buf = &rdbuf[i * tplen + offset];
type = buf[0] >> 6;
/* ignore Reserved events */
if (type == TOUCH_EVENT_RESERVED)
continue;
/* M06 sometimes sends bogus coordinates in TOUCH_DOWN */
if (tsdata->version == EDT_M06 && type == TOUCH_EVENT_DOWN)
continue;
x = get_unaligned_be16(buf) & 0x0fff;
y = get_unaligned_be16(buf + 2) & 0x0fff;
/* The FT5x26 send the y coordinate first */
if (tsdata->version == EV_FT)
swap(x, y);
id = (buf[2] >> 4) & 0x0f;
input_mt_slot(tsdata->input, id);
if (input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER,
type != TOUCH_EVENT_UP))
{
//touchscreen_report_pos(tsdata->input, &tsdata->prop, x, y, true);
//printk("**** wyb 2024/4/3 19:57 %s %s %d x=%d, y=%d, x2=%d, y2=%d\n", __FILE__, __FUNCTION__, __LINE__, x, y, y, 1200-x);
// system rotation : Counterclockwise rotation 90
touchscreen_report_pos(tsdata->input, &tsdata->prop, 1200-x, 1920-y, true);
//printk("**** wyb 2024/4/3 19:57 %s %s %d x=%d, y=%d, x2=%d, y2=%d\n", __FILE__, __FUNCTION__, __LINE__, x, y, 1200-x, 1920-y);
printk("**** wyb 2025/7/31 10:29 %s %s %d x=%d, y=%d, x2=%d, y2=%d i=%d, tsdata->max_support_points=%d\n", __FILE__, __FUNCTION__, __LINE__, x, y, 1200-x, 1920-y, i, tsdata->max_support_points);
//touchscreen_report_pos(tsdata->input, &tsdata->prop, 1920-y, 1200-x, true);
//printk("**** wyb 2024/4/3 19:57 %s %s %d x=%d, y=%d, x2=%d, y2=%d\n", __FILE__, __FUNCTION__, __LINE__, x, y, 1920-y, 1200-x);
//touchscreen_report_pos(tsdata->input, &tsdata->prop, 1200-x, 1920-y, true);
//printk("**** wyb 2024/4/3 19:57 %s %s %d x=%d, y=%d, x2=%d, y2=%d\n", __FILE__, __FUNCTION__, __LINE__, x, y, 1200-x, 1920-y);
//touchscreen_report_pos(tsdata->input, &tsdata->prop, 1920-x, 1200-y, true);
//touchscreen_report_pos(tsdata->input, &tsdata->prop, 1920-y, 1200-x, true);
//touchscreen_report_pos(tsdata->input, &tsdata->prop, y, 1200-x, true);
//printk("**** wyb 2024/4/3 19:57 %s %s %d x=%d, y=%d, x2=%d, y2=%d\n", __FILE__, __FUNCTION__, __LINE__, x, y, y, 1200-x);
}
}
input_mt_report_pointer_emulation(tsdata->input, true);
input_sync(tsdata->input);
out:
return IRQ_HANDLED;
}
static SIMPLE_DEV_PM_OPS(edt_ft5x06_ts_pm_ops,
edt_ft5x06_ts_suspend, edt_ft5x06_ts_resume);
static const struct edt_i2c_chip_data edt_ft5x06_data = {
.max_support_points = 5,
};
static const struct edt_i2c_chip_data edt_ft5506_data = {
.max_support_points = 10,
};
static const struct edt_i2c_chip_data edt_ft6236_data = {
.max_support_points = 2,
};
static const struct i2c_device_id edt_ft5x06_ts_id[] = {
{ .name = "edt-ft5x06", .driver_data = (long)&edt_ft5x06_data },
{ .name = "edt-ft5506", .driver_data = (long)&edt_ft5506_data },
{ .name = "ev-ft5726", .driver_data = (long)&edt_ft5506_data },
/* Note no edt- prefix for compatibility with the ft6236.c driver */
{ .name = "ft6236", .driver_data = (long)&edt_ft6236_data },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(i2c, edt_ft5x06_ts_id);
修改为:
static SIMPLE_DEV_PM_OPS(edt_ft5x06_ts_pm_ops,
edt_ft5x06_ts_suspend, edt_ft5x06_ts_resume);
static const struct edt_i2c_chip_data edt_ft5x06_data = {
//.max_support_points = 5,
.max_support_points = 10,
};
static const struct edt_i2c_chip_data edt_ft5506_data = {
.max_support_points = 10,
};
static const struct edt_i2c_chip_data edt_ft6236_data = {
//.max_support_points = 2,
.max_support_points = 10,
};
static const struct i2c_device_id edt_ft5x06_ts_id[] = {
{ .name = "edt-ft5x06", .driver_data = (long)&edt_ft5x06_data },
{ .name = "edt-ft5506", .driver_data = (long)&edt_ft5506_data },
{ .name = "ev-ft5726", .driver_data = (long)&edt_ft5506_data },
/* Note no edt- prefix for compatibility with the ft6236.c driver */
{ .name = "ft6236", .driver_data = (long)&edt_ft6236_data },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(i2c, edt_ft5x06_ts_id);
Android13的开发者选项:默认自带的触摸屏测点工具:
APK测试触摸屏报点: