M60 Keyboard - 运行 Python 的机械键盘
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+应该都能用了。
===
先这样写一点,之后应该不会再补充了。