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,可以通过bootstrapOM1(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卡的第6block读取第二阶段代码,并放在SRAM中执行。

总体的启动步骤如下图所示:

 

 

 

 

 

图 1

 

2.1 SPI BOOT

在正常系统boot模式下,当rom Boot检测到寄存器中sd_spi_sel的值为0时,系统选择从SPIboot

SPI boot模式下,系统第二阶段代码支持两种运行方式:

1、 在SPI NOR Flash上直接执行第二阶段代码;

2、 将第二阶段代码copySRAM中,然后再执行;

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 :必须存储为0xEF0xBE0xEF0xBE

      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执行

 

*Notestage2 code中的flaglen可以在生成第二阶段的镜像时插入到第二阶段bin镜像之前,再烧写到SPI NOR Flash上。第二阶段代码会被拷贝到SRAM32KBytes)中的0x82000020的位置。

SPI BOOT详细的流程如下图所示:

 

 



2.2 SD BOOT

在正常系统boot模式下,当rom Boot检测到寄存器中sd_spi_sel的值为1时,系统选择从 插入SDIO1中的SD卡中boot

用于bootstage2代码需要被放在SD卡的第6个物理块中,boot ROM将会从该位置开始,先读取stage2 codemagic_num,如果检测正常,boot ROM将会读取一定长度的数据到SRAM中(数据长度<28KBytes),然后boot ROM在跳转到SRAM执行stage2代码。

SD bootmagic_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 :必须为0xAD0xDE0xEF0xBE

      0x04~0x0b :预留,可以写入任意的数据;

      0x0c~0x0d :保存第二阶段代码的长度;

      0x0e~0x1f :预留。

*NoteSD 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代码loadSRAM中。

在注意load完成数据后,会发送一个数据load完成的cmd,然后device接受到命令后会首先检测magic_num是否正确,正确后会跳转到SRAM中执行stage2代码。USB BOOT使用了USB两种数据传输类型,如下表所示:

 

传输类型

相关描述

控制传输

用于传输标准的USB请求(PID&VID)和数据传输完成请求

bulk传输

用于回传请求的PID&VID数据以及用户stage2程序

 

表 5

hostdevice的数据交互如下图所示:

 

 

 

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 :必须为0xAD0xDE0xEF0xBE

      0x04~0x0b :预留,可以写入任意的数据;

*Note:USB stage2 magic_num同样在生成镜像时插入,同时需要注意,第二阶段代码的长度应该小于8Kbytes

USB BOOT详细的处理流程如下图所示:

 


 

对于USB BOOT,检查GPIOADC的满足条件如下表所示:

 

检测方式

接口

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分支。

0 0
原创粉丝点击