0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RK3588 Android驱动实战】USB TP XY轴反转?不用改TP固件!系统端改上报数据快速搞定

jf_44130326 来源:Linux1024 2026-02-06 17:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式Android开发的同学,大概率遇到过USB触控面板(TP)的适配坑——比如XY轴反转:明明点屏幕左边,系统却识别成右边;向上滑动,页面反而向下走。最近在RK3588平台调试USB TP时,就碰到了这个问题,TP供应商给的方案是改TP端固件,但需要重新烧录TP程序、协调供应商联调,操作麻烦还耗时间。

后来我们换了个思路:直接在Android系统端修改TP上报的坐标数据,不用动TP硬件/固件,半小时就搞定了。今天就把这个实战方案拆解清楚,附上核心patch解析,希望能帮到有同样需求的同学。

一、问题回顾:RK3588 USB TP反向烦恼

先明确下我们遇到的具体问题:

RK3588 Android 12/13系统上,接入某款USB TP后,触控功能正常,但坐标映射完全反了——比如TP物理坐标的X轴(横向)对应系统的Y轴(纵向),且单轴方向还存在反转(比如按TP右侧,系统识别为左侧)。

最初联系TP供应商,得到的解决方案是:

1.提供TP的固件烧录工具;

2.修改TP内部的坐标映射参数;

3.重新烧录固件到TP芯片。

但这个方案有明显痛点:

需额外安装烧录工具,部分工具还依赖Windows系统;

烧录过程有风险,操作不当可能导致TP变砖;

若后续换批次TP,可能需要重复适配,灵活性差。

既然TP是通过USB HID协议向系统上报坐标数据,那能不能在系统驱动层拦截并修改这些数据?答案是肯定的——这就是我们最终采用的方案。

二、核心方案

1.核心逻辑:hid-multitouch.c(坐标转换的关键)

文件路径:kernel-5.10/drivers/hid/hid-multitouch.c

wKgZPGkaixGAUs5yAACFuC-kohc057.png

这是USB HID多点触控驱动的核心文件,我们的坐标反转+交换逻辑就加在这里。TP上报的原始X/Y坐标会经过这个文件处理后,再传递给Android输入子系统,所以在这里修改数据最直接有效。

先看原代码和修改后的对比:

// 原代码(直接上报原始坐标)input_event(input, EV_ABS, ABS_MT_POSITION_X, *slot->x);input_event(input, EV_ABS, ABS_MT_POSITION_Y, *slot->y);// 修改后(先转换坐标,再上报)intmax_x = input_abs_get_max(input, ABS_MT_POSITION_X);intmax_y = input_abs_get_max(input, ABS_MT_POSITION_Y);intnew_x = max_y - *slot->y;    intnew_y = *slot->x; new_x = clamp_val(new_x,0, max_y);new_y = clamp_val(new_y,0, max_x);input_event(input, EV_ABS, ABS_MT_POSITION_X, new_x);input_event(input, EV_ABS, ABS_MT_POSITION_Y, new_y);

这部分是核心,必须逐行理解

步骤1:获取TP的最大坐标值

intmax_x = input_abs_get_max(input, ABS_MT_POSITION_X);intmax_y = input_abs_get_max(input, ABS_MT_POSITION_Y);

input_abs_get_maxLinux输入子系统提供的API,用于获取指定输入设备(这里是USB TP)的绝对坐标最大值

比如TP的分辨率是1920x1080,那么max_x=1919max_y=1079(坐标从0开始计数);

为什么要获取最大值?因为后续要通过最大值-原始坐标实现单轴方向反转

步骤2:坐标交换+方向反转

intnew_x = max_y - *slot->y;    intnew_y = *slot->x; 

这两行是解决“XY轴反转的关键,我们用一个实际例子理解:

假设TP原始上报坐标是(x=200y=500),且TPmax_x=1919max_y=1079

原逻辑:系统收到X=200Y=500(对应错误的轴映射);

新逻辑:

new_x = 1079 - 500 = 579(用Y轴最大值减原始Y,实现Y轴反转,再作为新X);

new_y = 200(直接把原始X作为新Y,实现XY轴交换);

最终系统收到X=579Y=200,正好修正了轴反转问题。

步骤3:限制坐标范围(防异常)

new_x= clamp_val(new_x,0, max_y);new_y= clamp_val(new_y,0, max_x);

clamp_valLinux内核的工具函数,作用是将数值限制在指定范围内(小于最小值则取最小值,大于最大值则取最大值);

为什么需要?防止TP上报异常数据(比如负数、超出最大值),导致系统识别到无效坐标,出现触控漂移或无响应;

比如new_x计算后是- 10,会被修正为0;若new_x1080(超过max_y=1079),会被修正为1079

三、测试验证:修改后效果如何?

修改完上述3个文件后,按以下步骤验证:

1.重新编译RK3588内核;

2.将编译后的内核镜像(boot.img)烧录到RK3588开发板;

3.接入USB TP,测试触控功能。

验证结果

单点触控:点击屏幕任意位置,光标精准对应,无偏移;

滑动操作:向上///右滑动,页面滚动方向完全正确;

多点触控:双指缩放图片、双指旋转,功能正常无异常;

边缘测试:点击TP边缘区域,无超出范围无响应问题。

整个适配过程从修改代码到验证通过,流程简单,比供应商提供的TP固件方案效率高太多。

四、实用小贴士:适配其他TP的扩展思路

这个方案的优势在于通用性”——如果后续换其他型号的USB TP,只要遇到类似的轴反转方向反问题,都可以参考这个思路修改,只需调整hid-multitouch.c中的坐标转换公式:

问题类型

调整思路

示例公式(假设原始x/ymax_x/max_y

XY轴交换

new_x =原始ynew_y =原始x

new_x=*slot->y; new_y=*slot->x

X轴方向反

new_x = max_x -原始xnew_y =原始y

new_x=max_x-*slot->x; new_y=*slot->y

Y轴方向反

new_x =原始xnew_y = max_y -原始y

new_x=*slot->x; new_y=max_y-*slot->y

XY轴交换+双轴方向反

new_x = max_y -原始ynew_y = max_x -原始x

new_x=max_y-*slot->y; new_y=max_x-*slot->x

修改前必做的准备

getevent命令查看TP的原始坐标数据(Android终端执行getevent -l),确认原始x/y的范围和上报规律,再针对性调整公式,避免盲目修改。

五、总结:嵌入式适配的灵活思维

这次RK3588 USB TP的适配,本质上是绕开硬件限制,用软件灵活解决问题。在嵌入式开发中,我们常会遇到硬件端修改麻烦的场景,此时不妨多想想:

驱动层能不能拦截数据做处理?

系统层有没有API能适配需求?

应用层能不能通过配置兼容差异?

毕竟,软件的灵活性才是嵌入式开发的核心优势。如果大家在TP适配中还遇到过其他坑(比如多点触控失效、触控延迟),欢迎在评论区分享,我们一起探讨解决方案~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5212

    文章

    20763

    浏览量

    338753
  • Android
    +关注

    关注

    12

    文章

    4041

    浏览量

    134798
  • RK3588
    +关注

    关注

    8

    文章

    601

    浏览量

    7695
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读

    瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读 瑞芯微旗舰芯RK3588系列开发板受到广大开发者伙伴的关注和问询。针对相关的开发板功能、操作指南等问题,我们一
    的头像 发表于 09-22 15:54 2.3w次阅读
    瑞芯微<b class='flag-5'>RK3588</b>开发板<b class='flag-5'>RK3588</b> EVB和<b class='flag-5'>RK3588</b>S EVB解读

    RK3588 Android+Linux双系统方案的实现

    12 SDK + RK3588 linux Debian系统 要求 Android和linux的固件的代码uboot和rkbin部分需要一致,因为uboot和loader是共用一份 u
    的头像 发表于 10-10 14:25 1.2w次阅读
    <b class='flag-5'>RK3588</b> <b class='flag-5'>Android</b>+Linux双<b class='flag-5'>系统</b>方案的实现

    RK3588 PCB推荐叠层及阻抗设计

    近期华秋电子联合瑞芯微、凡亿重磅发布了:《RK3588 PCB设计指导白皮书》,帮助开发者更好地规范利用RK3588开发产品,提高所设计的PCB质量,在实战中巩固及提高PCB设计水平。本文
    发表于 08-10 09:32 2117次阅读
    <b class='flag-5'>RK3588</b> PCB推荐叠层及阻抗设计

    迅为RK3588开发板Android系统烧写及注意事项

    迅为RK3588开发板Android系统烧写及注意事项
    的头像 发表于 12-03 15:17 7541次阅读
    迅为<b class='flag-5'>RK3588</b>开发板<b class='flag-5'>Android</b><b class='flag-5'>系统</b>烧写及注意事项

    用这份PCB设计实战手册轻松搞定RK3588

    烦恼。那么,如果拥有一份严谨而全面的PCB设计指导大全,并包含完善的问题解决系统,相信绝大部分设计隐患,都将迎刃而解! 所以华秋电子联合瑞芯微、凡亿重磅发布了PCB设计秘籍: 《RK3588
    发表于 12-25 14:32

    用这份PCB设计实战手册,轻松搞定RK3588

    烦恼。那么,如果拥有一份严谨而全面的PCB设计指导大全,并包含完善的问题解决系统,相信绝大部分设计隐患,都将迎刃而解! 所以华秋电子联合瑞芯微、凡亿重磅发布了PCB设计秘籍: 《RK3588
    发表于 12-25 14:38

    迅为RK3588开发板深度剖析丨首选的性能

    OTG/ USB2.0 OTG/ TypeC)。支持双路千兆以太网等等。 注:底板原理图,PCB工程全部开源,另提供基于迅为RK3588核心板的底板最小系统原理图。 RK3588开发
    发表于 09-03 15:49

    RK3588采集Cameralink图像快速搭建系统办法

    : CL-U3,便携式应用。 瑞芯微的RK3588开发板很多,种类各式各样。如何快速搭建一套自己的基于RK3588的嵌入式Cameralink图像采集处理方案呢。下面推荐一下。 快速
    发表于 12-19 10:07

    RK3588快速上手资料合集

    内存 250GB 空闲的磁盘空间 编译系统最好选用 Ubuntu 18.04,以下是基于 18.04 的环境搭建:2、使用USB线刷官方固件到Firefly ITX-3588J主板工欲
    发表于 04-06 15:27

    如何实现基于RK3588Android系统与Linux系统切换呢

    Android12 SDK + RK3588 linux Debian系统要求Android和linux的固件的代码uboot和rkbin
    发表于 05-26 10:16

    RK3588 SDK编译与固件烧写步骤

    ; make ARCH=arm64 rk3588sevb1-lp4x-v10.img -j24  单独编译uboot  $ 。/make.sh rk3588  2、固件烧写  升级工具
    发表于 08-31 17:45

    RK3588 Android系统编译命令

    rk3588 代码kernel内核版本是5.10,Android 12,编译命令如下:source build/envsetup.shlunch rk3588
    发表于 09-20 16:55

    RK3588 Android 12.0 SDK编译步骤分享

    rk3588sevb1-lp4x-v10.img -j24单独编译uboot$ ./make.sh rk35882、固件烧写升级工具版本:AndroidTool_Release_v
    发表于 09-20 17:11

    RK3588参数与主要特性 RK3588数据手册解读

    RK3588参数与主要特性 RK3588数据手册解读
    的头像 发表于 05-19 18:34 1.6w次阅读
    <b class='flag-5'>RK3588</b>参数与主要特性  <b class='flag-5'>RK3588</b><b class='flag-5'>数据</b>手册解读

    保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs)

    内核)上实操固件签名时,踩了不少官方文档的坑,经过反复调试终于打通全流程。今天就把这份实战经验整理成保姆级教程,从配置到问题排查,一步步带大家搞定 RK3588
    的头像 发表于 01-14 17:21 2449次阅读
    保姆级教程!<b class='flag-5'>RK3588</b> Linux6.1 <b class='flag-5'>固件</b>签名完整实现方案(不含rootfs)