我的qq:631223432欢迎交流,转载请注明
第一步:下载最新的2015-10版本并配置
首先在u-boot官网上下载最新的U-boot-2015.10版本,通过命令 sudo tar xvf u-boot-2015.10.tar.bz2 后解压,进入u-boot目录,执行:
make smdk2410_config
出现lib/asm-offsets.c:1: error: bad value (armv4) for -march= switch
这是因为没有指定交叉编译器工具所致,因此输入
sudo gedit Makefile命令
编辑u-boot根目录下的MakeFile:
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
++CROSS_COMPILE=arm-linux- //加入交叉编译工具链的支持
重新make,出现:
Error: selected processor does not support `bx lr'的错误,显然,这是arm-linix-gcc版本过低引起的不能识别bx命令引起的错误,需要安装高版本的编译器.
在友善之臂的官网上下载arm-linux-gcc4.4.3,详细安装arm-linux-gcc4.4.3过程网上教程很多,本文就不介绍怎么安装了.重新输入命令:
make smdk2410_config
make
代码编译没有问题,编译环境设置成功.
第二步: 添加并编辑适合自己开发板的目录文件
1. 在board\samsumg\目录下添加yl2440目录,将smdk2410目录下的所有文件全部拷贝到yl2440目录中.
1.1 修改目录下的makefile:
obj-y := yl2440.o boot_init.o
obj-y += lowlevel_init.o
1.2 修改目录下的Kconfig:
if TARGET_YL2440
config SYS_BOARD
default "yl2440"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME
default "yl2440"
endif
2.在include\configs\目录下添加yl2440.h目录,将smdk2410.h内容全部拷贝到yl2440.h目录下
3.在configs\目录下加入yl2440_deconfig文件
CONFIG_ARM=y
CONFIG_TARGET_YL2440=y
CONFIG_SYS_PROMPT="YL2440 #"
4.进入arch\arm目录
4.1 修改目录下的Kconfig文件:
config TARGET_YL2440
bool "Support yl2440"
select CPU_ARM920T
source "board/samsung/yl2440/Kconfig"
重新执行
make clean
make yl2440_config
make
后编译成功,此时针对本开发板的文件修改添加成功.
第三步: 修改编译适合自己板卡的u-boot-spl.bin(BL1.bin)
前言:为什么需要将原先u-boot-1.1.6版本一个bin拆分成两个不同功能的bin——bl1.bin&bl2.bin
之前u-boot-1.1.6版本前4k映射到ARM S3C2440的steppingstone内,即将NAND Flash的前4K自动映射到CPU的4K IRAM里面,执行CPU的相关初始化和代码搬移到外部SDRAM的工作,假如这些工作相关的代码链接后超出了4K范围外,那么整个代码无法搬移到SDRAM中得到正常执行.
u-boot-2015.10版本通过CONFIG_SPL_BUILD宏来控制MAKE编译产生uboot.bin或uboot-spl.bin.我之前网上查到的资料写的有点不对,并非是通过在代码中加入:
#define CONFIG_SPL_BUILD
来控制的,因为我在定义了CONFIG_SPL_BUILD后MAKE会产生语法错误,正确的方法为,输入命令:
make menuconfig
选择选项
boot images --->
发现并没有Enable SPL的选项,退出menu后编辑uboot根目录下的Kconfig文件,修改如下代码:
menu "Boot images"
-- config SUPPORT_SPL
-- bool
++ config SUPPORT_SPL
++ bool "support spl"
重新make menuconfig后可以看到
boot images --->
[] support spl
[] Enable SPL
[] Enable SDRAM location for SPL stack
三个选项.将头两个选项勾选,保存退出后make在SPL目录下生成u-boot-spl.bin.将头两个选项去掉后make,则在uboot根目录下生成
u-boot.bin.我们看到u-boot-spl.bin即本文之前提到的BL1,大小为2K,u-boot.bin为BL2,大小为196K.
yl2440目标板针对BL1,BL2任务功能的划分
在yl2440.h文件注释掉宏,并添加以下宏:
-- #define CONFIG_S3C2410
-- #define CONFIG_SMDK2410
++ #define CONFIG_S3C2440 //目标板为2440
++ #define CONFIG_YL2440
++ #define CONFIG_SYS_TEXT_BASE 0x30008000 //定义BL2.bin的链接地址为0x30008000
++ #define CONFIG_SPL_TEXT_BASE 0x0 //定义BL21.bin的链接地址为0x0
++ #define CONFIG_SPL_MAX_SIZE 0x1000 //定义BL1的大小最大4K,由S3C2440 CPU决定,超出会报编译错
++ #define CONFIG_SPL_STACK 0x1000 //定义BL1堆栈起始为0x1000
++ #define BL2_MTD_OFFSET 0X20000 //定义BL2在NAND Flash128K偏移,即起始Block为Block1,128K/Block
++ #define BL2_MTD_LENTF 0x100000 //定义BL2在NAND Flash大小占用1M</span>
BL1任务划分:
1. 看门狗,中断,CPU时钟初始化
2. 设置在BL1模式下的SP指针
3. 搬移位于Nand Flash BL2位置的代码到SDRAM 0x30008000处
4. 将PC指针指向0x30008000,即BL2 Start.S程序入口地址
BL2任务划分:
1. 将BL2代码段0x30008000进行动态重定位
2. 做u-boot-1.1.6 _start_arm_boot类似NAND初始化,串口初始化,网卡初始化等工作并接收命令引导Linux系统
下一章将说明如何修改BL1.