微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > u-boot 启动过程 —— 基于S3C2410

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行进入相应的分支,分别是

  1. 从nand启动,代码执行lowlevel_init,主要是清除cpu cache,以及关闭mmu和i-cache,
    并且根据板极硬件配置初始化外部存储器总线和GPIO,最后把代码从nandflash中拷贝到ram中并继续执行。
  2. 从nor启动,与第1种情况相比,仅仅把代码拷贝部分简化,将DATA段从flash中拷贝到ram中,其余相同
  3. 从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 cachesDE>DE>    DE>DE>*/ DE>DE>    DE>DE>mrc p15, 0, r0, c1, c0, 0 DE>DE>    DE>DE>bic r0, r0, #0x00002300DE>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页起。同样,仅粘贴开始部分的代码:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top