char *s, *e; uchar tmp[64];
i = getenv_r (\, tmp, sizeof (tmp)); s = (i > 0) ? tmp : NULL;
for (reg = 0; reg < 6; ++reg) {
gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e; } }
devices_init (); /* 获取列表中的设备 */ jumptable_init ();
console_init_r (); /* 完整地初始化控制台设备 */ enable_interrupts (); /* 使能例外处理 */ /* 通过环境变量初始化 */
if ((s = getenv (\)) != NULL) { load_addr = simple_strtoul (s, NULL, 16); }
//以上几个初始化函数有待研究
/* main_loop()总是试图自动启动,循环不断执行 */
for (;;) { main_loop (); /* 主循环函数处理执行用户命令 -- common/main.c */ } /* NOTREACHED - no way out of command loop except booting */ } 以上总体的浏览了u-boot的启动过程,搞的比较乱,以后有空再修改整理一下,有几个地方还有待弄清,还有Stage2中的多个初始化函数,待续。。。
前面大致分析了u-boot启动的两个阶段的大致流程,今天再更详细的分析一下启动过程中涉及的几个用于初始化的子函数。分析不当的地方,希望能得到指正。
1、lowlevel_init(start.S中用于配置内存区控制寄存器,位于board/smdk2410/lowlevel_init.S) start.S中跳转代码:
* before relocating, we have to setup RAM timing * because memory timing is board-dependend, you will * find a lowlevel_init.S in your board directory. */ mov ip, lr bl lowlevel_init /* 位于board/smdk2410/lowlevel_init.S:用于完成芯片存储器的初始化,执行完成后返回*/ mov lr, ip mov pc, lr Lowlevel_init文件代码不是很多,精简一下贴在这里: #define BWSCON 0x48000000
/* BWSCON */
#define DW8 (0x0) #define DW16 (0x1) #define DW32 (0x2) #define WAIT (0x1<<2) #define UBLB (0x1<<3)
#define B1_BWSCON (DW32) /* 定义每个bank的数据总线宽度 */
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB) #define B4_BWSCON (DW16) #define B5_BWSCON (DW16) #define B6_BWSCON (DW32) #define B7_BWSCON (DW32)
/* BANK0CON */
#define B0_Tacs 0x0 /* 0clk */
#define B0_Tcos 0x0 /* 0clk */ #define B0_Tacc 0x7 /* 14clk */ #define B0_Tcoh 0x0 /* 0clk */ #define B0_Tah 0x0 /* 0clk */ #define B0_Tacp 0x0
#define B0_PMC 0x0 /* normal */
/* BANK1CON */
/* 之间省略了多个bank区的配置,类似上面的BANK0CON。具体配置参数见源文件 */ /* BANK7CON */ /* REFRESH parameter */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trp 0x0 /* 2clk */ #define Trc 0x3 /* 7clk */ #define Tchr 0x2 /* 3clk */
#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
/**************************************/
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevel_init lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */ /* reads SMRDATA out of FLASH rather than memory ! */ ldr r0, =SMRDATA /* SMRDATA见下面,BWSCON寄存器的后面紧接着就是0-7个bank的控制寄存器的地址,这里整个数据是8个bank的配置参数和另外4个寄存器的配置参数,具体按照s3c2410的datasheet进行配置 */ ldr r1, _TEXT_BASE sub r0, r0, r1
ldr r1, =BWSCON /* Bus Width Status Controller 从BWSCON寄存器的地址开始写13*4这么长的数据,也就是从SMRDATA标号开始的那些配置好的数据,一并写入 */ add r2, r0, #13*4 0:
ldr r3, [r0], #4 str r3, [r1], #4 cmp r2, r0 bne 0b
/* everything is fine now 上面都配置好了,返回start.S */ mov pc, lr
u-boot启动流程分析
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)