Milk-V DuoS 是一款搭载SG2000 主控,拥有512MB内存和丰富 IO 接口的紧凑型嵌入式开发平台。它集成了 WI-FI 6/BT 5 无线功能,并配备 USB 2.0 HOST 接口和 100Mbps 以太网端口,方便用户使用。它支持双摄像头(2x MIPI CSI 2 通道)和 MIPI 视频输出(MIPI DSI 4 通道),可实现多种应用。DuoS 还支持通过开关在 RISC-V 和 ARM 启动之间切换,适合各种场景和更复杂的项目开发需求。
NuttX是什么?
NuttX是一个专注于标准合规和占用少内存的实时操作系统(RTOS)。它可以在8位到32位的微控制器上部署。NuttX在编写时主要参照了POSIX和ANSI标准。对于那些标准中没有的部分,如fork()等,则参考了VxWorks或其他RTOS。"
总的来说,NuttX是一个功能丰富、性能稳定,成熟安全的实时操作系统。大家熟悉的Xiaomi Vela,包括索尼的一些产品都是基于NuttX开发的,可以说,对于有过POSIX编程经验,并想使用小型CPU/MCU的用户而言NuttX RTOS是一个绝佳选择。最近,我们惊喜的发现,社区大佬Lup Yuen Lee(https://github.com/lupyuen)使用DuoS开发板成功将NuttX移植到了SG2000处理器上! 让我们一起来看看大佬是怎么做到的,具体代码如下:
https://github.com/lupyuen/nuttx-sg2000 https://github.com/lupyuen2/wip-nuttx/tree/sg2000
Port to SG2000
1. 大佬使用的系统环境是另一位Github大神Justin Hammond基于sg2000制作的debian risc-v架构的镜像,链接附在下方:(膜拜ing,学的速度都快赶不上大佬们开发速度了!)
https://github.com/Fishwaldo/sophgo-sg200x-debian/releases
将镜像烧写到DuoS开发板上,成功后我们可以看到:
值得注意的地方是,大佬特别提到请使用CP2101型号的USB转串口处理器,若使用CH340系列处理器,屏幕上则会到处打印乱码。
2. 在开机过程中,我们可以通过log发现U-Boot是支持TFTP的,即我们可以将编译好的NuttX Image直接在U-Boot阶段就将固件传进去,是不是非常方便高效!(虽然也可以将编译好的NuttX复制到sd卡上,再插到开发板上,但是如果需要调试则整个过程就会循环往复,十分不便...) 使用reboot指令重新启动,然后一直敲击Enter
键,就可以进入到U-Boot Command Prompt界面:
$ help // 打印所有可执行指令
$ printenv //打印所有的环境变量
$ net list //查看可用网络设备
eth0 : ethernet@4070000 00:00:00:00:00:00 active //这里发现我们可以直接通过ethernet来传输和移植NuttX
通过查看kernel_addr_r
、ramdisk_addr_r
等参数,我们就可以正确配置NuttX,使其能将Kernel传到正确的地址上。不过不用担心,贴心的大佬已经替我们做了先行工作,我们可以直接使用编译好的镜像来体验NuttX。
镜像下载:https://github.com/lupyuen2/wip-nuttx/releases/download/sg2000-1/Image
想自己动手试试的朋友可以参考这份帖子,里面大佬也非常详细的说明了如何为SG2000构建NuttX:https://lupyuen.github.io/articles/sg2000#appendix-build-nuttx-for-sg2000
3. 接下来我们就可以配置TFTP, 并将NuttX Image传进RAM里了。请先确保在本地环境上已经装好了TFTP server并完成配置。然后就可以在U-Boot命令行配置:
$ setenv tftp_server 192.168.x.x //本地TFTP地址
$ saveenv //保存配置
$ dhcp ${kernel_addr_r} ${tftp_server}:Image-sg2000
$ tftpboot ${fdt_addr_r} ${tftp_server}:cv181x_milkv_duos_sd.dtb
$ fdt addr ${fdt_addr_r}
$ booti ${kernel_addr_r} - ${fdt_addr_r}
如果使用静态IP地址,可能会在第一步dhcp指令失败,这时可以通过设置
ipaddr
使开发板和pc host在同一子网内,确保互相能ping通,再将第一步的dhcp
改为tftpboot
即可。
当我们看到nsh>
字样时候,证明我们已经成功将NuttX移植到板子上了!
在仓库的README里,对每个步骤都有更详细的解释,大佬对代码也在不断进行更新,小伙伴们赶快拿起手里的DuoS开发板,一起探索起来!
Lup大佬还在继续对NuttX在SG200X处理器上的探索,并即将在Apache NuttX International Workshop (https://events.nuttx.apache.org/)上分享心得。对NuttX,或者对整个移植过程有问题的小伙伴,都可以线上参与起来,Lup大佬会在在线进行答疑解惑。
期待更多开发者可以加入这个精彩的技术社区,共同学习,共同进步,挖掘更多可能!