(1)uboot编译记录
进入u-boot目录,先清除之前编译出的内容,保证目录纯净
make distclean
然后编译
./make.sh CROSS_COMPILE=/home/teng/my3506sdk/rk3506/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf- alientek_rk3506 --spl-new
根据传入的参数alientek_rk3506,会去找u-boot/configs路径下的alientek_rk3506_defconfig这个文件。对比了正点原子的alientek_rk3506_defconfig这个文件,和同路径下瑞芯微自身提供的rk3506_defconfig进行文本差异对比,发现本质上就两处差异
1.uboot用到的设备树换成了alientek-rk3506,uboot做为微型操作系统也有自己的设备树,设备树里只配置了最核心需要用到的功能。
2.注释掉了AB分区功能,右侧瑞芯微自带的是打开的继续跟踪第1点差异,进到u-boot/arch/arm/dts/路径下,对比正点原子写的设备树alientek-rk3506.dts和瑞芯微官方写的设备树rk3506-evb.dts的差异
发现就改了个名,说明设备树根本没啥差异,正点原子给的sdk在uboot里面就只关闭了AB分区功能。
然后就在u-boot目录里面生成了一个rk3506_spl_loader_v1.06.111.bin文件和uboot.img,这就是最终的结果
rk3506_spl_loader_v1.06.111.bin分析:
使用
./rkbin/tools/boot_merger unpack -i ./u-boot/rk3506_spl_loader_v1.06.111.bin -o ./unpack_test
指令解包
log:
********boot_merger ver 1.35********
input loader is ./u-boot/rk3506_spl_loader_v1.06.111.bin
output directory is ./unpack_test
extracting entry=471,file=UsbHead.bin
extracting entry=471,file=rk3506b_ddr_750MHz_.bin
extracting entry=472,file=rk3506_usbplug_v1.bin
extracting entry=loader,file=FlashHead.bin
extracting entry=loader,file=FlashData.bin
extracting entry=loader,file=FlashBoot.bin
Info:Unpack loader ok.
ls ./unpack_test/
FlashBoot.bin FlashHead.bin rk3506_usbplug_v1.bin
FlashData.bin rk3506b_ddr_750MHz_.bin UsbHead.bin
rk3506_spl_loader_v1.06.111.bin里面包含了上面的6个文件
其中:
- rk3506_usbplug_v1.bin和UsbHead.bin,顾名思义是用来处理usb的,接收我们用瑞芯微开发者工具usb通信发来文件的,只在ddr内存中运行。
- FlashHead.bin:(IDB 头 / 芯片通行证)内容:包含固定的 RKNS(或 RCVN)魔术字。
- rk3506b_ddr_750MHz_.bin和FlashData.bin不同名但是同一个文件,内容:负责在 BootROM 阶段接管 CPU,初始化开发板外部 DDR3/DDR4/LPDDR 内存颗粒的机器码。也就是用来点亮内存ddr的,由瑞芯微提供的不开源的。
- FlashBoot.bin:也就是二级引导spl,负责加载uboot的
现在来分析使用瑞芯微开发工具烧录这个rk3506_spl_loader_v1.06.111.bin会是什么样的场景
地址:0x00000000,文件:rk3506_spl_loader_v1.06.111.bin
执行,瑞芯微开发工具会把rk3506_spl_loader_v1.06.111.bin拆成上述的6个文件,其中rk3506_usbplug_v1.bin、UsbHead.bin、rk3506b_ddr_750MHz_.bin会加载到ddr中运行,也就是初始化了usb可以用usb接收后续的文件。FlashHead.bin、FlashData.bin、FlashBoot.bin这三个文件会有下面的操作,
制作 4 个防伪头:工具把 FlashHead.bin 复制 4 份,排成一排。
拼接核心驱动:紧接着在这 4 个头的屁股后面,把 FlashData.bin(DDR驱动)拼接上去。
拼接搬运工:再在 FlashData.bin 的屁股后面,把 FlashBoot.bin拼接上去。
填充对齐:最后用 0x00 或 0xFF 把整个尾部补齐到扇区对齐。
然后把按照上面规则缝合好的二进制大块写入到eMMC的0x40 扇区
rk3506_idblock_v1.06.111.img分析:
就是上面FlashHead.bin、FlashData.bin、FlashBoot.bin这三个按照上面提到的规则打包出来的文件
uboot.img
这个就是需要烧录进去的uboot镜像
其他分析:
编译过程用到的配置文件,/rkbin/RKBOOT/RK3506BMINIALL.ini,可以看到明确指出FlashData=bin/rk35/rk3506b_ddr_750MHz_v1.06.bin
FlashBoot=bin/rk35/rk3506_spl_v1.11.bin:
[CHIP_NAME] NAME=RK350F [VERSION] MAJOR=1 MINOR=1 [CODE471_OPTION] NUM=1 Path1=bin/rk35/rk3506b_ddr_750MHz_v1.06.bin [CODE472_OPTION] NUM=1 Path1=bin/rk35/rk3506_usbplug_v1.02.bin [LOADER_OPTION] NUM=2 LOADER1=FlashData LOADER2=FlashBoot FlashData=bin/rk35/rk3506b_ddr_750MHz_v1.06.bin FlashBoot=bin/rk35/rk3506_spl_v1.11.bin [LOADER2_PARAM] LOAD_ADDR=0x3f00000 FLAG=0x0 [OUTPUT] PATH=rk3506_spl_loader_v1.06.111.bin IDB_PATH=rk3506_idblock_v1.06.111.img [SYSTEM] NEWIDB=true [FLAG] 471_RC4_OFF=true RC4_OFF=true CREATE_IDB=true