申明
本着学习交流的原则, 将个人移植u-boot的过程做一个记录. 文章参考了csdn blog里面的很多内容, 有的已经记不得出处了, 只好把当时的摘要直接贴出来. 如果冒犯, 还请见谅. 如有侵权, 请与我邮件联系. 谢谢!
添加一块新板子的支持
在编译uboot代码时, 我需要做的第一件事情就是配置uboot. 命令格式如下
如果你直接敲上面这个命令, 会得到下面的错误:
make: *** No rule to make target `xxxx_config'. Stop.
Why: 因为目前的代码中没有对xxxx这块板子的支持. 下面就看看如何才能支持一块新板子.
boards.cfg
首先, 你得修改boards.cfg,添加你自己的板子.
(下面的内容是分析2013.10的代码得到的, 如果你已经是master了, 并且发现你的代码跟下面的描述不符, 那么直接读读boards.cfg和mkconfig的源代码吧)
在boards.cfg中增加一行
Active arm armv7 s5pc1xx samsung tiny210 tiny210
接下来, 当你敲入如下命令时:
make tiny210_config
就会得到这样的结果:
Configuring for tiny210 board...
是的, 这样表示配置成功了!
Following is the define in boards.cfg
Status |
Arch |
CPU:SPLCPU |
SoC |
Vendor |
Board name |
Target |
Options |
Maintainers |
$1 |
$2 |
$3 |
$4 |
$5 |
$6 |
$7 |
$8 |
|
Note:
$7 : BOARD_NAME="${7%_config}" <$7=samsung, then BOARD_NAME=samsung; $7=samsung_config, then BOARD_NAME=samsung>
$1 : Active
$2 : arch="$2"
$3 : cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`
spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`
$4 : [ "$4" != "-" ] && soc="$4"
$5 : [ "$5" != "-" ] && vendor="$5"
$6 : [ "$6" != "-" ], then board="$6"
else, board=${BOARD_NAME}
$8 : [ "$8" != "-" ], then CONFIG_NAME="${8%:*}"
else, CONFIG_NAME="${7%_config}"
BOARD_NAME: Just name of the board, no affect to the code
echo "Configuring for ${BOARD_NAME} board..."
CONFIG_NAME:
Must create a file "include/configs/${CONFIG_NAME}.h", code will include this file
arch : ln -s ../arch/${arch}/include/asm include/asm
LNPREFIX=arch/${arch}/include/asm/
soc :
if [ -z "${soc}" ] ; ln -s ${LNPREFIX}arch-${cpu} include/asm/arch
else ln -s ${LNPREFIX}arch-${soc} include/asm/arch
cpu :
vendor :
Must create a floder "BOARDDIR", board related files will be put under it
if [ -z "${vendor}" ] ; BOARDDIR=${board}
else BOARDDIR=${vendor}/${board}
include/configs/${CONFIG_NAME}.h
配置成功之后, 还是无法编译的, 因为我们还得自己创建一些文件.
第一个要创建的就是板子的配置文件${CONFIG_NAME}.h
直接touch创建它吧, 后面再来编辑
include/configs/tiny210.h
BOARDDIR
有了配置文件之后, 我们还需要增加板子相关的汇编文件和C文件, 用来初始化板子等.
直接mkdir创建, 然后加入一些必要的文件.
- board/samsung/tiny210/
- Makefile: 用于编译该目录下的代码
- lowlevel_init.S: 汇编, 初始化CPU的时钟, 串口等必要资源. 这个里面的代码一般是基于相对地址写的, 这样编译出来的镜像放在任何文件都能运行
- mem_setup.S: 汇编, 初始化外部RAM等, 为后面的搬移动作做准备.
- tiny210.c: C, 初始化板子相关外设. C里面的函数调用都是基于绝对地址的, 在编译阶段, 就已经固定了哪个函数放在哪个位置, 要调用这个函数就要跑到对应的地址去. 这个文件里面的代码是在u-boot被搬移之后运行的.