最近业余时间突然半脚踏进了小板子的地界里,手上拿了两三片 Orange Pi Zero 玩耍。先后在上面刷了 OpenWrt、Ubuntu Server,还有 armbian。OpenWrt 上的 Python 貌似有点问题,Ubuntu Server 略大,而且当要保护 SD 卡免受频繁读写之虞要用 overlayroot 的时候它(16.04)竟然不支持。目前看起来 armbian 不错。
看板子的配置,自带有一块小小的 flash 芯片,2MB 大小。就琢磨着放个 u-boot 上去,找来找去发现了一个外国小伙儿的成果:miZy uboot。作为一个经常不走寻常路的程序员,我决定在 WSL 里面进行编译。把源码克隆下来后,按照文档,有两个步骤,一是执行 uboot_prepare,一是执行 uboot_build,结果第一个命令执行就不能成功,看输出的信息,说是 invalid variable,貌似和 PATH 里面有空格有关,但是打开脚本,又难以看出端倪。几番查看均无成效,最后还是在老掉牙的 X200 上搞定了,编译花了总有二十多分钟。没办法,系统在 SD 卡上,总容量才 16GB,然后就把代码克隆到了 ExpressCard 那块伪 SSD 上了,那盘实测写入速度 10MB/s,编译又是个小文件无数的过程,因此慢也无可厚非。
待得又有一点小空的时候返回头来审视 WSL 环境里的问题,在仍无头绪的情况下,下载安装了个据说可以专门调试 shell 脚本的 bashdb。可气的是,这个玩意儿一安装好,脚本执行就正常了!后来回忆了一下,貌似期间我还 apt upgrade 了,所以现在难以判断到底是 bash/dash shell 自己更新后消除了 bug,还是 bashdb 施展了魔法。脚本执行正常,只不过是正常输出了错误信息,告知所需的编译器没有安装。输出的错误信息只会说 arm linux gcc 没有找到,但如果你按照这个信息正常安装 gcc 的版本,你就一定会走到邪路上。幸好这个问题老夫在 X200 上已经解决过一次,方法就是到 OpenWrt 的官方下载站(https://downloads.openwrt.org/releases/18.06.1/targets/armvirt/32/)下载所需的编译工具链(openwrt-sdk-18.06.1-armvirt-32_gcc-7.3.0_musl_eabi.Linux-x86_64.tar.xz),解压后把 bin 所在目录加入到 PATH 里。到这儿就差一步了,打开 uboot_build 脚本,找到“grep -q musl-”这个串,把最后那个短线(也就是减号)去掉,保存。这一检测条件之所以过不去,大概跟脚本编写时到现在这段时间里 openwrt 编译工具链自身的命名变化有关。总之,这样就会 OK。
编出来的二进制文件,如何刷写到 SPI flash 里,有两种办法。一个是板子上的系统自己搞,armbian 把 spi-sunxi 和 spi-dev 内核模块启用后可解,但是好像官方支持的是 3.x 的 Linux 内核。在板的 armbian 内核岸本已经是 4.19,比我工作用环境的内核都新,懒得折腾。第二种是用 USB 线把板子接到电脑上,用 sunxi-fel 工具往里写,据说现成的主线发布里面的工具还不支持,需要找一个特定的分支。最后的结果是写进去了,怎么写的我不知道,另一个爱动手的小伙伴搞定的。