zz-u-boot-2014.04三星210A8板示例分析141124b

//zz//####################################################################################

zz-u-boot-2014.04三星210A8板示例分析141124b

zz-write:
@2014-11-24 00:06:03
@2014-11-24 01:16:46
@2014-11-24 01:18:38
@

REF:
tq210-12-u-boot-2014.04-zz141027d.zip

学习笔记TQ210陶海武zz141123a时钟宏.pdf

KeyWord:
u-boot-2014版本(2012开始改动)

// crt0.S 如下 _main 是重点
_main
// board.c
board_init_f()
board_init_r()
main_loop()

/boards.cfg
/mkconfig
/u-boot.map
/config.mk


//zz//####################################################################################
0.
u-boot-2012 u-boot-2014 版本改动说明
之前版本使用 start_armboot() 函数作为C程序入口
从2012 版本开始使用 board_init_f() 函数作为基本初始化;然后 board_init_r()在最后调用了 main_loop()函数


//zz//####################################################################################
1.
汇编程序段及C函数调用顺序流程


// arch/arm/cpu/armv7/start.S
_start
reset
// 这在S5PV210中是空的,但是ti-am335x/3352中有用到
save_boot_params
切换到SVC模式,关中断等

// 去使能 I/D cache; 去使能 MMU
cpu_init_cp15
cpu_init_crit
// board/samsung/smdkv210/lowlevel_init.S
lowlevel_init
clock_init
ddr_init


// arch/arm/lib/crt0.S
// 如下 _main 是重点
_main
// board/samsung/smdkv210/smdkv210.c
copy_bl2_to_ram

// arch/arm/lib/board.c
board_init_f()
for(..init_sequence..) 初始化

// arch/arm/lib/relocate.S
// 2012 之后版本采用的方式(韦东山wds移植mini2440去掉不用)
// 代码重定位,执行域函数即全局变量地址修改..
relocate_code

// arch/arm/lib/board.c
board_init_r()
main_loop()


//zz//####################################################################################
2.
_main
比较关键..2012版本之后,这段代码/函数一直不知道在哪里
查看编译后得到的 u-boot.map 文件,看到这个标号是在 arch/arm/lib/crt0.S 文件中定义的

ENTRY(_main)
ENDPROC(_main)
宏定义,汇编代码中 .global 导出一个函数名/标号,同时定义一个 _main 函数/标号






//zz//####################################################################################
3.
CONFIG_SPL_BUILD 宏决定 copy_bl2_to_ram() 与 board_init_f() 
涉及到 在SPL编译使用到的makefile 中定义的宏 CONFIG_SPL_BUILD


#ifdef CONFIG_SPL_BUILD
bl copy_bl2_to_ram /* 拷贝BL2到DDR */
ldr pc, =CONFIG_SYS_SDRAM_BASE /* 跳转到DDR的起始地址执行BL2 */
#else
bl board_init_f
#endif


在编译 SPL 程序的时候,因为 /SPL/Makefile 文件中有定义 CONFIG_SPL_BUILD := y 
所以编译出来的 SPL/BL1 程序中,调用的是 copy_bl2_to_ram() 函数

而在 u-boot/BL2 程序中, CONFIG_SPL_BUILD 宏未定义,所以编译出来的 u-boot 程序中,调用的是 board_init_f() 函数


//zz//####################################################################################
4.
CONFIG_SKIP_LOWLEVEL_INIT 宏决定是否调用如下代码


#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_cp15
cpu_init_crit
lowlevel_init
clock_init()
ddr_init()
#endif


CONFIG_SKIP_LOWLEVEL_INIT 宏又由 CONFIG_SPL_BUILD 决定是否定义


//zz//####################################################################################
5.
make xxxx_config


参考 /boards.cfg 文件中给出的配置
如下这行,是使用 make smdkv210 来配置的,boards.cfg中如下一行,对应的参数是从 $1 开始的

// $1 $2 $3 $4 $5 $6 $7
Active arm armv7 s5pc1xx samsung smdkv210 smdkv210 ...
//状态 arch cpu soc vendor board Target_config


脚本文件 mkconfig 中各参数的赋值
arch=""
cpu=""
board=""
vendor=""
soc=""
options=""


//zz// 厂商是 samsung
[ "$5" != "-" ] && vendor="$5"
[ "$4" != "-" ] && soc="$4"


//zz// 板子在 make 创建配置文件时候使用 smdkv210_config
BOARD_NAME="${7%_config}"

CONFIG_NAME="${7%_config}"


//zz// 创建软连接,所以make配置编译时候代码一定要放 linux 文件系统才行..
LNPREFIX=${srctree}/arch/${arch}/include/asm/
ln -s ${LNPREFIX}arch-${soc} asm/arch

rm -f asm/proc
ln -s ${LNPREFIX}proc-armv asm/proc


makefile 包含的配置文件 /config.mk


ifdef VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)


//zz// 定义了make时候的一个宏 BOARDDIR ; 由前面说的 $5/$6 组成,是 samsung/smdkv210/
所以对应的 board 源码目录下使用的是
board/samsung/smdkv210/


//zz// cpu 和 soc 的定义
决定了 arch 路径下板子对应使用的源码路径是
arch\arm\cpu\armv7\s5pc1xx


//zz//####################################################################################


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值