您的位置:首页 > 其它

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接口

表-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分支。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: