S5PV210 | 微处理器启动流程
Posted 大飞歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S5PV210 | 微处理器启动流程相关的知识,希望对你有一定的参考价值。
S5PV210 | 微处理器启动流程
-
S5PV210启动概述
S5PV210支持从多种设备启动,如OneNAND、NAND、MMC等。S5PV210的启动框图如图所示,BL0是指S5PV210微处理器的IROM中固化的启动代码,BL1是指在IRAM自动从外存储器(NAND、SD、USB)中复制的uboot.bin二进制文件的头16KB代码,BL2是指在代码重定向后在内存中执行的UBOOT的完整代码。
三者之间的关系是:BL0将BL1加载到IRAM,然后BL1在IRAM中运行并将BL2加载到SDRAM,BL2加载嵌入式操作系统。BL是BootLoader的简称。
S5PV210上电将从IROM处执行固化的启动代码BL0,它对时钟等初始化、对启动设置进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(地址0xD0020000处,其中0xD002 0000之前的16B存储BL1的校验信息和BL1中的尺寸)中,并对BL1进行校验,校验成功后转入BL1进行执行。BL1执行完成后,开始执行BL2,BL2加载内核,把OS在SDRAM中运行起来。
-
S5PV210的启动顺序
①iROM可以进行初始引导:初始化系统时钟,设备专用控制器和引导设备。
②iROM引导代码可以将引导加载程序加载到SRAM。引导加载程序称为BL1。
然后,iROM在安全启动模式下验证BL1的完整性。
③将执行BL1:BL1将在SRAM上加载剩余的引导加载程序,称为BL2。
然后在安全启动模式下,BL1验证BL2的完整性。
④将执行BL2:BL2初始化DRAM控制器,然后将OS数据加载到SDRAM。
⑤最后,跳转到OS的起始地址。那将为使用系统创造良好的环境。
-
iROM(BL0)的启动顺序
1.禁用看门狗定时器
2.初始化指令缓存
3.初始化堆栈区域(请参见“内存映射”)
4.初始化堆区域。(请参见“内存图”)
5.初始化块设备复制功能。(请参见“设备复制功能”)
6.初始化PLL并设置系统时钟。(请参阅“时钟配置”)
7.将BL1复制到内部SRAM区域(请参见“设备复制功能”)
8.验证BL1的校验和。
如果校验和失败,则iROM将尝试第二次启动。(SD / MMC通道2)
9.检查是否为安全启动模式。
如果安全密钥值是在S5PV210中写入的,则为安全启动模式。
如果是安全启动模式,请验证BL1的完整性。
10.跳转到BL1的起始地址。
-
V210启动流程图
-
第一次启动失败时的iROM第二次启动顺序
-
用于引导代码描述的标题信息数据
-
编写校验和示例代码
for(count=0;count< dataLength;count+=1)
buffer = (*(volatile u8*)(uBlAddr+count));
checkSum = checkSum + buffer;
//-count 变量是unsigned int类型。
//-dataLength 变量是无符号的int类型。 它包含BL1的大小(字节)。
//-buffer 变量是无符号的短类型。 用于从BL1读取1字节数据。
//-checkSum 变量是unsigned int类型。 它包含BL1的总和。
具体的实例代码(为BIN文件添加校验和文件头):
/*******************************************************************
* > File Name: mkv210_image.c
* > Author: fly
* > Mail: xxxxxx@icode.net
* > Create Time: 2021-06-17 4/24 12:03:22 +0800
* > Note: 将USB启动时使用的BIN文件制作得到SD启动的Image
* 计算校验和,添加16字节文件头,校验和写入第8字节处
*================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define ERR_STR strerror(errno)
#define SPL_HEADER_SIZE (16)
#define SPL_HEADER "@S5PV210$$$$****"
#define IMG_SIZE (16*1204)
char *mk_getCheckSumFile(char *binName)
static char checkSumFileName[128] = 0;
snprintf(checkSumFileName, 128, "%s%s", binName, ".sd");
return (char*)checkSumFileName;
long mk_getFileLen(FILE* fp)
static long fileLen = 0;
fseek(fp, 0L, SEEK_END);
fileLen = ftell(fp);
fseek(fp, 0L, SEEK_SET);
return fileLen;
int main(int argc, char* argv[])
FILE* fps, *fpd;
long nbytes, fileLen;
unsigned int checksum, count;
char *BUF = NULL, *pBUF = NULL;
int i;
if(argc != 2)
printf("Usage: %s <bin-file>\\n", argv[0]);exit(EXIT_FAILURE);
/* 打开源BIN文件 */
fps = fopen(argv[1], "rb");
if (fps == NULL)
printf("fopen %s err: %s\\n", argv[1], ERR_STR);
exit(EXIT_FAILURE);
/* 创建目标BIN文件 */
fpd = fopen(mk_getCheckSumFile(argv[1]), "w+b");
if (fpd == NULL)
printf("fopen %s err: %s\\n", mk_getCheckSumFile(argv[1]), ERR_STR);
fclose(fps);exit(EXIT_FAILURE);
/* 获取源文件大小 */
fileLen = mk_getFileLen(fps);
if(fileLen < (IMG_SIZE - SPL_HEADER_SIZE))
count = fileLen;
else
count = IMG_SIZE - SPL_HEADER_SIZE;
BUF = (char *)malloc(IMG_SIZE);/* malloc 16KB BUF */
if (BUF == NULL)
printf("malloc err: %s\\n", ERR_STR);
fclose(fps);fclose(fpd);
exit(EXIT_FAILURE);
memcpy(&BUF[0], SPL_HEADER, SPL_HEADER_SIZE);
nbytes = fread(BUF+SPL_HEADER_SIZE, 1, count, fps);
/* 计算文件检验和 */
pBUF = BUF + SPL_HEADER_SIZE;
for(i = 0, checksum = 0; i< IMG_SIZE - SPL_HEADER_SIZE; i++)
checksum += (0x000000FF) & *pBUF++;
pBUF = BUF + 8;
*((unsigned int *)pBUF) = checksum;
/* 将校验和源文件写入目标文件 */
fwrite(BUF, 1, IMG_SIZE, fpd);
printf("the checksum 0x%08X for %ldbytes, output: %s\\n", \\
checksum, fileLen, mk_getCheckSumFile(argv[1]));
free(BUF);
fclose(fps);
fclose(fpd);
return 0;
编译Makefile文件:
.PHONY: all clean
CC = gcc
SRC = $wildcard *.c
BIN = $patsubst %.c, %, $(SRC)
CFLAGS = -g -Wall
RM = rm -rf
all:$(BIN)
$(BIN):%:%.c
$(CC) -o $@ $^ $(CFALGS)
clean:
$(RM) a.out $(BIN) .*.*.sw? *.sd
ARM处理器启动流程
S3C2440:
从nandflash启动的时候,上电之后,硬件自动将nandflash里bootloader的前4K代码复制到stepping stone(0地址)中,这4K的代码除了负责一些硬件初始化,还负责将bootloader剩下的代码复制到内存0x3000 0000中,然后4K运行完之后跳转到内存中继续运行剩下的bootloader,最后引导操作系统启动。
S3C6410:
s3c6410中零地址是一个映射区域(位于0地址),6410可实现从SDRAM,IROM(包含SD卡启动和nandflash启动)中启动,从什么地方启动,就将其映射到映射区域中。
从nandflash启动的时候,上电之后,首先运行irom中的代码(可以看做是0地址),irom中的代码是硬件厂商固化好的,这些代码主要负责一些硬件的初始化,还负责将bootloader中的前8K代码复制到stepping stone中(第一阶段),在stepping stone中这8K代码运行完之后还将剩余的bootloader复制到内存0x5000 0000中运行(第二阶段),最终引导操作系统启动。
S5PV210:
与6410相似,0地址处也是一个映射区域,从nandflash启动实际是从irom启动。
从nandflash启动的时候,上电之后,首先运行irom中的代码(可以看做是0地址),irom中的代码是硬件厂商固化好的,这些代码主要负责一些硬件的初始化,还负责将bootloader中的第一阶段代码(BL1---16K)复制到stepping stone(96K)中,然后将BL2(一般容量为80k)复制到stepping stone中,此时若stepping stone中还装不下bootloader,则继续将剩余的bootloader复制到内存中运行,最后引导操作系统启动。
以上是关于S5PV210 | 微处理器启动流程的主要内容,如果未能解决你的问题,请参考以下文章