首页 > 其他分享 >S5PV210 | 微处理器启动流程

S5PV210 | 微处理器启动流程

时间:2023-05-11 19:56:16浏览次数:36  
标签:启动 S5PV210 流程 BL1 校验 微处理器 BUF SIZE

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中运行起来。

img
  • 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启动流程图

img
  • 第一次启动失败时的iROM第二次启动顺序

img
  • 用于引导代码描述的标题信息数据

  • 编写校验和示例代码

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: [email protected]
 *   > 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

标签:启动,S5PV210,流程,BL1,校验,微处理器,BUF,SIZE
From: https://www.cnblogs.com/feige1314/p/17392051.html

相关文章

  • 若依vue导入流程
     下载链接若依官方找配置后端1.下载解压vue源码2.配置maven,如有跳过3.导入idea4.修改数据库配置文件5.部署redis和mysql6.导入数据库7.启动后端springboot测试http://localhost:8080/captchaImage配置前端1.安装nodejs2.在idea的终端执行cdruoyi-uinpminstall--registry=h......
  • APIView执行流程(源码分析)、Request对象源码分析
    目录一、APIView执行流程——源码分析(难,了解)1.1基于APIView+JsonResponse编写接口1.2基于APIView+Response写接口1.3APIView的执行流程二、Request对象源码分析(难,了解)一、APIView执行流程——源码分析(难,了解)1.1基于APIView+JsonResponse编写接口#原来基于django原生的Vi......
  • jenkins的安装和配置(flask结合jenkins半自动化部署流程)
    jenkins在虚拟机中安装1.1背景介绍Jenkins是一款流行的开源持续集成(ContinuousIntegration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins官网:http://jenkins-ci.org/Jenkins特征开源的Java语言开发持续集成工具,支持持续集成,持续部署。易于安装部署......
  • BEV专栏(一)从BEVFormer深入探究BEV流程(上篇)
    前言 本文提出了一种基于Transformer和时间结构的Bird's-Eye-View(BEV)编码器,称为BEVFormer。该编码器可以有效地聚合来自多视角摄像机和历史BEV特征的时空特征。本教程禁止转载。同时,本教程来自知识星球【CV技术指南】更多技术教程,可加入星球学习。欢迎关注公众号CV技术指南,专注......
  • AI绘画:Lora模型训练完整流程!
    关于AI绘画(基于StableDiffusionWebui),我之前已经写过三篇文章,分别是软件安装,基本的使用方法,微调模型LoRA的使用。整体来说还是比简单的,搞个别人的模型,搞个提示词就出图了。今天来一个有些难度的,自己训练一个LoRA微调模型。​编辑切换为居中添加图片......
  • 2、负载均衡服务LVS的NAT、DR、TUNNEL搭建流程及LVS 持久连接、防火墙标记
    LVS的NAT模式实战案例(支持端口映射)环境如下:一台:internetclient:192.168.10.123/24GW:无仅主机一台:lvseth1仅主机192.168.10.100/24eth0NAT10.0.0.100/24两台RS:RS1:10.0.0.8/24GW:10.0.0.2NATRS2:10.0.0.18/24GW:10.0.0.2NAT配置如下第一步:在LVS机器......
  • Python程序执行的流程控制(选择和循环)
    选择结构单分支if条件:语句块(注意要打冒号冒号冒号,用缩进代替大括号的功能)双分支if条件:语句块1else:语句块2多分支if条件1:语句块1elif条件2:语句块2……else:语句块n若有多个条件都满足,只执行第一个被满足条件......
  • PBR流程的基本原理是什么?
     Hello,大家好,今天给大家带来PBR流程的基本原理与历史发展,我是Secohy。1、什么是PBR?一、基于物理的材质(Material)二、基于物理的光照(Lighting)三、基于物理适配的摄像机(Camera)以上三个部分都去参照物理理论去做引擎设计,理论上就能得到和真实摄像机基本相同的画面。例如基于物......
  • CSS学习1 认识CSS;三种CSS的编写样式;CSS注释;常见的CSS样式;元素link;CSS颜色表示方法;浏览
    1_认识CSSwhat:为网页添加样式(美化界面);一门样式表语言,不是编程语言发展历史css1(两个人合作发布)css2(w3c)css3(模块化持续发展中)总结:美化HTML,让HTML与CSS分离方式一:添加样式,例如颜色、字体,大小方式二:布局,按照某种结构显示2_三种CSS的编写样式声明:例如【color:red......
  • 如何进行MySQL源码调试(一条select语句的执行流程)
    一、背景MySQL是当今世上最受欢迎的使用最广泛的开源数据库,它的繁荣离不开它的开源特性。放在过去商业数据库的时代,大家都没有机会接触到数据库的源代码,但在如今开源数据库的时代,越来越多的人开始研究数据库的源码,并给社区贡献代码,MySQL官方每次发布新版本都要感谢一些在社区上贡......