关闭

imx51 ROM boot code 启动分析

1292人阅读 评论(0) 收藏 举报

转:http://blog.csdn.net/kickxxx/article/details/7236040

启动模式

mx51支持四种启动模式,这些模式的选择是通过IC package上的焊点来决定的(BOOT_MODE 0/1),在reset后会采样这两个焊点,然后把他们的状态保存到SRC Boot Mode Register(SBMR) 寄存器。焊点连接到地对应logic 0,对于logic 1,freescale推荐使用NVCC_PER3

四种启动模式分别为: internal, reserved, internal boot with fuses 以及通过USB/UART的serial boot

BMOD[1:0] Boot Type
00 internal Boot
01 Reserved
10 internal Boot - ROM Select
11 Serial Downloader

Internal Boot (BMODE == 00)

在这种模式下处理器从internal ROM启动,启动代码执行HW初始化,然后跳转到AP image.

在internal Boot模式下,启动流程是由eFUSE设置或者GPIO管脚来控制的,这两个控制的选择是通过GPIO Boot Select(GPIO_BT_SEL)焊点控制的:

1 如果GPIO_BT_SEL被烧写过,所有的启动选项由eFUSE来控制,boot ROM代码通过IIM module读取eFUSEs

2 如果BPIO_BT_SEL没有被动过,那么启动选项是由SBMR寄存器的设置决定的,一些fuse选项可能在这种mode下被覆盖。覆盖是通过GPIO管脚来控制的,如果是YES,那么选项值就通过读取SBMR register 来获取


Internal Boot - ROM Select (BMODE == 10)

这种模式和Internal boot BOOT_MODE[1:0] == 00 的区别是10模式忽略GPIO覆盖,也就是不管GPIO_BT_SEL设置,启动过程使用eFUSE启动设置。这种模式主要用在量产设备上,不需要GPIO的上拉下拉,以及在产品级设备上由于boot pin值不正确导致serial downloader调用

在这种模式下,启动流程如果发现BT_BLANK没有被烧写过(表示ROM还没有被烧写过),那么直接跳转到serial downloader,如果BT_BLANK被烧写过,则正常的启动流程,并且使用eFUSE设置。

在板子第一次使用时,fuses还没有被烧写,如果使用internal boot模式BMOD==00,此时连接到BT GPIO pads上的值被使用,但是这些值可能并不是系统需要的,ROM code错误的使用了这些值,可能会导致这些pads的electrical/logic损坏。internal boot模式BMOD==10可以解决这个问题,如果BT_BLANK fuse没有被烧写过,启动过程跳转到serial downloader,而下一次BT_BLANK被烧写后ROM code则执行正常的启动流程。


Boot eFUSE 描述

mx51 boot eFUSE是启动流程的配置参数,包括

DIR_BT_DIS 直接external memory启动使能

BT_MEM_CTL[1:0] 启动memory类型控制:可支持WEIM,NAND flash以及扩展设备类型,BT_MEM_TYPE[1:0]定义了这些扩展设备设置

BT_PAGE_SIZE[1:0]: 定义NAND flash的page size,这个设置对应BT_MEM_CTL里面的NAND flash 类型

BT_SPARE_SIZE 定义4KByes page大小NAND flash的spare bytes,需要BT_MEM_CTL设置为NAND flash并且BT_PAGE_SIZE为4KB

BT_BUS_WIDTH[1:0] 定义NAND/NOR总线宽度

BT_MEM_TYPE BT_MEM_CTL定义的是大的memory类型,BT_MEM_TYPE对相应的类型又给出了更细的分类

BT_SRC[1:0] 定义了扩展设备类型的来源: eSDHC 1/2/3/4; I2C 1/2, HS-I2C; CSPI, eCSPI1/2

BT_WEIM 选择WEIM muxed模式

BT_UART_SRC 选择serial downloads使用的UART controller

BT_MLC_SEL SLC/MLC NAND 设备选择;或者eMMC fast boot mode 使能

....


GPIO Boot 覆盖

一些fuse设置可以被GPIO覆盖,当GPIO_BT_SEL被设置为0并且BOOTM[1:0] == 00时,GPIO覆盖生效


Serial Downloader(BMOD[1:0] == 11)

当外部flash device没有写入程序,或者在启动过程中碰到了失败,boot过程会调用serial downloader。

以下情况会调用serial downloader:

1 BMOD[1:0] == 11(serial downloader mode)

2 BMOD[1:0] == 10(internal boot with fuses) 并且eFuse_BT_BLANK=0

3 BMOD[1:0] == 10 (internal boot with fuses) 但是fuses没有正确的设置

4 BMOD[1:0] == 00 或者 10(internal or internal boot with fuses),并且Flash device上没有有效image

5 Security hardware failure

6 运行时异常发生

7 在产品模式下HAB函数返回错误


启动总结

从上面可以看出,在系统进入uboot前,imx51实际上要执行一段内部代码ROM boot code,

1. ROM boot code会读取eFUSE以及boot GPIO来获取启动配置参数,这些配置参数决定了uboot代码的存储位置,存储layout,物理位置等等。

2. 在执行uboot代码前,系统已经初始化好了部分系统时钟,内部ram,flash主机控制器和设备控制器等(至于是ROM code初始化的 还是系统上电缺省初始化好的,就不做深究了)

3. ROM boot code会把uboot最前面的部分读取出来,放在内部ram,并且把指针指向这个内部地址执行uboot的前一部分

4. uboot的前半部分会做基本的初始化,并且把后半部分读入外部ram中(前面的初始化已经设置好了NAND device,外部ram),然后跳转到第二部分uboot的地址执行


因此uboot本身必须分为两个部分,前面部分由ROM code装载到内部RAM,后一部分由uboot前一部分负责装载

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:896943次
    • 积分:9748
    • 等级:
    • 排名:第1785名
    • 原创:16篇
    • 转载:423篇
    • 译文:0篇
    • 评论:127条
    最新评论