uboot移植之启动过程--汇编过程start.s
uboot移植之启动过程--汇编过程start.s
说明:本文基于uboot-1.16,代码来源其中,代码版权归原作者所有。 代码版权:Copyright (C) 2001 - 2011 by Wolfgang Denk,DENX Software Engineering. ???????????????? Copyright (C) 2003 - 2011 by Detlev Zundel,DENX Software Engineering. ???????????????? Copyright (C) 2003 - 2011 by contributing authors 出处:http://blog.csdn.net/hail100 ???????????????? uboot启动大致分2步: 第一步主要是完成关wacthdog、mmu,系统时钟的初始化,mem初始化,最后是uboot代码复制到RAM中,跳到c语言函数,这阶段主要用汇编在start.S,lowlevel_init.S中完成。第二步完成复杂设备的初始化,开启命令行,其主要由c语言完成。本文介绍smdk2410的start.S。 正文:?????????????? smdk2410使用arm920T的内核,可以到arm官网上下载用户手册。http://infocenter.arm.com/help/index.jsp 。本文将结合用户手册和uboot代码介绍uboot启动第一阶段。主要代码在uboot-1.1.6/cpu/arm920t/start.S,注意是(.S)这文件在编译时要先经过预处理、有头文件的包含、宏定义的替代,(.s)不会预处理。 ??/* ?*?? arm 都是通过跳转向量完成启动、中断 /* ?*/ @ 重启从这开始 reset:???????????????????????????????? ?? ?/* ?? ? * set the cpu to SVC32 mode ?? ? */ @ uboot需要在管理模式中执行,msr和mrs 都是伪指令 @ 并禁止fiq 和irq ?? ?bic?? ?? r0,r0,#0x1f ?? ?orr?? ?? r0,#0xd3 ?? ?msr?? ?cpsr,r0 @ 关watchdog #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) ?? ?ldr??????? r0,=pWTCON ?? ?mov???? r1,#0x0 ?? ?str??????? r1,[r0] @ 关中断 ?? ?/* ?? ? * mask all IRQs by setting all bits in the INTMR - default ?? ? */ ?? ?mov?? ?r1,? #0xffffffff ?? ?ldr?? ??? r0,? =INTMSK ?? ?str?? ??? r1,? [r0] # if defined(CONFIG_S3C2410) ?? ?ldr?? ?? r1,? =0x3ff ?? ?ldr?? ?? r0,? =INTSUBMSK ?? ?str?? ??? r1,? [r0] # endif @ 设置时钟,设置其分频 @ 时钟的配置是很重要的,将对以后的其他配置产生影响 @ 因此要为后面的配置考虑好时序,尽量做到容易修改,用宏定义 @ 看好各个时钟所控制的设备,知道其频率 ?? ?/* default FCLK is 120 MHz ! */ ?? ?ldr?? ??? r0,? =CLKDIVN ?? ?mov?? ?r1,? #3 ?? ?str?? ??? r1,? [r0] #endif?? ?/* CONFIG_S3C2400 || CONFIG_S3C2410 */ @ cpu初始化, 后面分析 ?? ?/* ?? ? * we do sys-critical inits only at reboot, ?? ? * not when booting from ram! ?? ? */ #ifndef CONFIG_SKIP_LOWLEVEL_INIT ?? ?bl?? ?? cpu_init_crit #endif @ 判断uboot是不是在RAM中启动 #ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate:?? ??? ??? ??? ?/* relocate U-Boot to RAM?? ???? */ ?? ?adr?? r0,_start?? ??? ?/* r0 <- current position of code?? */ ?? ?ldr?? ?r1,? _TEXT_BASE?? ??? ?/* test if we run from flash or RAM */ ?? ?cmp r0,? r1????????????????? /* don't reloc during debug???????? */ ?? ?beq? stack_setup @ 可以在前面找到_armboot_start,_bss_start的定义 @ __bss_start 在u-boot.lds 里 @ 这是从nor flash启动时, 完成uboot到ram的复制 @nand flash 的复制要复杂的多,需要控制nand分块复制 ?? ?ldr?? ?r3,_bss_start ?? ?sub?? r2,r3,r2?? ??? ?/* r2 <- size of armboot??????????? */ ?? ?add?? r2,r2?? ??? ?/* r2 <- source end address???????? */ copy_loop: ?? ?ldmia?? ?r0!,{r3-r10}?? ??? ?/* copy from source address [r0]??? */ ?? ?stmia?? ?r1!,{r3-r10}?? ??? ?/* copy to?? target address [r1]??? */ ?? ?cmp?? ? ? r0,r2?? ??? ??? ?/* until source end addreee [r2]??? */ ?? ?ble?? ?copy_loop #endif?? ?/* CONFIG_SKIP_RELOCATE_UBOOT */ @ 设置堆栈指针 ?? ?/* Set up the stack?? ??? ??? ??? ??? ??? ???? */ stack_setup: ?? ?ldr?? ?? r0,_TEXT_BASE?? ??? ?/* upper 128 KiB: relocated uboot?? */ ?? ?sub?? ?r0,#CFG_MALLOC_LEN?? ?/* malloc area????????????????????? */ ?? ?sub?? ?r0,#CFG_GBL_DATA_SIZE /* bdinfo??????????????????????? */ #ifdef CONFIG_USE_IRQ ?? ?sub?? ?r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) #endif ?? ?sub?? ?sp,#12?? ??? ?/* leave 3 words for abort-stack??? */ @ 清零bss区 clear_bss: ?? ?ldr?? ???? r0,_bss_start?? ??? ?/* find start of bss segment??????? */ ?? ?ldr?? ???? r1,_bss_end?? ??? ?/* stop here??????????????????????? */ ?? ?mov ?? ?r2,#0x00000000?? ??? ?/* clear??????????????????????????? */ clbss_l: ????? str?? ?r2,[r0]?? ??? ?/* clear loop...??????????????????? */ ?? ?add?? ?r0,#4?? ?cmp?? ?r0,r1 ?? ?ble?? ?clbss_l @ 从这开始跳到c语言入口 ?? ?ldr?? ?pc,_start_armboot _start_armboot:?? ?.word start_armboot ==================================================================================================================================== cache和mmu的操作都是在协处理器中完成的,协处理器 p15的操作可以看arm920t用户手册。 cpu_init_crit: @ 刷新cache @ 跳到?lowlevel_init.S中,完成RAM时序配置 ??? bl?? ?lowlevel_init ==================================================================================================================================== 在u-boot-1.1.6/board/smdk2410/lowlevel_init.S中完成RAM时序的配置,这需要看系统频率和所用RAM工作时序,来配置smdk2410的RAM控制器。 _TEXT_BASE: @对于sdram的控制,主要是设置其控制器。其中有时序的配置, @需要看ram的手册查询,要配置好系统时钟,计算出是多个ram控制器时钟 @还有就是看soc手册讲解的控制器配置流程 ??? /* memory control configuration */ ==================================================================================================================================== start.S最后中断的入口,中断的宏完成现场保存,跳到中断处理函数。do_xxx 都在 interrupt.c中处理。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 【Oracle 】截取字符函数:SUBSTR()与检索字符位置函数:IN
- c – 在`abcd`和`abc`的情况下,`std :: equal`是否取消引用
- reactjs – 由于React SPA中的Hasbangs,无法访问Refresh页面
- ajax提交后台获取是乱码解决方法
- C#创建安全的栈(Stack)存储结构
- React Native iOS环境搭建
- c# – 如果存在某个属性,则加载程序集
- c# – 是否在.NET中广泛使用DAO模式?
- 依赖注入 – 在Castle Windsor上携带CreationContext.Addit
- Ruby on Rails || Jquery和JavaScript库不起作用