U-boot版本:2020/5/2
编译环境:Ubuntu 16.04
arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1)
运行环境:mini2440(s3c2440,arm920t)
代码仓库:git@github.com:JingyeLi/u-boot_2440.git
commit hash:45516b370859b022b9bf2c9fb87318b1fa2d34a3
git@github.com:u-boot/u-boot.git
实际上最新的u-boot(好像是从2017年开始),已经删除了对s3c系列的支持,虽然说基于新版本移植更加吃力,但是从一个芯片BSP开发的角度,这样更接近于将U-boot移植到一颗新芯片上,更有实践价值。
diff --git a/Makefile b/Makefile
index 6bb9cf5..ceaad9a 100644
--- a/Makefile
+++ b/Makefile
@@ -259,8 +259,10 @@ export HOSTARCH HOSTOS
#########################################################################
# set default to nothing for native builds
-ifeq ($(HOSTARCH),$(ARCH))
-CROSS_COMPILE ?=
+$(warning "HOSTARCH $(HOSTARCH), ARCH $(ARCH)")
+ifneq ($(HOSTARCH),$(ARCH))
+CROSS_COMPILE ?= arm-none-eabi-
+$(warning "CROSS_COMPILE $(CROSS_COMPILE)")
endif
diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index f256031..0be83d2 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -63,11 +63,11 @@ archprepare: checkgcc6
endif
checkgcc6:
- @if test "$(call cc-name)" = "gcc" -a \
- "$(call cc-version)" -lt "0600"; then \
- echo '*** Your GCC is older than 6.0 and is not supported'; \
- false; \
- fi
+# @if test "$(call cc-name)" = "gcc" -a \
+# "$(call cc-version)" -lt "0600"; then \
+# echo '*** Your GCC is older than 6.0 and is not supported'; \
+# false; \
+# fi
对于一个新版子来说,U-boot需要我们提供和芯片或者开发板相关的底层代码,这些代码一般就把它称为BSP。
芯片Boot up的代码(arch/arm/cpu/arm920t)(arch/arm/include/asm/arch-s3c24x0/)
这部分是U-boot最开始load在SRAM里面的,包括一些寄存器,中断开关,看门狗等芯片最基本的设置,以及把真正把U-boot搬运到内存中的实现。
开发板支持包(board/samsung/mini2440/)
这部分涉及到开发板上除了Soc之外的硬件支持代码,是一些外设的配置,包括设置板载RAM。
设备树(如果CONFIG_OF_CONTROL=n可以不需要,可参考doc/README.fdt-control)
阐述SOC的外设配置及对应寄存器(arch/arm/dts/s3c2440.dts)
在U-boot编译前,会读取输出目录中的”.config”文件,类似于Linux kernel,同时也有make_menuconfig。但是这样子调整参数或者做裁剪的时候不方便,于是又提供了可以针对某个具体硬件的configuration文件。
可以看到在Makefile中相关的编译项:
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
跳转到scripts/kconfig下的Makefile:
%_defconfig: $(obj)/conf
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
# Added for U-Boot (backward compatibility)
%_config: %_defconfig
@:
所以我们可以在代码目录下configs里面创建自己的configuration文件。
这里我的策略是,找一个最类似的SOC进行参考,所有的选项能不开就不开,第一步的目标是先让U-boot可以跑起来并通过串口打印。
在arch/arm/arm920t里面翻了一下,选择了imx,参考它的imx6ul_isiot_nand_defconfig。
这里我提供一些必要的配置,及说明。(注意:有些属于自定义宏,需要同时在Kconfig里面增加这些选项,否则不会自动写入.config)
#在初始化的很多地方都用到,arm同时提供了一个common的lib,所以这个宏很重要
CONFIG_ARM=y
#某些driver会用到
CONFIG_CPU_ARM920T=y
#在arm920t的bringup代码中S3C24x0区别的部分
CONFIG_S3C24X0=y
#S3C2440与S3C24x0区别的部分(时钟等)
CONFIG_S3C2440=y
#S3C2440的GPIO驱动部分暂时可以不用
CONFIG_S3C2440_GPIO=n
#定义target,虽然代码里没有对mini2440特殊初始化的地方,但不定义的话,default target会使编译出错
CONFIG_TARGET_MINI2440=y
#u-boot relocate的TEXT BASE
CONFIG_SYS_TEXT_BASE=0x000
#这里的env指的是U-boot引导前未进入系统时的env,具体作用还未深究
CONFIG_ENV_SIZE=0x10000
CONFIG_ENV_OFFSET=0x3FC000
CONFIG_ENV_SECT_SIZE=0x4000
#DRAM BANK数量,应根据板子上的实际情况而定
CONFIG_NR_DRAM_BANKS=1
#这个MALLOC POOL size指的是在relocate前用于初始化的malloc pool size
CONFIG_SYS_MALLOC_F=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
#U-boot SPL,可以不适用
CONFIG_SPL=n
CONFIG_SPL_BUILD=n
#IDENT字符串,照抄的……
CONFIG_IDENT_STRING="for MINI2440"
#暂时还没研究
CONFIG_SILENT_CONSOLE=y
#当为y的时候会include s3c2440的pin脚,相当于一个mutex
CONFIG_CONSOLE_MUX=y
#console 前缀
CONFIG_SYS_PROMPT="MINI2440 # "
#定义errno具体的error string
CONFIG_ERRNO_STR=y
#现在的u-boot引入Linux类似的device tree,mini2440我们暂时可以不需要
CONFIG_OF_CONTROL=n
#一些板子特定的设定,mini2440似乎并不要
CONFIG_OF_BOARD_SETUP=n
可以先从老的u-boot里s3c24x0的串口驱动复制过来,先把编译通过了再针对性修改。
在做完以上步骤后,就可以编译出uboot.bin,但是代码大多是复用老的u-boot版本针对smdk2410的代码,所以大概率是跑不起来的,这也是为什么我没有做太多的代码说明。因为框架大体上已经写好了,接下来我打算是在这个代码的基础上,逐步修改,让板子跑起来。