uboot启动感悟
arm内部有rom,该rom有代码,上面驻留着系统真正启动的代码,和uboot没有关系。 拿Freescale的imx51为例 片内ROM 36k 片内RAM128k iMX51启动机制如下(在实际开发中不会涉及到该内容写下这些只是让你更好的了解系统的启动过程,系统的启动过程不单单只有uboot这一块在uboot之前还做了很多的工作): imx51在系统重启时,会采样启动模式的GPIO管脚(BOOT_MODE[1:0]),采样所得到的值存储在SBMR寄存器中(System Reset Controller Boot Mode Register)。imx51支持的启动模式包括:内部启动模式(通过启动模式的GPIO管脚判断启动外设)、测试模式、下载模式(通过USB/UART下载代码)、内部启动模式(通过启动模式fuse位判断启动外设)。
imx51在系统重启时,会读取GPIO_BT_SEL的内部fuse位: a)如果GPIO_BT_SEL=1(被烧写过),在芯片内部启动代码会通过读取内部fuse位来判断外设相关性。 b)如果GPIO_BT_SEL=0,imx51会在启动时采样外设相关特性的GPIO管脚,并存储在SBMR寄存器中。芯片内部启动代码会通过读取该寄存器判断外设相关性。所以,芯片内部fuse位与启动相关GPIO管脚是一一对应的。 IMX51内部启动代码 imx51内部有一段ROMcode,在内部启动模式下,系统启动时,会执行这段代码,这段代码会初始化最基本的硬件,然后判断系统的外部存储设备信息(通过读取SBMR寄存器)。然后系统会初始化相应的外设,并将外设中的第一部分代码拷贝到芯片内部RAM中,并跳转到其头地址并执行。 通过这种方式,imx51可以支持从多种外设启动,从而增加启动灵活性,imx51 ROMcode流程如下 我们是按照从SD卡 1) ? 通过采样SBMR寄存器读取fuse位或者采用启动模式的管脚 <——Reset 2)通过BOOT_MODE[1:0]来判断是否是那种启动模式 为了保持稳定性BOOT_MODE[1:0]=10,内部启动模式(通过启动模式fuse位判断启动外设),将外部信息烧写到芯片内部fuse中,这样系统将从内部fuse中读取相关外设信息。 3)因为是从SD卡启动所以 boot memo ctrol SD/MMC/MoviNAND? BT_MEM_CTL = 外设接口扩展存储设备 ‘00’=SD/MMC HDD 4)配置SD/MMC的控制器 eSDHC1 Controller 5)basic config and obtain base addr of boot device 基本的配置和获取启动硬件的基地址 6)执行镜像 讲这些的作用:imx51的Romcode固化在芯片内部,不能修改,以上分析Romcode主要可以帮助大家理解以下几点: 1)imx51最初是如何启动的 2)在bootloader开始执行前,系统处于何种状态,由以上分析可见 a)imx51已经初始化了硬件部分,包括部分时钟,内部总线以及外部存储设备的控制器,以及外部存储设备本身 b)bootloader的头2k已经被拷贝到imx51内部的RAM了,除开1k的MBR头,以及flash文件头,剩下的部分就是可执行代码。由此可知剩下部分已经不能放下整个bootloader了,所以必须把bootloader分成两个部分:XLDR和Eboot本身。 c)可以利用DCD段来初始化某些寄存器,例如AndroidBSP利用它来初始化系统DDR2控制器。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |