冬天快到了,天气渐冷。每到这个时候,谁不想懒洋洋地窝在温暖的被窝里,抱着手机或平板随手涂鸦呢?可现实往往很骨感:想要在安卓设备上连上手绘板,Wacom 官方的方案通常要求 Android 14 及以上系统并安装配套的中心应用才能支持。

非得再去花钱买新设备吗?他翻了翻抽屉深处那台读书时买的经典入门老将——Wacom CTL-471。虽然已经 10 年了,但手感依然温润,小巧可爱,在电脑上测试后发现依然能用,令人欣喜。可连接到手机却只是个大号的鼠标,不可实战。

难道它只能继续在抽屉里吃灰?在网上搜寻一番后,他找到了一个开源项目 NoxProductions/wacom-on-android,但 clone 下来发现 CTL-471 没被检测到。经过一番调整,通过 Termux、Python 与底层 USB 控制传输,在已 Root 的安卓设备上完全解锁了 Wacom CTL-471 的绝对坐标与真实压感,把它变成了一个随身的高精度绘图工作站。

为什么随插随用行不通?

在理想状态下,把手绘板接上电脑,Linux 核心的 hid-wacom 模块会自动发送初始化信号,将平板从预设的“简易鼠标兼容模式(Report ID 0x01)”唤醒为“完整数位板模式(Report ID 0x02)”——从而解锁绝对坐标与 1024 阶压感。

然而,绝大多数安卓设备的核心(Kernel)为了精简与省电,并未编译进 wacom.ko 核心模块。这导致平板接上安卓手机后,会直接被当成普通的 USB 鼠标:

  • 没有压感:应用程序无法检测笔尖压力,笔触粗细一成不变。
  • 相对位移:光标移动像鼠标一样飘忽不定,无法做到真正的“指哪打哪”。

既然核心层面靠不住,身为极客,他决定直接在用户空间(User-space)用 Python 自力救济。

绕过核心,直接与硬件对话

整个方案依赖于 Termux、PyUSB 以及 Linux 的 uinput 虚拟输入设备接口。主要解决了三个痛点。

第一,发送 USB 控制传输(Control Transfer)唤醒硬件。通过 PyUSB 抓取到装置后,在连接初期手动向硬件发送专属控制指令,强制其切换至输出 0x02 绝对封包的模式。这行指令成功骗过了硬件,使其开始吐出包含绝对坐标与压感的原始数据。

第二,旋转与实体尺寸比例对应。手机屏幕通常是直立的,而手绘板多为横向摆放,代码中精准实现了 270 度旋转与实体尺寸比例映射,确保在板子上画正方形时,屏幕上不会变成椭圆形,并且让数据线接在顶部。

第三,压感手感微调(Gamma 曲线)。针对不同手劲,代码中加入了一道 Gamma 曲线,让轻触时的反应更加自然流畅。

完整的项目代码与快捷脚本已经整理并开源在 GitHub Fork 仓库中,clone 下来后即可尝试。

当驱动顺利运行后,可以在以下环境中快速展开冬日被窝创作:本地绘图 App 推荐使用 SketchBook,记得开启笔模式与压感支持,笔触的粗细变化非常跟手;如果不想安装大型 App,也可以直接在支持压感的网页端绘图工具上测试,即开即用,流畅度同样惊艳。

如果手头上是其他型号的 Wacom 绘图板(例如 Bamboo 系列、One by Wacom 或旧款 Intuos),想要进行类似的改造,可以参考以下几点:

  • 确认 Vendor ID 与 Product ID:绝大多数 Wacom 设备的 Vendor ID 均为 0x056a。可以通过 Termux 执行 lsusb 来查询型号对应的 Product ID,并在代码中对应修改。
  • 查询硬件原生分辨率极大值:不同型号的感应区尺寸不同,其 TABLET_RAW_MAX_X 与 TABLET_RAW_MAX_Y 数值会有所差异。可以通过简单的 Python 脚本将 endpoint.read() 接收到的原始数据印出来,对照笔尖移动时的数值变化来适配。
  • Android 权限与 OTG 设置:确保手机支持 USB OTG 功能,且 Termux 能够通过 su 顺利获取 Root 权限以访问 /dev/uinput 与 USB 总线。

让老设备发挥新价值,正是极客折腾最大的乐趣所在。这个冬天,不妨把箱底的吃灰老手绘板翻出来,一起在被窝里享受流畅的数字创作。