u-boot 启动过程 —— 基于S3C2410
时间:11-10
来源:互联网
点击:
行:
DE> DE> DE>ldr r1, =MPLLCON_val DE> DE> DE> DE>str r1, [r0, #-4] DE> DE> DE> DE>/* MPLLCON */ DE> DE> DE> DE> DE> DE>/* FCLK:HCLK:PCLK = 1:2:4 */ DE> DE> DE> DE>ldr r0, =CLKdivN DE> DE> DE> DE>mov r1, #CLKdivN_val DE> DE> DE> DE>str r1, [r0] DE>
S3C2410的UART0得到初始化,以便于尽早通过UART0打印信息。
此段代码从332行开始,其中涉及到的寄存器读者可参考S3C2410手册293页起:
DE> DE> DE>/* enable uart */ DE> DE> DE> DE>ldr r0, =0x4c00000c /* clkcon */ DE> DE> DE> DE>ldr r1, =0x7fff0 /* all clocks on */ DE> DE> DE> DE>str r1, [r0] DE> DE> DE> DE> DE> DE>/* gpio UART0 init */ DE> DE> DE> DE>ldr r0, =0x56000070 DE> DE> DE> DE>mov r1, #0xaa DE> DE> DE> DE>str r1, [r0] DE> DE> DE> DE> DE> DE>/* init uart */ DE> DE> DE> DE>ldr r0, =0x50000000 DE> DE> DE> DE>mov r1, #0x03 DE> DE> DE> DE>str r1, [r0] DE> DE> DE> DE>ldr r1, =0x245 DE> DE> DE> DE>str r1, [r0, #0x04] DE> DE> DE> DE>mov r1, #0x01 DE> DE> DE> DE>str r1, [r0, #0x08] DE> DE> DE> DE>mov r1, #0x00 DE> DE> DE> DE>str r1, [r0, #0x0c] DE> DE> DE> DE>mov r1, #0x1a DE> DE> DE> DE>str r1, [r0, #0x28] DE>
完成UART0设置之后,根据不同的编译时选项和运行时参数,代码会在360行进入相应的分支,分别是
- 从nand启动,代码执行lowlevel_init,主要是清除cpu cache,以及关闭mmu和i-cache,
并且根据板极硬件配置初始化外部存储器总线和GPIO,最后把代码从nandflash中拷贝到ram中并继续执行。 - 从nor启动,与第1种情况相比,仅仅把代码拷贝部分简化,将DA
TA段从flash中拷贝到ram中,其余相同 - 从ram启动,因为u-boot已经处于配置好的ram中,
所以会跳过所有cache,mmu,sdram,nand和nor相关代码,跳转到done_relocate执行
下面以最复杂的nand启动情况为例分析。首先会跳转到572行执行cpu_init_crit,
通过操作CP15完成flush处理器arm920t的cache和tlb,并关闭mmu和i-cache:
DE>cpu_init_crit: DE> DE> DE> DE>/* DE> DE> DE> DE> * flush v4 I/D caches DE> DE> DE> DE>*/ DE> DE> DE> DE>mov r0, #0 DE> DE> DE> DE>mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ DE> DE> DE> DE>mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ DE> DE> DE> DE> DE> DE>/* DE> DE> DE> DE> * disable MMU stuff and caches DE> DE> DE> DE>*/ DE> DE> DE> DE>mrc p15, 0, r0, c1, c0, 0 DE> DE> DE> DE>bic r0, r0, #0x00002300 DE> DE> DE> DE>@ clear bits 13, 9:8 (--V- --RS) DE> DE> DE> DE>bic r0, r0, #0x00000087 DE> DE> DE> DE>@ clear bits 7, 2:0 (B--- -CAM) DE> DE> DE> DE>orr r0, r0, #0x00000002 DE> DE> DE> DE>@ set bit 2 (A) Align DE> DE> DE> DE>orr r0, r0, #0x00001000 DE> DE> DE> DE>@ set bit 12 (I) I-Cache DE> DE> DE> DE>mcr p15, 0, r0, c1, c0, 0 DE>
然后跳转到board/neo1973/common/lowlevel_init.S文件的139行执行,
进行总线数据宽度、时序、SDRAM控制、GPIO等配置,配置完毕后会返回start.S继续执行。
因为该代码是与板相关,故放在board目录里面。由于代码较多,只粘贴开始部分:
DE> DE> DE>/* memory control configuration */ DE> DE> DE> DE>/* make r0 relative the current location so that it */ DE> DE> DE> DE>/* reads SMRDATA out of FLASH rather than memory ! */ DE> DE> DE> DE>adr r0, SMRDATA DE> DE> DE> DE>ldr r1, =BWSCON /* Bus Width Status Controller */ DE> DE> DE> DE>add r2, r0, #13*4 DE>
完成板级设置后,在cpu/arm920t/start.S的373行判断代码自身的执行位置。如果从stepping stone内执行,
并且u-boot配置为nandboot模式,则跳转到nand_load拷贝代码:
DE> DE> DE>ldr r1, =BWSCON /* Z = CPU booted from NAND */ DE> DE> DE> DE>ldr r1, [r1] DE> DE> DE> DE>tst r1, #6 /* BWSCON[2:1] = OM[1:0] */ DE> DE> DE> DE>teqeq r0, #0 /* Z &= running at address 0 */ DE> DE> DE> DE>beq nand_load DE>
在417行是nand_load代码,首先会跳转到614行执行may_resume
以检测系统是从待机模式唤醒还是上电启动。如果唤醒,则会根据之前保存的现场进行相应处理,
本文不做更多叙述;如果是启动,则会返回nand_load继续执行。在nand_load里初始化s3c2410的nandcontroller,
涉及存储器映射和寄存器NFCONF等,参见S3C2410手册215页起。同样,仅粘贴开始部分的代码:
u-boot启动过程S3C241 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)