温馨提示:本文过于繁琐,记录了几乎所有适配和抄袭过程,实际编译过程在第4点。
项目由来及简要移植过程
0.致谢
首先,我只是强行将openwrt的代码移植过来的,可能使用过程中会有许多问题。望各位大佬见谅。还要感谢官方和论坛大佬们的帖子和开源仓库。
1.背景
这一切起源于以下这篇文章,感谢这位佬的开源:
【OpenWrt On Milkv-duo】Milkv-duo 运行 OpenWrt 系统
我在使用了镜像后,发现不能使用网络、opkg、luci,因此从百度上面找各种教程,楼主这人就是个半吊子,看不太懂源码,不太会改BUG,只能像抽奖一样去补充各类缺失的组件,边学边改,耗时较长。现在也不太懂为什么,只知道能跑起来就行。如有大佬知道其中原理,希望您能补充。谢谢。
2.梦的开始
妈的,我第一次接触 GitHub 是从duo开始的, 那时还不会用github action。后面看见了Baozhu Zuo大神的帖子,我就手痒,想尝试自己编译。然后开始了长达半年的漫长旅程。我要是勤快点就不会半年才适配好duo系列。(实际上是自己菜 )
3.移植过程
我参考了Baozhu Zuo大神的github仓库,依据大佬的仓库文件,在官方buildroot仓库找到了对应的设备树,将其拷贝到了sophgo目录下,使用大佬提供修改好的openwrt仓库,将对应的代码修改打到23.05版本的istoreos上了。主要是我觉得istoreos的luci界面好看,没想到luci能不能用的问题。
在移植了duo256和duos的设备树后,进行了编译,寄,失败了。还有configs没移植(make menuconfig的文件),依葫芦画瓢,照着cv180x-config文件去改对应的config,再参照原仓库的cv181x-config改成了对应的duo256m和duos的config了。又一步完成。
之后就是image文件夹了。这firmware/cv180x里的那些bin又是什么东东呢?我不知道,困扰了我好久,本着能偷就绝不自己动手移植代码的"原则"( 我这人怎么这样啊?),从官方buildroot编译生成的临时文件里找到了相应的.bin文件,按照cv180x文件夹里面的内容将那些bin文件复制到了firmware/。
image/还有几个文件,这几个是编译规则相关的文件,我就照着cv80x.mk的格式编写了其余两个.mk文件。然后依据istoreos的报错,按照原有的makefile,将剩余几个 makefile 文件加上 duo256m 和 duos 的声明即可。具体请看相关Makefile。
如图所示,您可在 rootfs.ext4 代码内找到 size 属性,若需要修改镜像文件系统大小,更改 size 属性即可。
最后,在sophgo/base-files/中,添加了几个编译必要的库文件和脚本文件,在root目录,提供了network-init.sh脚本以便使用者初始化网络等。而且提供了pinmux和libwiringx.so预编译好的库。您可以直接调用。如,duo-pinmux duo256m-pinmux等。不知是否可用,还望各位大佬测试。
4.编译过程
接下来是最重要的编译过程啦!首先声明一点,23.05版本源码对riscv支持不是特别完善,若您想编译一些额外的包,我不敢保证编译没有意外。默认勾选的包是已经测试通过的,对于您额外勾选的包,如果编译失败或者无法使用,我不负责哦。(当然,您可以参考以下内容修复问题,Introduction | Milk-V)
首先,您需要配置好编译环境:
sudo apt update
sudo apt install ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python3 python3-pip libpython3-dev qemu-utils rsync rename scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
wget https://mirrors.sdu.edu.cn/ubuntu/ubuntu/pool/universe/g/genimage/genimage_16-2_amd64.deb
sudo apt install libconfuse2 genext2fs
sudo dpkg -i genimage_16-2_amd64.deb
rm genimage_16-2_amd64.deb
然后安装host-tools
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz
tar xf host-tools.tar.gz
如果已下载过host-tools,不用重新下载,只需在config文件内修改toolchain位置即可。如图所示:
记得所有的 config 文件都要改哦,除非和我的 toolchain 目录相同就不用改啦。
接下来,您需要下载istoreos (或 openwrt ) 和 feeds-vizos
git clone -b vizos --single-branch https://github.com/draftbottle/VizOS.git feeds-vizos
git clone https://github.com/draftbottle/istoreos.git --single-branch
将feeds-vizos关联到openwrt内
echo "src-link vizos ${PWD}/feeds-vizos" >> istoreos/feeds.conf.default
cd istoreos
cat feeds.conf.default #查看有没有vizos目录
接下来就是常规操作啦
./scripts/feeds update -a
./scripts/feeds install -a
./scripts/feeds install -f sophgo
./scripts/feeds install -f uboot-sophgo
复制config文件,勾选您需要的软件包(请勿勾选luci),make制作镜像
cp ../feeds-vizos/configs/cv180x-config .config
make menuconfig # 非必须选项
make -j$(nproc) || make package/feeds/vizos/uboot-sophgo/compile V=s
make -j$(nproc) V=s
若编译成功,您可以在/istoreos/bin/找到您的milkv-duo.img镜像。
5.镜像烧录
我不会改uboot(就是菜的一批),因此,您在烧录完duo256m和duos后,需要在资源管理器打开您的sd卡,用github提供的两个文件将boot.sd和fip.bin替换掉。(这两个文件也是偷别人的, 都忘了偷的哪里的了 一直偷一直爽 )
然后就可以成功启动了。
第一个问题下,第一次启动回复y, 回车。第二个问题,填写您的Duo设备静态IP地址(和路由器要在同一网段内),第三个问题,填写Duo用网线连接的路由器或者网关的地址。若直接回车即为图片默认地址。
联网后设备会更新相应的包和库文件,更新成功后即可使用opkg和apk了。第一次启动时,更新过程会报一些错误,您忽略即可。(可能是sd卡的问题,使用劣质sd或sd短时重复烧录会迅速降低sd寿命,导致无法正常启动镜像。我已报废三张sd了。 )
更新完成后,若需要luci,请自行使用opkg安装luci并重启开发板。重启后重新运行network-init.sh,您便能网页登录luci了。正常情况下,luci地址即为您在network-init.sh设置的ip。若您其他终端和duo位于同一网段,则可用浏览器访问。用户名root 密码password
6.结论与展望
到此,duo系列的OpenWRT基本配置完成,当然,luci网页还是有些问题的,我也没有精力也没能力去修,后面很可能不更新了。因为我还是稍微菜了点,看不懂那些具体的代码,依葫芦画瓢照着写bug还差不多,修bug这类真正有技术含量的事儿还是让其他大神来做吧。
此篇文章完结!
修改日期:2024.07.09