编译酷比魔方KNote5的触摸屏驱动

去年我给闲置的一台酷比魔方KNote5安装了Ubuntu 20.04 LTS Desktop发行版,用来代替树莓派做个人服务器。虽然作为服务器的话触屏其实可有可无,可毕竟安装的是桌面发行版,闲来无事不如解决下KNote5的SileadTouch触摸屏驱动吧!

前言:

前年(2019年)本来打算是安装Chrome OS(FydeOS)或者Zorin OS的,但U盘测试后发现触摸屏无法正常驱动,在搜索了Fyde OS论坛之后,发现了姊妹机KNote go适配触屏的帖子,其中提到了「驱动基于GSLx680的SileadTouch触摸屏,需要从Windows提取出SileadTouch.sys并在Linux单独编译Firmware」(https://community.fydeos.com/t/topic/666/4),当年由于并没有特别强烈的需求也便放弃了这一想法。后来安装Ubuntu之后,除了触屏外大部分硬件都能顺利工作,想到Fyde OS的那篇帖子也便想尝试一下,因为在小屏幕设备上我还是更习惯用手指点击控件 👆🏻

装完之后后来又发现一篇16年的「折腾日记:iwork8旗舰版编译触摸屏驱动」,又发现了一篇19年的「神舟pcpad pro装linux-解决驱动之路-包含触摸屏」,还有其他论坛和博客上提到各种的“寨板”文章……(酷比魔方、台电、原道、七彩虹、昂达、驰为、品铂等深圳一众五线小厂商)(噢对!我还有一台台电Tbook10)解决方案都是基于GSLx680控制器的SileadTouch触摸屏单独编译驱动

几乎所有的寨板都使用了这个廉价而令人蛋疼的触摸屏方案:为了省成本,驱动不写参数,统统混乱的打包在SileadTouch.sys!运气好的话可能还可以用他人同型号编译好的驱动,但大部分的触摸屏批次不同参数也不一样,即使是同型号机器,也需要“独一无二“的定制驱动编译 😒

回归正题,虽然每个平板的触摸屏规格不一,但只要你的平板使用了GSLx680控制器的触摸屏那都可以试试,编译驱动的流程大同小异,大部分均参考了使用GitHub上的GSL-firmwareGSLx680-ACPI两个项目进行固件驱动编译,后者是通用的GSLx680控制器内核驱动,需要配合原厂触摸屏驱动文件才可以工作,而原厂的驱动文件就需要用前者转换为Linux可用的固件驱动,当然,也支持转换Android系统的驱动。经过转换之后就可以驱动了!


编译教程:

首先新建一个gslx目录,用Git克隆GSL-firmware的仓库,进入到tools目录

mkdir gslx
git clone https://github.com/onitake/gsl-firmware.git
cd gsl-firmware/tools/

然后把从Windows提取出的SileadTouch.sys(或者SileadTouch.fw、GSL_TS_CFG.h、gslx680.ko等类似的)驱动复制到tools目录下,然后根据GSL-firmware的项目指示提取出firmware.fw文件:

Android驱动

可以在以下路径(或类似路径)下提取出Android的触摸屏驱动:/system/vendor/modules/gslx680.ko
请将文件复制到SD卡,使用文件传输实用程序或使用adb pull提取

在构建机器上,从终端使用脚本「firmware / fw_extractor」从驱动中提取固件:

./fw_extractor my_android_gslx680.ko

Android驱动程序可能包含多个固件,以通过同一驱动程序支持不同的硬件配置。提取程序可以将这些固件作为单独的固件文件导出。目前无法知道哪个固件适合你的设备,因此你需要测试每一个寻找匹配的固件。有时,文件名会提供线索,例如面板尺寸,产品名称,分辨率或芯片名称等。

引用自GitHub,已经过翻译

Windows驱动:

如果使用Windows驱动程序,则固件以称为GSL_TS_CFG.h(或类似名称)或SileadTouch.fw的文件形式出现。后者只是GSL_TS_CFG.h的加密版本,可以通过将每个字节与0x88进行XOR来轻松恢复。

要转换GSL_TS_CFG.h为二进制,请使用:

./untscfg GSL_TS_CFG.h firmware.fw

对于加密的SileadTouch.fw,请使用:

./unscramble SileadTouch.fw firmware.fw

如果您的供应商仅提供Windows驱动程序而没有单独的固件,则仍可以提取其中包含的固件Blob。

使用scanwindrv脚本扫描驱动将其解压缩:

./scanwindrv SileadTouch.sys

与Android驱动程序一样,这可能会产生多个固件文件,分别称为firmware_00.fw,firmware_01.fw等,你必须进行测试才能找到适合您设备的正确文件。

引用自GitHub,已经过翻译

引用GitHub项目的一段介绍,还有手指跟踪等功能可选,更多参数详见fwtool页面:

如果您的触摸屏控制器不支持手指跟踪(这对于正确的鼠标仿真至关重要)或轴似乎已镜像或交换,则可以修改固件以启用驱动程序中的相应功能。

例如,这启用了软件手指跟踪(track)并镜像了水平轴(xflip):

引用自GitHub,已经过翻译
tools/fwtool -s -f track,xflip silead_ts.fw

那么根据上文,我通过SileadTouch.sys用scanwindrv提取出了firmware_00.fw,但这仍然不够,我们需要通过fwtool(参数很多,详见https://github.com/onitake/gsl-firmware#gslx680_ts_acpi)进一步转换为Linux可用的固件:

./fwtool -c firmware.fw -m 1680 -w 2040 -h 1510 -t 10 silead_ts.fw

命令参数解析:
-m 控制器型号 GSL1680(大部分寨板触屏所用的控制器,少数还有GSL2680、3680等)
-w 触摸分辨率宽度,我的是2040(注意:触摸分辨率并不等于屏幕分辨率,虽然有极少概率数值相同)
-h 触摸分辨率高度,我的是1510(注意:同上)
-t 屏幕触摸点,我的是10点触控

然后,将编译好的固件移动到 /lib/firmware 中:

sudo mv silead_ts.fw /lib/firmware

然后克隆gslx680-acpi项目仓库,编译控制器内核驱动:

git clone https://github.com/onitake/gslx680-acpi.git
cd gslx680-acpi && make
sudo make install

重启机器,进入gnome后,测试手指点击有反应,触摸屏可以成功驱动!
如果出现错位现象,请一步一步从初始方向(重要)调整编译参数测试数值进行校准,具体就是用手指向右下角拖动……
本人测试过,安装了一次内核驱动无需再次make,所以前往tools目录再次调整参数、移动驱动后重启就好。

重点提到初始方向是因为我另一台平板 台电Tbook10 的面板方向默认是纵向的,但Android下却是默认横向的,可从开机画面判断,也因此从不同的系统启动的第三方系统的屏幕方向也有所不同,这一点需要注意。

校准测试示例

重申一下大致流程:

  1. 先去Windows(或Android)系统提取出原机的SileadTouch.sys驱动(或其他驱动文件 比如SileadTouch.fw等)
  2. 克隆gsl仓库驱动,转到tools目录,将SileadTouch.sys驱动复制到该目录
  3. 用scanwindrv扫描转换出SileadTouch.sys的驱动,解压得到firmware_00.fw等固件驱动,重命名为firmware.fw(或其他类似转换为的firmware.fw固件驱动)
  4. 在控制台使用fwtool加上参数再次转换出silead_ts.fw固件驱动,然后将编译好的固件驱动移动到 /lib/firmware 中
  5. 克隆gslx680-acpi项目仓库,编译控制器的内核驱动
  6. 重启机器,测试触屏,发现错位则重复执行第4步再重启

恭喜你,经过多次调教之后,你的触摸屏应该可以正常使用了,保存好这个驱动文件,可以在其他Linux发行版中使用!


已知的问题:

屏幕纵向旋转后画面会倒向(横向没有这个问题):

即90度旋转后画面是270度的,而触摸屏也会随之错位,这可能是另外的屏幕旋转驱动问题,我暂时没找到解决方案。

大部分应用没法拖动窗口,Firefox也没法用手指滚动:

嗯……每个应用程序对触摸屏的适配程度不一,非原生绘制的窗口对触屏的支持稍微有点问题(不过我目前还没遇到什么不能用触屏的应用),而并非触摸屏驱动的问题。不过Firefox的触屏滚动问题可以参考askubuntu论坛上这个回复帖解决:https://askubuntu.com/a/886914

接入电源后,手指在触摸屏的坐标晃动的非常不稳定(甚至触控失灵):

经过Google之后发现iPhone在高铁充电时也存在这个问题,原因大致是因为电源不稳定,导致电容频率有噪声干扰(接地?滤波?逆变器?)由于我并不是学电气专业的,所以我也无法解释这个现象。

不过可以得知是电源方面的问题,嗯……寨厂附带的充电器品质一般也不怎么样……
用手指按住主板附近位置的金属后盖(稍微带点电),晃动干扰问题消除,手指放开,问题重新复现 🤷‍♂️
(等于说我起到了“接地“的作用,危险操作请勿模仿)

由于KNote5也支持USB C的PD充电,于是我又用谷歌的PD充电器给KNote5充电,就没有出现触摸晃动问题,后盖也没有静电,可以判定就是小作坊电源的问题了!

解决方案:换成带电源滤波的充电器,以及抗干扰磁环等,解决电源干扰问题

睡眠(挂起)之后触摸屏失灵:

系统自动挂起、盒盖或者手动挂起之后再打开平板后,触摸屏毫无反应,只有重启可解决,根据这个issue可以判断是DSDT内核错误导致ACPI唤醒之后触屏不工作

解决方案:不要开启任何自动挂起的选项,只自动关闭显示器
(本来就是作为服务器用的平板,并不需要挂起休眠,更何况Ubuntu本身就很省电,关闭显示器后会自动锁定,再打开可以像Android直接秒开)

小插曲:触摸屏不仅失灵,重启也不行,没有加载内核模块:

更新系统或其他操作可能导致了内核版本号变更,像我这里虽然都是5.8.0的版本,但出现了5.8.0-36-generic、5.8.0-38-generic、5.8.0-42-generic……经过我再一次Google检索之后,发现是模块版本不对(Version Magic不匹配)导致的,参考了这篇文章 invalid module format,得以解决:

1.根据modinfo命令查看vermagic的值
2.根据uname -r查看内核版本
3.对比上边两步的值是否相同
若相同,我就不知道了
若不同,采用make -C /lib/modules/此处为你内核版本号对应的文件夾/build M=你模块源码的路徑 modules

在gslx680-acpi目录中输入这段命令(请将目录位置的内核版本替换为uname -r显示的版本,以及把「M=」后面的目录位置替换为你的gslx680-acpi目录的绝对位置)

make -C /lib/modules/5.8.0-43-generic/build M=/home/ubuntu/gslx/gsl-firmware/tools/gslx680-acpi/ modules
sudo make install
reboot

编译成功后,重启,测试触屏驱动,成功!


好了,经过一轮番折腾之后,开始享受你平板上的触摸屏吧!

留下评论

%d 博主赞过:
订阅推送通知    OK 不用了,谢谢