bootloader的启动 from rom code to uboot
来源:互联网 发布:海美迪h7二代刷阿里云 编辑:程序博客网 时间:2024/05/17 22:16
030 BOOT ROM
1.Boot简介
GCSOC030包含了16KB boot ROM. CPU 在上电或reset之后,通过boot ROM启动整个系统。系统支持如下三种boot方式:
(1)SPI boot;
(2)SD boot,使用SDIO1接口;
(3)USB boot;
其中SPI/SD boot,可以通过bootstrap的OM1(sd_spi_sel)来进行控制,具体的配置启动方式如表-1所示:
sd_spi_sel(om1)
启动方式
0
SPI boot 使用spimCtrl读取SPI NOR数据
1
SD boot 使用SDIO1作为sd boot接口
表-1
USB boot通过GPIO/ADC按键,选择是否通过这种方式启动系统。当boot ROM检测到AGPIO7被选择,或是ADC Chanel1采样到的数据满足要求,两者中有一个满足条件时,进入USB boot相关的启动流程。
2.Boot 步骤
在SOC上电/复位后,boot ROM中的boot程序主要步骤,按如下顺序开始执行:
(1) 检测AGPIO7是否有选择信号,如果检测到(1->0),进入USB boot启动方式;boot ROM接着对USB Phy&Controller进行初始化并检查USB数据线是否接入,如果接入,初始化USB设备驱动并等待执行注意发送的stage2程序。
(2) 检测ADC Chanel1中采样到的数据,如果满足条件,同样进入USB boot启动,如果不满足条件,进入SD/SPI启动模式检测。
(3) 检查sd_spi_sel寄存器,选择启动方式。
(4) 如果是SPI启动方式,跳转到SPI NOR FLASH起始位置,检查magic num并获取第二阶段代码长度,选择是否拷贝到SRAM中执行第二阶段代码。
(5) 若果是SD启动方式,boot ROM 代码会尝试初始化SDIO1,并从SD卡的第6个block读取第二阶段代码,并放在SRAM中执行。
总体的启动步骤如下图所示:
图 1
2.1 SPI BOOT
在正常系统boot模式下,当rom Boot检测到寄存器中sd_spi_sel的值为0时,系统选择从SPI上boot。
在SPI boot模式下,系统第二阶段代码支持两种运行方式:
1、 在SPI NOR Flash上直接执行第二阶段代码;
2、 将第二阶段代码copy到SRAM中,然后再执行;
boot ROM通过读取SPI NOR上的magic_num来确定第二阶段代码的具体执行方式,
对于SPI BOOT,第二阶段的magic_num保存在SPI NOR Flash的起始16Bytes中,具体定义如下表所示:
addr
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
detail
0xEF
0xBE
0xEF
0xBE
-
-
-
-
addr
0x08
0x09
0x0a
0x0b
0x0c
0x0d
0x0e
0x0f
detail
-
-
-
-
flag
rev
len
len
表 2
其中,0x00~0x03 :必须存储为0xEF,0xBE,0xEF,0xBE;
0x04~0x0b :预留,可以存储任意数据;
0x0c :保存SPI Boot启动的flag;
0x0e~0x0f :保存第二阶段的代码长度。
0xc位置中SPI Boot flag的定义如下表所示:
addr
Bit0
Bit1
Bit2
Bit3
Bit4
Bit5
Bit6
Bit7
detail
rev
flag1
flag2
rev
rev
rev
rev
rev
表 3
rev :预留,未用的bit位
flag1 :1表示开启spimCtrl EAS功能 提高频率 0表示不开启EAS功能
flag2 :1表示将stage2 code拷贝到SRAM执行 0表示直接在SPI NOR执行
*Note:stage2 code中的flag和len可以在生成第二阶段的镜像时插入到第二阶段bin镜像之前,再烧写到SPI NOR Flash上。第二阶段代码会被拷贝到SRAM(32KBytes)中的0x82000020的位置。
SPI BOOT详细的流程如下图所示:
2.2 SD BOOT
在正常系统boot模式下,当rom Boot检测到寄存器中sd_spi_sel的值为1时,系统选择从 插入SDIO1中的SD卡中boot。
用于boot的stage2代码需要被放在SD卡的第6个物理块中,boot ROM将会从该位置开始,先读取stage2 code的magic_num,如果检测正常,boot ROM将会读取一定长度的数据到SRAM中(数据长度<28KBytes),然后boot ROM在跳转到SRAM执行stage2代码。
SD boot的magic_num定义如下表所示:
addr
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
detail
0xAD
0xDE
0xEF
0xBE
-
-
-
-
addr
0x08
0x09
0x0a
0x0b
0x0c
0x0d
0x0e
0x0f
detail
-
-
-
-
len
len
rev
rev
addr
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
detail
-
-
-
-
-
-
-
-
addr
0x18
0x19
0x1a
0x1b
0x1c
0x1d
0x1e
0x1f
detail
-
-
-
-
-
-
-
-
表4
其中,0x00~0x03 :必须为0xAD、0xDE、0xEF、0xBE;
0x04~0x0b :预留,可以写入任意的数据;
0x0c~0x0d :保存第二阶段代码的长度;
0x0e~0x1f :预留。
*Note:SD boot stage2中的magic_num可以在生成第二阶段代码时插入到bin文件的前面。
SD boot详细的boot流程如下图所示:
2.3 USB BOOT
SOC可以通过GPIO/ADC检测按键,来决定是否进入USB BOOT,在USB BOOT模式下,系统将SOC初始化成一个device设备,主机(host)在SOC初始化完成后可以识别到一个USB设备,然后就可以通过程序来将stage2代码load到SRAM中。
在注意load完成数据后,会发送一个数据load完成的cmd,然后device接受到命令后会首先检测magic_num是否正确,正确后会跳转到SRAM中执行stage2代码。USB BOOT使用了USB两种数据传输类型,如下表所示:
传输类型
相关描述
控制传输
用于传输标准的USB请求(PID&VID)和数据传输完成请求
bulk传输
用于回传请求的PID&VID数据以及用户stage2程序
表 5
host和device的数据交互如下图所示:
USB BOOT中使用的magic_num如下表所示:
addr
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
detail
0xAD
0xDE
0xEF
0xBE
-
-
-
-
addr
0x08
0x09
0x0a
0x0b
0x0c
0x0d
0x0e
0x0f
detail
-
-
-
-
-
-
-
-
addr
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
detail
-
-
-
-
-
-
-
-
addr
0x18
0x19
0x1a
0x1b
0x1c
0x1d
0x1e
0x1f
detail
-
-
-
-
-
-
-
-
表 6
其中,0x00~0x03 :必须为0xAD、0xDE、0xEF、0xBE;
0x04~0x0b :预留,可以写入任意的数据;
*Note:USB stage2 magic_num同样在生成镜像时插入,同时需要注意,第二阶段代码的长度应该小于8Kbytes。
USB BOOT详细的处理流程如下图所示:
对于USB BOOT,检查GPIO和ADC的满足条件如下表所示:
检测方式
接口
USB BOOT条件
GPIO
AGPIO7
AGPIO7默认高电平1,检测到为0进入USB BOOT
ADC
chanel1
ADC采样率为200Khz
理想的按键电压默认:3.3v,按下按键理想电压:0v
ADC采样设定为当电压<=3.3*20%,按键有效
533Mhz采样次数为32次,满足>32*75%进入USB BOOT
表 7
当boot ROM检测到满足其中任何一个条件时,系统就会进入USB BOOT分支。
- bootloader的启动 from rom code to uboot
- Android 启动之 Bootloader(uboot)
- android启动 uboot启动 rom制作
- Uboot之一:BootLoader的概念
- Uboot之一:BootLoader的概念
- Uboot之一:BootLoader的概念
- 玩的就是ROM,解锁BootLoader大势所趋!
- bootloader/ uboot
- Uboot学习笔记②---(bootloader的一些共同特性、uboot启动过程、编译环境、地址规划设计)
- imx51 ROM boot code 启动分析
- imx51 ROM boot code 启动分析
- imx51 ROM boot code 启动分析 .
- imx51 ROM boot code 启动分析 .
- imx51 ROM boot code 启动分析 .
- 固件升级 android启动 uboot启动 rom制作
- Bootloader的启动过程
- 启动操作系统的Bootloader
- Bootloader的启动流程
- POJ 题目3461 Oulipo(KMP)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(7):执行,调度和渲染(二)
- dimens
- 查分约束系统
- java算法实践之快速排序
- bootloader的启动 from rom code to uboot
- 5 shell命令之tr
- 用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(8):总结和对以后版本的展望
- 你若离去 在最美的风景里等你
- 关于图片字体化
- 安卓Home键封装监听
- 使用VIEW_MAINTENANCE_CALL创建表维护程序
- Windows 内存管理方法(二)