按照risc-v习俗,启动的流程是spl(内存初始化)->sbi(m/s/u环境准备)->uboot(查找并载入内核)(后两者被合并在一起了)。
vf2的uboot启动后会从qspi读取eeprom内容,包含环境变量devnum,亦即从那个mmc设备启动,mmc0是emmc,mmc1是tf卡。启动的跳线一定要与devnum环境变量匹配,不然只是跳线状态对应设备中启动了uboot,内核与文件系统还是从devnum对应的设备载入。
默认的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中的内核和文件系统。