typedef struct cmd_tbl_s cmd_tbl_t;
//定义section属性的结构体。 编译时会单独生成一个名为.u_boot_cmd的section段。 #define Struct_Section __attribute__ ((unused,section (\
//这个宏定义一个命令结构体变量。并用name,maxargs,rep,cmd,usage,help初始化各个域。
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \\
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage , help}
21
4 UBOOT启动
4.1 启动第一阶段 3.1.1填充启动配置字
.text
\\
#define _HRCW_TABLE_ENTRY(w)
.fill 8,1,(((w)>>24)&0xff); .fill 8,1,(((w)>>16)&0xff); .fill 8,1,(((w)>> 8)&0xff); .fill 8,1,(((w) )&0xff)
\\ \\ \\
_HRCW_TABLE_ENTRY(CONFIG_SYS_HRCW_LOW) _HRCW_TABLE_ENTRY(CONFIG_SYS_HRCW_HIGH)
在.text开头位置填充启动配置字,执行该句后,TEXT_BASE开头的启动配置字分布情况如下:
22
该图只写出启动配置字的有效部分,例如0x00-0x07填充的是RCWL[0:7],只是取其有效的部分是低八位。启动配置字每个字节重复8次。
3.1.2 填充头部信息及全部函数 头部信息:
.long .globl
0x27051956 version_string
/* U-Boot Magic Number */
version_string:
.ascii U_BOOT_VERSION
.ascii \.ascii \
全局函数: enable_addr_trans disable_addr_trans
23
get_pvr ppcDWstore ppcDWload
################################
紧接着启动配置字的0x64偏移位置,填充0x27051956以及uboot版本,时间和日期等字符串,以及全局函数。但是总容量最好不要超过0x100。
3.1.3. 将_start定位到0x100位置并重新设置IMMR . = EXC_OFF_SYS_RESET /*定位到0x100*/
.globl
_start
_start: /* time t 0 */ li r21, BOOTFLAG_COLD /* Normal Power-On: Boot from FLASH*/
nop b
boot_cold
. = EXC_OFF_SYS_RESET + 0x10
.globl
_start_warm
_start_warm: li r21, BOOTFLAG_WARM /* Software reboot */ b
boot_warm
boot_cold: /* time t 3 */
24
lis r4, CONFIG_DEFAULT_IMMR@h
nop
boot_warm: /* time t 5 */ mfmsr
r5
/* save msr contents
*/
/* 83xx manuals prescribe a specific sequence for updating IMMRBAR. */ bl 1f
上面几步初始化了几个寄存器: R21 = 0x02 R4 = 0xff400000
R5= MSR
#############更新IMMR到0xe000_0000############################
1: mflr r7 //r7=lr
lis r3, CONFIG_SYS_IMMR@h
ori r3, r3, CONFIG_SYS_IMMR@l //r3= 0xe000000
lwz r6, IMMRBAR(r4) //r6=0xff400000
isync
stw r3, IMMRBAR(r4)
//更新IMMR寄存器值为0xe000,0000
lwz r6, 0(r7)
/* Arbitrary external load */
//r6=lr
25