资源描述:
《u-boot-2011.06启动流程分析》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、此文来源:赵春江老师的CNSD博客,希望帮到更多的人:http://blog.csdn.net/zhaocju-boot支持许多CPU,以及一些常见的开发板。本文以u-boot-2011.06这个最新版本为例,简要介绍一下u-boot在smdk2410上的启动流程。 首先系统是从arch/arm/cpu/arm920t目录下的start.s文件开始执行,并且实际开始执行的代码是从第117行开始:117:start_code:118: /*119: *setthecputoSVC32mode120:
2、*/121: mrs r0,cpsr122: bic r0,r0,#0x1f123: orr r0,r0,#0xd3124: msr cpsr,r0上述代码的含义是设置cpu为SVC32模式,即超级保护模式,用于操作系统使用。 140:#ifdefCONFIG_S3C24X0141: /*turnoffthewatchdog*/142:143:#ifdefined(CONFIG_S3C2400)144:# definepWTCON 0x15300000145:# defineINTM
3、SK 0x14400008 /*Interupt-Controllerbaseaddresses*/146:# defineCLKDIVN 0x14800014 /*clockdivisorregister*/147:#else148:# definepWTCON 0x53000000149:# defineINTMSK 0x4A000008 /*Interupt-Controllerbaseaddresses*/150:# defineINTSUBMSK 0x4A00001C151:#
4、 defineCLKDIVN 0x4C000014 /*clockdivisorregister*/152:#endif153:154: ldr r0,=pWTCON155: movr1,#0x0156: str r1,[r0]157:158: /*159: *maskallIRQsbysettingallbitsintheINTMR-default160: */161: movr1,#0xffffffff162: ldr r0,=INTMSK163: s
5、tr r1,[r0]164:#ifdefined(CONFIG_S3C2410)165: ldr r1,=0x3ff166: ldr r0,=INTSUBMSK167: str r1,[r0]168:#endif169:170: /*FCLK:HCLK:PCLK=1:2:4*/171: /*defaultFCLKis120MHz!*/172: ldr r0,=CLKDIVN173: movr1,#3174: str r1,[r0]175:#endif /
6、*CONFIG_S3C24X0*/该段代码的含义为,先定义几个需要的寄存器,然后关闭开门狗定时器,以及屏蔽所有中断和子中断,最后设置三个时钟频率之间的比值。 181:#ifndefCONFIG_SKIP_LOWLEVEL_INIT182: bl cpu_init_crit183:#endif在第182行中,程序跳转到cpu_init_crit中,它也是在start.s文件中,函数的位置在第328行至第356行,它的作用是设置一些重要的寄存器(如MMU和caches等)以及内存时序。其中在第353行,程序又跳转到
7、了lowlevel_init函数,它是在board/samsung/smdk2410目录下的lowlevel_init.s文件中定义的,这个文件的目的就是为了设置内存的时序。 186:call_board_init_f:187: ldr sp,=(CONFIG_SYS_INIT_SP_ADDR)188: bic sp,sp,#7/*8-bytealignmentforABIcompliance*/189: ldr r0,=0x00000000190: bl board_init_f从cp
8、u_init_crit返回后,来到了调用board_init_f的函数处。首先进行堆栈的设置,然后就跳转到board_init_f函数,其中传递给该函数的参数为0。board_init_f这个函数是在arch/arm/lib目录下的board.c文件内定义的,函数的位置是在第268行至第422行,它的作用是初始化开发