M60 Keyboard - 运行 Python 的机械键盘

Last updated: 2023-06-09
Table of contents

背景

折腾这个主要是因为我自己有用一个固件是 CircuitPython1 2 的机械键盘3。 然后官方好像咕咕咕了很久没更新,我就忍不了了(也正好有空),直接自己上,把固件 大版本提了上来(6.0.0 -> 7.3.1),以便使用更多特性。

定制 CircuitPython

为什么不用官方发行并支持的二进制版本呢?emm主要是官方固件不接USB就会停机,也就不能无线使用了,只能 定制一下固件。

在 GitHub 上对比了 Makerdiary 和 Adafruit 官方版两个分支的不同 5,从中剥离了 matrix 模块和针对键盘的定制,调整 成了一组 Patch,调整后的补丁区分度更高,也方便后面继续升级版本。下面简单说一下 遇到的困难。

未声明的函数

对于 CircuitPython 7.x 的编译系统,所有用到的函数都需要声明。几乎没写过靠谱的C的我,在面对 这个问题的时候竟然非常小心,总认为光声明没有用。

然而事实是,补全声明就行了。

不匹配的类型

CircuitPython 7.x 开始,跟上了 MicroPython 内置 C 模块的接口设计,不再用旧的那 套了。为此需要将旧的类型转换成新的、函数原型做对应调整。庆幸的是,C实现的 matrix 模块并不需要传入参数,逻辑不用作过多修改。

不过也可以看出这个 matrix 模块不够灵活,是针对 M60 键盘写死的,想迁移到别的设备还得动点脑筋。

安全模式没了

为什么我无法手动进入安全模式?安全模式下,不会自动重载代码,不会上电自动启动代 码,方便调试板上的 python 程序,同时也可以作为一种更新板上代码的方式。为了避免 键盘的虚拟U盘文件系统损坏,我会在 boot.py 中关闭存储设备接口或将存储设置为只 读。有时代码没写好,忘了加恢复的快捷键,就需要用安全模式避免代码上电执行。但现 在安全模式没了,就又得格式化存储区……

检查了 cherry-pick 的 commit,发现问题可能出在绕过 soft device 崩溃时的安全模 式重启上。reset 键盘时, soft device 可能会挂掉,而现在的状况是,手动进入安全 模式, soft device 也会挂掉,所以原来的代码顺带把进入安全模式的状态给清了……

解决方法,便是对当前重置条件做额外检查。运气很好,其它模块内有对应实现,搬过来稍微改改就好了。

用 mpy-cross 提前将模块编译成字节码

需要用与 CircuitPython 版本对应的 mpy-cross6,参数设定好。本来想继续 研究看看,但好像没什么用。

还想研究 C 写的模块来着,发现 CircuitPython 还不行……这边 MicroPython 更先进啊。

修 Bug

让官方版本 CircuitPython 支持无 USB 连接使用

其实很简单,回过头来看,只要把键盘的电源控制IO(P0.28)激活即可。Makerdiary在添加支持时并没有通过board暴露这个引脚,文档里也有点错误。总之搞定了。CPY 8.2.0+应该都能用了。

===

先这样写一点,之后应该不会再补充了。