bootloader的启动 from rom code to uboot
2015-03-12 16:14
387 查看
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接口 |
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 |
其中,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 |
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 | - | - | - | - | - | - | - | - |
其中,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程序 |
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 | - | - | - | - | - | - | - | - |
其中,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 |
当boot ROM检测到满足其中任何一个条件时,系统就会进入USB BOOT分支。
相关文章推荐
- imx51 ROM boot code 启动分析 .
- 光盘启动 (Boot from CDROM) Part 2- SakiProject
- 光盘启动 (Boot from CDROM) Part 1- SakiProject
- imx51 ROM boot code 启动分析
- imx51 ROM boot code 启动分析
- 光盘启动 (Boot from CDROM) Part 2- SakiProject
- imx51 ROM boot code 启动分析 .
- 光盘启动 (Boot from CDROM) Part 1- SakiProject
- Get Remote Machines Last Boot Time From A List Of Machines And Write To Excel - 如何获得远程主机的启动时间
- Configuring Visual Studio to Debug .NET Framework Source Code【from Shawn Burke's Blog】
- Beginning C# Objects From Concepts to Code
- VBA code from template is linked to doc file. I need a copy
- 《Beginning C# Objects From Concepts to Code》
- Bootloader U-boot启动
- [Interop from managed code to unmanaged code]Platform Invoke
- From Program to Product: Turning Your Code into a Saleable Product
- The right method to compile android SDK from source code
- Ten things to do with IIS(From CodeProject website)
- 《Head First Java》And《Beginning Java Objects: From Concepts To Code, Second Edition》
- Strange patent filed in China: Method to boot Linux OS from mobile harddisk