移植最原始的uboot和kernel到rk3288开发板正常启动,使用这个方法学习uboot的spl功能,kernel最小化dts后很容易跑通,本章重点学习uboot的spl功能。
目录
[三,uboot spl跑通uart](#三,uboot spl跑通uart)
3,arch/arm/mach-rockchip/rk3288-board-spl.c
一,代码源
kernel代码来自https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.189.tar.xz
uboot代码来自https://ftp.denx.de/pub/u-boot/u-boot-2017.09.tar.bz2
二,打包方式研究
1,简化后的打包相关的文件
rkbin/
├── bin
│ └── rk32
│ ├── rk3288_ddr_400MHz_v1.08.bin
│ └── rk3288_usbplug_v2.56.bin
├── RKBOOT
│ └── RK3288MINIALL.ini
└── tools
└── boot_merger
rockdev/
├── MiniLoaderAll.bin -> ../u-boot/rk3288_loader_v1.08.256.bin
├── parameter.txt
└── uboot.img -> ../u-boot/u-boot.img
tools/
└── linux
└── Linux_Pack_Firmware
└── rockdev
├── afptool
├── Image -> ../../../../rockdev/
├── package-file -> rk3288-package-file
├── rk3288-package-file
└── rkImageMaker
2,bin文件以及打包脚本的说明
(1)打包update.img
打包update.img的脚本rk3288-mkupdate.sh简化后就两条,其他都是铺垫:
./afptool -pack ./ Image/update.img
./rkImageMaker -RK320A Image/MiniLoaderAll.bin Image/update.img update.img -os_type:androidos
afptool是Android固件包工具(Android Firmware Package Tool)的简称,用于创建和解析Rockchip的Android固件包。
功能概述:
将多个镜像文件打包成一个Rockchip的AF(Android Firmware)格式的固件包,通常命名为update.img。
使用场景:
在Rockchip的Android系统开发中,通常需要将多个分区镜像(如bootloader、kernel、system、vendor等)打包成一个固件包,以便通过Rockchip的升级工具(如RKDevTool)进行烧录。
打包固件:
./afptool -pack ./ Image/update.img
其中,<image_dir>是包含多个分区镜像文件的目录,update.img是输出的AF格式固件包
rkImageMaker 是将 boot.img 等镜像与 loader 合并,并添加 IDB 头,生成完整的可烧写固件。
主要功能:
将多个镜像文件(loader、boot、system等)合并成一个固件镜像。
在固件镜像中添加 Rockchip 特定的 IDB 头(ID Block)和校验信息。
命令格式:
./rkImageMaker -RK320A Image/MiniLoaderAll.bin Image/update.img update.img -os_type:androidos
(2)uboot生成loader
uboot使用boot_merger工具将rk3288_ddr_400MHz_v1.08.bin和rk3288_usbplug_v2.56.bin和spl组合成rk3288_loader_v1.08.256.bin文件作为引导程序,下面是从uboot的make.sh抠出来的关键脚本。

boot_merger 是 Rockchip 开发的一个工具,主要功能:
合并多个镜像:将 TPL、SPL、U-Boot、ATF 等合并成单个文件
添加 Rockchip 头部:添加 Rockchip 特定的头部信息
生成 loader:生成可以被 Rockchip BootROM 识别的加载器
三,uboot spl跑通uart
1,Kconfig修改
ARCH_ROCKCHIP关闭CMD_FASTBOOT/FASTBOOT/USB_FUNCTION_FASTBOOT
ROCKCHIP_SPL_RESERVE_IRAM默认值改成0x0 这个是ATF的reserve值
SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR default 0x4000 if ARCH_ROCKCHIP
2.Configs修改
关闭config
CONFIG_SPL_STACK_R
CONFIG_SPL_STACK_R_ADDR
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN
CONFIG_FASTBOOT_FLASH
CONFIG_FASTBOOT_FLASH_MMC_DEV
打开config
CONFIG_DEBUG_UART_BOARD_INIT=y
CONFIG_DEBUG_UART_ANNOUNCE=y
CONFIG_SPL_SERIAL_SUPPORT=y
3,arch/arm/mach-rockchip/rk3288-board-spl.c
增加函数board_debug_uart_init
void board_debug_uart_init(void)
{
//待实现,初始化uart
}
board_init_f函数初始位置增加
debug_uart_init();
printch('b');
printhex8(0x5678);
printascii("feifei test once");
printascii("\n");