序言

由于 windows 太卡,索性把平板换成 manjaro 系统,导致触摸屏无法使用(虽然大概率用不到,但强迫症不舒服)

苦寻许久终于找到解决方案 gsl-firmware


设备信息

  • 主板:H8811
  • 屏幕:显示分辨率 1280x800,10.1 英寸屏幕
  • 内存:DDR3 4GB
  • 磁盘:eMMC 64GB
  • CPU:Intel Cherry Trail X5-Z8350 1.44GHz

准备驱动

INFO

如果在设备列表找到相同型号可进入下一步

从 github 拉取 gsl-firmware, 并进入工具目录

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

INFO

可能会生成多个固件文件,格式为 firmware_00.fw, firmware_01.fw… ,须要一一进行测试才能找到适合的正确文件

安卓系统可以在 /system/vendor/modules 目录下找到 gslX680.ko 文件。

bash
./fw_extractor gslX680.ko

windows 系统可以在 C:\Windows\System32\drives 找到 SileadTouch.sys 文件或者官网下载驱动。

bash
# 通过GSL_TS_CFG.h获取
./untscfg GSL_TS_CFG.h firmware.fw

# 通过SileadTouch.fw获取
./unscramble SileadTouch.fw firmware.fw

# 通过SileadTouch.sys获取
./scanwindrv SileadTouch.sys

安装驱动

silead_ts 需要重新编译内核,这里为了方便没有编译

使用命令 dmesg | grep silead_ts 查看 silead_ts 模块加载日记

可以看到 silead_ts 模块尝试加载 (/lib/firmware/) silead/mssl1680.fw 失败, error -2 说明文件不存在

bash
dmesg | grep silead

# Output:
# [    7.238457] silead_ts i2c-MSSL1680:00: supply vddio not found, using dummy regulator
# [    7.238596] silead_ts i2c-MSSL1680:00: supply avdd not found, using dummy regulator
# [    7.239017] silead_ts i2c-MSSL1680:00: Silead chip ID: 0x80360000
# [    7.384785] silead_ts i2c-MSSL1680:00: Direct firmware load for silead/mssl1680.fw failed with error -2
# [    7.384802] silead_ts i2c-MSSL1680:00: Firmware request error -2
# [    7.571823] silead_ts: probe of i2c-MSSL1680:00 failed with error -2

把步骤二得到的 firmware.fw 复制到 /lib/firmware/silead 并重命名为 mssl1680.fw ,如果目录不存在需要创建目录。

bash
mkdir /lib/firmware/silead
cp firmware.fw /lib/firmware/silead/mssl1680.fw

使用 modprobe 命令重新加载 silead_ts 模块

bash
modprobe -r silead
modprobe silead

从 github 拉取 gslx680_ts_acpi 源码编译安装

bash
git clone https://github.com/onitake/gslx680-acpi.git
cd gslx680-acpi
make && make install
# make uninstall 卸载命令

将步骤二获取的 firmware.fw 转换为特殊紧凑格式的固件,并安装该固件

bash
./fwtool -c firmware.fw -m 1680 -w 1280 -h 800 -t 10 silead_ts.fw
cp silead_ts.fw /lib/firmware

# Usage: fwtool {
#   -i <new_firmware.fw> |
#   -x <new_firmware.fw> <firmware.fw> |
#   (-c [<firmware.fw> -1|<GSL_TS_CFG.h> -2|<SileadTouch.fw> -3] | -s ) [-m <controller_model>] [-w <width>] [-h <height>] [-t <num_touches>] [-f <flags>] <new_firmware.fw>
# }
# -i    打印新型固件的信息
# -c    将旧的固件格式转换为新型固件格式
# -s    设置新型固件参数和标志
# -x    新型固件格式转换回旧的固件格式
#
# -1    Plain firmware, as used with the Android driver (默认)
# -2    Windows GSL_TS_CFG.h firmware
# -3    Scrambled Windows SileadTouch.fw firmware
# -m    设置芯片型号(4字节ASCII字符串,例如:1680)
# -w    设置宽度参数(分辨率)
# -h    设置高度参数(分辨率)
# -t    设置支持的触点数量参数
# -f    设置标志,用逗号分隔(可选,支持的标志: xflip, yflip, swap, track)
#           xflip 开启水平翻转
#           yflip 开启垂直翻转
#           swap xy轴交换
#           track 启用手指跟踪(用于不支持的芯片)
#          (每个标志都可以加上'no'前缀以禁用它(noxflip, noyflip, noswap, notrack))

使用 modprobe 命令重新加载 gslx680_ts_acpi

bash
modprobe -r gslx680_ts_acpi
modprobe gslx680_ts_acpi

遇到的问题

  • 不知道什么原因,一旦屏幕旋转校准信息就会丢失
  • HOME 键无法使用