单片机
返回首页

【嵌入式】从零开始移植U-boot到mini2440(一)——U-boot编译篇

2022-06-20 来源:eefocus

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


GitHub上下载最新的u-boot

git@github.com:u-boot/u-boot.git

实际上最新的u-boot(好像是从2017年开始),已经删除了对s3c系列的支持,虽然说基于新版本移植更加吃力,但是从一个芯片BSP开发的角度,这样更接近于将U-boot移植到一颗新芯片上,更有实践价值。


从Makefile下手

使用crosscompile

Makefile中有一处地方可以设置gcc,这里我们使用arm公版的cross compile,可以从arm官网下载得到。

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 


跳过gcc版本检查

不知道为什么,Makefile中有一个对gcc版本的检查,我已经用的是最新的arm-gcc,依然不过

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

对于一个新版子来说,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


移植serial 驱动

可以先从老的u-boot里s3c24x0的串口驱动复制过来,先把编译通过了再针对性修改。


在做完以上步骤后,就可以编译出uboot.bin,但是代码大多是复用老的u-boot版本针对smdk2410的代码,所以大概率是跑不起来的,这也是为什么我没有做太多的代码说明。因为框架大体上已经写好了,接下来我打算是在这个代码的基础上,逐步修改,让板子跑起来。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章