本文介绍一下jh7110 uboot的开发。使用的SDK为公版SDK,就是从赛昉科技的git上面拉下来的那个,然后交叉编译器,这里有两种选择,一种是通过buildroot构建一个,构建的方法上一篇文章已经介绍过了,另外一种选择是下载一个别人构建好的。这个uboot的交叉编译器对第三方库基本没什么依赖。 开发uboot的流程基本上就是在参考官方已有的配置,然后再增加一个配置。比如,要想在visionfive2 开发板上新建一个gateway的配置,那首先就是要在board下面增加一个板级配置。visionfive2的板级配置路径为 board/starfive/visionfive2 那么首先就将其复制一份,也放在board/starfive路径下,比如叫做gateway。然后将starfive_visionfive2.c重命名为starfive_gateway.c。 然后要修改一下里面的Kconfig和Makefile文件。
这个visionfive2开发板上面有个eeprom,里面有它的一些配置,比如芯片版本号,dram容量等,应该是官方为了一套固件兼容多种不同配置的主板。如果是自己增加的板级配置,这个驱动是可有可无的。因为你手上的板配置肯定是已知的,直接写死在设备树或者代码即可。 Kconfig文件修改如下。主要是修改这个TARGET,因为后续编译的时候需要寻找这个TARGET。
要使这个Kconfig文件生效,需要修改arch下面的Kconfig文件,修改如下
这样可以在defconfig文件里面指定这个TARGET 接下来要创建defconfig文件。这个defconfig文件可以参考starfive_visionfive2_defconfig,直接复制一份,然后修改如下几项
设备树,如果要修改的话,则要同时创建两个文件,比如笔者改成这样,那么就要创建starfive_jh7110_gateway.dts和starfive_jh7110_gateway-u-boot.dtsi,后者是uboot spl需要使用的。否则spl找不到对应节点。
然后TARGET改成这样
这个FDT文件也是要改的跟CONFIG_DEFAULT_DEVICE_TREE一样 其余的暂时可以不改。 之后执行编译 RISCV64平台的bootloader基本都是分成两个部分,第一部分是uboot spl,第二部分通常是uboot主题+opensbi。opensbi跟cpu架构相关,跟芯片外设或者 电路板关系不大。 source一下交叉编译环境,然后执行如下命令进行编译
这里的uboot_defconfig就是新创建的的defconfig文件,然后uboot_wrkdir就是编译输出目录。CROSS_COMPILE是交叉编译器 执行完这一步之后,会在uboot_wrkdir下生成u-boot.bin文件,在${uboot_wrkdir}/spl下生成u-boot-spl.bin文件。前者是uboot本体固件,后者是uboot spl固件。另外会在${uboot_wrkdir}/arch/riscv/dts下生成dtb文件,是uboot的设备树文件。 然后通过如下命令构建opensbi并和uboot本体固件打包
生成的文件在opensbi的编译输出目录platform/generic/firmware下,文件名为fw_payload.bin
然后将这个firmware使用mkimage文件打包,输出文件为${uboot_fit}文件。笔者这里指定的输出文件为jh7110_gateway_fw_payload.img 接着需要使用赛昉官方的spl_tool打包uboot spl文件,这个固件作为bootrom跳转的目标,对可靠性有要求,自然需要按指定的格式打包。打包工具位于SDK目录下面的soft_3rdpart/spl_tool。 编译命令为 make -C ${spl_tool_srcdir} cp ${spl_tool_srcdir}/spl_tool ${wrkdir} 这个工具是个主机上面的可执行程序,利用主机上面的gcc编译器编译出来能执行就行,没有额外的依赖。 得到这个工具之后使用如下命令打包 ${wrkdir}/spl_tool -c -f${uboot_wrkdir}/spl/u-boot-spl.bin 这个输出文件名是固定的,u-boot-spl.bin.normal.out,这个文件最终是需要烧录到sd卡或者emmc的第一个分区。 如果之前有烧录过官方的系统到sd卡上面,则只需要将jh7110_gateway_fw_payload.img和u-boot-spl.bin.normal.out两个文件烧录到sd卡的第二个和第一个分区即可,起始地址都为0。可以在虚拟机下使用dd命令烧录。 如果一切顺利的话,此时可以看到如下打印信息
注意看编译的时间,以及opensbi中打印的Platform Name,这个Platform Name跟设备树里面这个属性是一致的。通过这个可以观察固件打包是否有问题
然后可以看到uboot本体的运行信息
到这里,uboot开发的第一步就完成了。后续可以根据需要修改对应的设备树和源码。
|