lowlevel_init.S的引入
注:本次分析的u-boot是九鼎官方的u-boot代码
下载地址:链接:http://pan.baidu.com/s/1gfpDZqj 密码:7cqe
继续上一章节的第四小节;
第一次设置完栈之后,跳转到lowlevel_init.S中去,代码如下:
bl lowlevel_init
通过Source Insight找到lowevel_init.S的实际位置在:
uboot/board/samsumg/x210/lowlevel_init.S
1.压栈
lowlevel_init:
push {lr}
接下来还会再次调用函数,所以要先压栈。
2.检查复位状态
ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)
ldr r1, [r0]
bic r1, r1, #0xfff6ffff
cmp r1, #0x10000
beq wakeup_reset_pre
cmp r1, #0x80000
beq wakeup_reset_from_didle
(1)复杂CPU允许多种复位情况。譬如直接冷上电、热启动、睡眠(低功耗)状态下的唤醒等,这些情况都属于复位。所以我们在复位代码中要去检测复位状态,来判断到底是哪种情况。
(2)判断哪种复位的意义在于:冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的复位则不需要再次初始化DDR。
3.IO状态恢复
/* IO Retention release */
ldr r0, =(ELFIN_CLOCK

本文详细解析了U-Boot中的lowlevel_init.S模块,包括检查复位状态、IO状态恢复、关闭看门狗、时钟初始化、DDR初始化及串口初始化等内容,并解释了这些步骤的重要性和相互依赖关系。
&spm=1001.2101.3001.5002&articleId=73603314&d=1&t=3&u=cefe8310db644b7e8bc8f76f08679ce7)
2078

被折叠的 条评论
为什么被折叠?



