VF2从tf/emmc启动的尝试

按照risc-v习俗,启动的流程是spl(内存初始化)->sbi(m/s/u环境准备)->uboot(查找并载入内核)(后两者被合并在一起了)。

vf2的uboot启动后会从qspi读取eeprom内容,包含环境变量devnum,亦即从那个mmc设备启动,mmc0是emmc,mmc1是tf卡。启动的跳线一定要与devnum环境变量匹配,不然只是跳线状态对应设备中启动了uboot,内核与文件系统还是从devnum对应的设备载入。 :rofl:

默认的00状态是从qspi启动,然后走上述流程。
切换成10状态,可以从tf卡启动,能在启动信息里面看到try to boot from mmc2之类的信息。
切换成01状态,即从emmc启动,启动失败。

常规而言,emmc设备有boot0,boot1,user area三种启动分区模式。
我的emmc,用dd命令导出boot0和boot1,然后查看是全0。从vf2的uboot命令看,它并没有mmc partconf命令,也没法调整emmc的启动分区选择。用linux下的mmc-utils命令设置mmc bootpart enable 7 1 /dev/mmcblk0,并没有起作用。
目前jh7110的manual也还没有,具体如何从emmc中启动(即如何载入spl)?是遵循emmc的启动模式?还是直接把emmc当成存储设备,走类似user area的模式?这还属于黑盒。

另外,我把mtd0 mtd1以及sdcard.img的p1 p2分区dd出来,和spl.bin和fw.bin用vbindiff作对比,除了填充区不同,就完全一样了。(即spl和fw在存储设备之间的间隔不同,mtd中第一分区只有128K,但是sdcard.img第一分区有2M)
可以确定spl载入fw这一段,跟偏移值无关,是读取了分区表的。

至于大伙想要的m2启动,看来还得等官方的uboot更新,添加pcie/nvme设备的支持了。

总结:目前可以从qspi和tf中引导,然后载入emmc和tf中的内核和文件系统。

2 Likes

nvme 启动应该需要驱动。我不觉得短时间能搞定。
想用 SSD 的,我觉得还不如等 emmc 启动,emmc 找个小容量的只做 /boot 分区实现启动过渡。

emmc启动也还不清楚。boot0和boot1写入,以及镜像内spl和uboot的布局,是否需要修改uboot都还不清楚

这边有说明当前debian从emmc引导的办法:Cannot boot from emmc - #7 by junyuan.tan
启动流程文档似乎还在编写过程中

按说 emmc 是各种嵌入式设备的基本支持要求,我个人感觉 spl 里面肯定已经有驱动了。
估计就是里面的驱动参数有错误。

:joy:今晚又重新尝试了一下。
直接把
https://github.com/starfive-tech/VisionFive2/releases/download/VF2_v2.8.0/sdcard.img
dd到emmc,然后jumper调节到emmc,是能启动u-boot的。
但是如果dd到emmc之后,运行了

growpart /dev/sdc 4
e2fsck -f /dev/sdc4
resize2fs /dev/sdc4
fsck.ext4 /dev/sdc4

类似的扩展第四分区的代码,emmc就无法启动u-boot了

dd到emmc后,自己编译了spl和fw,然后dd到emmc的第一二分区,也是无法启动u-boot。
但是dd到tf卡的第一二分区,是能从tf卡启动u-boot的,看到u-boot内的时间是刚刚的编译时间。

2 Likes

根据 JH7110 Boot User Guide (rvspace.org) 1.2节、1.3节、1.4节,分区扩容后,fdisk等软件会自动修复分区表,也就会改变磁盘的sector 0, sector 1,因此emmc启动需要修正这俩个分区里面的数据 :rofl:

因为每次emmc的分区表被修正后,sector 0, sector 1的数据会被重写,因此需要dd导出gpt和phdr的数据,用spt_tool或者vf2-header修正后再dd回去
也可以同样处理sdcard.img在emmc上启动的问题

dd if=/dev/sdb of=gpthdr.bin bs=1024 count=1
spl_tool -i -f gpthdr.bin
dd if=gpthdr.bin of=/dev/sdb

1 Like

没必要处理分区,直接从flash启动,flash会自动从emmc查找分区,不使用emmc上面的bootloader就不会出问题了。

1 Like

1,直接下载 sdcard.img 文件;
2,从SD启动以后,copy sdcad.img到系统下面,使用dd if=sdcard.img of=/dev/mmcblk0 bs=4096 烧写EMMC;
3,断电设置拨码为EMMC启动;

:rofl:如果自己做镜像,或者调整了emmc分区表。还是要再次处理的。