当前位置: 首页 > news >正文

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测试触摸屏报点:

http://www.lryc.cn/news/606354.html

相关文章:

  • 经典算法之美:冒泡排序的优雅实现
  • 【计算机网络】IP地址、子网掩码、网关、DNS、IPV6是什么含义?计算机中如何设置子网掩码与网关?
  • 分类-鸢尾花分类
  • 基于SpringBoot和SpringAI框架实践
  • 数据转换能干什么?有哪些好用的数据转换方法?
  • 【React】diff 算法
  • 深度解析领域特定语言(DSL)第七章:语法分析器组合子 - 用乐高思维构建解析器
  • 借助于llm将pdf转化为md文本
  • 循环神经网络RNN原理精讲,详细举例!
  • 【智能体agent】入门之--2.2框架---autoGen
  • Cesium 快速入门(一)快速搭建项目
  • 【05】大恒相机SDK C#开发 —— Winform中采集图像并显示
  • 提示词增强工程(Prompt Enhancement Engineering)白皮书草稿
  • 【大模型理论篇】混合思考之自适应思维链
  • uv使用教程
  • FastMCP本地构建Server和Clinet交互
  • 用Python绘制SM2国密算法椭圆曲线:一场数学与视觉的盛宴
  • 时间戳 + 签名机制
  • 学习日志23 python
  • 因为想开发新项目了~~要给老Python项目整个虚拟环境
  • HTML基础复习:全面回顾核心概念
  • 谷歌V3插件热更新
  • 【0基础PS】Photoshop (PS) 理论知识
  • 【刷题】东方博宜oj 1412-快速幂(零基础,简单易懂)
  • Mysql-视图,函数,存储过程,触发器
  • 【Kiro Code】Chat 聊天功能
  • 某讯视频风控参数逆向分析
  • Docker部署的PostgreSQL慢查询日志配置指南
  • pytorch的自定义 CUDA 扩展怎么学习
  • pytorch程序语句固定开销分析