本文首发于 https://www.neko.ooo/mongopi-mq1-hands-on ,采用 BY-NC-SA 许可协议。转载请注明出处。
购入历程
自从写 RISC-V 教学操作系统之后,一直用的是 QEMU 虚拟机来模拟操作系统的运行,配合 GDB 调试起来确实非常方便,而且可定制程度很高。
后来见了 K210 开发板,我就考虑买一块来尝试把系统跑在真实硬件上,结果发现 K210 采用的 RISC-V 标准比较古老,最新的工具链都不支持了,另外它 8MB 的内存确实有亿点点小。其他热度比较高的 RISC-V 开发板价格基本都在千元以上,这岂是我能承受的。
2021 年中,全志发布了基于阿里平头哥 RISC-V 芯片打造的哪吒开发板,价格五六百,虽然比树莓派贵了许多,但是板子的芯片作为 RISC-V 这一新生指令集架构的版本新且功能完善的 SoC,买来尝尝鲜也是可以接受的。
在年底上全志论坛逛的时候,发现全志又出了内置 64MB DDR2 的 D1s 处理器,论坛里已经有做板子的厂家预热了几款搭载这一芯片的开发板,其中便有仅售 9.9 刀的麻雀 MPi-MQ1,看到这价格,我直呼之前的哪吒买亏了。D1s 与 D1(现在改名叫 D1-H 了)相比,除了内置 RAM 外,去掉了 HDMI 输出和 HiFi4 DSP,减少了一个 I2S 音频接口和通用 ADC。这些阉割对我来说没什么影响,不额外加内存也足够用,但麻雀的价格不到哪吒的七分之一,对我确实有十足的诱惑力。
我买的是 WiFi 版的麻雀,价格比不带 WiFi 的稍贵一些,80 元不包邮,虽然现在我们的系统还没有做到 WiFi 驱动,但是以后会不会做谁知道呢哈哈,有总比没有强,也差不了几块钱。
编译 OpenSBI 与操作系统
全志提供的 SDK 中的 OpenSBI 居然还是 v0.6 的上古版本,之前我们曾 fork 过 OpenSBI 的官方仓库,为 v0.9 的 OpenSBI 添加了 D1 的一系列支持, 仓库地址在这 ,方便起见,这一版本直接硬编码了D1需要的驱动并做了加载,经测试适用于麻雀开发板。
好消息是,OpenSBI v1.0 已经正式官方适配平头哥 C906 平台了,因此我们可以直接使用最新版的 OpenSBI,但坏消息是,如果不通过 TF 卡/闪存烧录固件启动,而是直接进入 FEL 模式将二进制文件写入内存后启动,将会跳过 Boot ROM 中一段加载设备树与修改 a1 寄存器的程序(猜的,也许官方的 OpenSBI 也是硬编码的,没有设备树),而官方默认编译出来的 OpenSBI 二进制版本正是通过 a1 寄存器的值来确定设备树的存放地址的。
好在,OpenSBI 提供了可嵌入设备树的编译参数,因此,我们还需要手动编写 dts 文件并编译成 dtb 文件,随后 clone OpenSBI 的官方仓库,切到 v1.0 的 tag,执行 make PLATFORM=generic FW_FDT_PATH=<dtb 文件路径> CROSS_COMPILE=riscv64-linux-gnu-
以生成带 dtb 的固件。全志提供的 SDK 中有几个 dts 文件可供参考,但不可直接使用,因为其中 compatible 属性与 OpenSBI 能探测的不一致。
上述编译参数中,PLATFORM=generic
指定固件平台为 generic,这一平台对 C906 做了兼容。FW_FDT_PATH=<dtb 文件路径>
附加指定的 dtb 到 OpenSBI 的 .rodata
段,并将 a1 寄存器设置为其初始地址,这一行为由 firmware/fw_base.S
第 241-244 行(寄存器赋值)与第 826-835 行(嵌入 DTB 与设置空白占位空间)、firmware/objects.mk
与 firmware/external_deps.mk
配合实现。CROSS_COMPILE=riscv64-linux-gnu-
指定交叉编译工具链的前缀是 riscv64-linux-gnu-
,根据当前系统安装的交叉编译工具链的不同请自行修改。
编译好的附带 dtb 的 OpenSBI v1.0 与采用的比较简陋的 dts、dtb 文件均可在 这里 下载,目前dts中添加设备较少,如有需要可自行参考SDK中的dts添加并重新编译,这一版本可将dtb通过a1寄存器传递给下一阶段加载。硬编码驱动加载的OpenSBI v0.9可在 这里 下载,不附带dtb需要主动给下一阶段系统提供设备树或硬编码。
操作系统采用的是我们自己编写的一个玩具操作系统,目前外设也只驱动了 PLIC、UART 和 RTC,因此不如就拿这些整了个活,做了一个基于串口终端的打飞机游戏, 代码在这 。编译成平铺二进制文件直接加载进内存即可。
上电测试
开发板必不可少的 OTG 口、FEL 键、调试用串口一个不少,但是到货之后发现并没有随机附赠数据线和串口调试线(倒是送了条 WiFi 天线),无法做到开箱即用,还好我提前咨询了一下,把哪吒附赠的数据线和调试线给带了回来,不然就得额外花一笔小钱了。
麻雀的调试串口的针脚没有和哪吒一样单独引出到一个角落里,而是和众多扩展排针做在了一起,如果用哪吒附赠的调试线,将黑线接到任意一个 GND(这里选 1 号),白线接到 7 号口(UART0-TX),绿线接到 8 号口(UART0-RX),红色的 VCC 不需要接。
麻雀没有自带闪存芯片,在背面留有一个空焊位,可以自己焊接,或者使用 TF 卡烧录系统。不过我不用官方的 Tina Linux,既然有自己写的操作系统,当然是要尝试把它移植上去咯。
跑自己的操作系统最简单的方法就是进入 FEL 模式,用 xboot 大神做的 XFEL 工具将裸文件(平铺的二进制文件)直接写入 DDR,然后从 DDR 直接启动,这样就能省去从 TF 卡加载系统的部分了。
将串口调试线接上麻雀与电脑,串口驱动应该就会自动装上,随后就可以在串口通信软件里找到它了。这里我选择的软件是 MobaXterm 。设置正确的串口端口,选择波特率为115200(OpenSBI给阿里平头哥平台初始化的调试串口的默认波特率),连接上即可。
按住下图蓝框中麻雀 OTG 接口背面的 FEL 按钮(其实不用按,麻雀不插卡上电默认进入 FEL 模式),然后将数据线一头连接麻雀的 OTG 口,一头连接电脑,即可进入 FEL 模式,通电后正面的绿色 LED 灯会亮起。此时因为麻雀还停留在 FEL 状态等待接收指令,因此串口也没有任何的输入。Windows 下第一次使用 XFEL 需要进入 Drivers 目录安装对应驱动(macos 似乎是需要用 Homebrew 安装 libusb)。
装完驱动后执行 .\xfel.exe sid
就能看到麻雀的 sid 信息了。如果没有请检查驱动安装情况。
随后可以执行 .\xfel.exe ddr ddr2
来初始化麻雀的 DDR,这时候串口会有信息出现。使用 .\xfel.exe write <address> <file>
分别将 OpenSBI 和操作系统内核裸文件写入地址 0x80000000
与 0x80200000
,随后执行 .\xfel.exe exec 0x80000000
从内存地址 0x80000000
处开始执行指令。OpenSBI 会在初始化完成后跳转至 0x80200000
,因此我们需要把内核写到这部分内存。这些地址都是写在 OpenSBI 的源码和编译配置中的,当然都是可以改的,不过简单起见没有必要的话就不做修改了。
感觉很不错,就是 UART 有点慢。制作驱动的过程中掉进很多坑,如果想看如何简陋地把设备驱动起来,可以先来 这里 参考一下还未完工的文档。
连接 CKLINK 使用 GDB 调试
程序出了错误就得调试,调试可以靠在程序的不同位置输出各种信息,但更方便的方法还是直接上调试器。平头哥的芯片也有配套的调试器 CKLink,淘宝上有各种不同的版本,当然也可以自己打板贴片烧程序自己山寨一个,我选择在淘宝上花 79.9+邮费买了个第三方的成品,卖家声称获得了 CKLink 的授权,具体不得而知。除了调试器之外,由于调试接口与 TF 卡卡槽的引脚共用,因此最好还有个转接板方便调试,可以从 这个帖子 找到别人设计好的板上嘉立创免费打个板,如何接线可以参考 这个帖子 。
将转接板插入 TF 卡槽,用杜邦线或者排线连上调试器,随后将调试器 USB 线接上电脑,连接就完成了。
前往 平头哥开发者网站 下载最新版 DebugServer,安装时会自动安装上所需的驱动,安装完成后打开默认开启了 GDB server 服务,可以使用支持 RISC-V 的 GDB 远程调试,软件界面上会给出连接指令,在 GDB 中输入后即可像平时使用 GDB 一样使用了。如需 Windows 版支持 RISC-V 的 GDB 需要自行下载 GDB 源码编译,或者使用 芯来预编译好的 GDB (缺点是编译选项不能自己控制,比如没有编译 TUI 功能)。
DebugServer 启动后,XFEL 就控制不了内存了。要想使用 FEL 模式的烧录功能,就需要在关闭 server 服务的状态接入 OTG 线进入 FEL 模式,初始化 DDR 并烧入数据,随后不要直接使用 exec 跳转运行,不然可能来不及打断点。此时打开 server,随后运行 GDB,输入远程连接指令连上,先打上断点,再使用 jump 指令跳转到预定的地址。具体步骤见下图。
之后调试过程与在 QEMU 中调试区别不大,总得来说还是比较方便的。
总结
其实自从购入麻雀后一直没什么机会把玩,在写文的时候才好好试用了一下,跑了一遍日常调试的流程。麻雀给我的最深刻印象就是小、廉价。我印象中的开发板的大小基本是在树莓派那一档,也见别人玩过更大的 FPGA 开发板和更小的 ESP32 和 8266 的板子,但是功能如此强大完整、接口丰富、性能有保证的“迷你电脑”级开发板能做到这个尺寸还是让人非常惊讶的。至于其廉价性是和全志哪吒的开发板相比的,虽然我知道少了很多零部件,但是不到七分之一的价格也着实吓了我一跳,并且功能可以完全满足我们开发玩具操作系统与教学使用了,在促进推广和教学中低廉的成本将是巨大优势(毕竟穷学生hhh)。
最后还是希望大家可以多多支持我们正在开(gu)发(gu)中的教学操作系统项目,为我们加一个 star。