嵌入式开发(S5PV210)——u-boot中如何确定启动方式

2023-11-02

1、嵌入式设备确认启动方式

设备确认启动方式分为硬件方式和软件方式,硬件方式是通过芯片某几个引脚的高低电平来决定启动方式;软件方式就是通过代码设置来决定启动方式。
(1)硬件方式:比如S5PV210芯片,通过拨码开关去设置芯片引脚的高低电平来设置启动方式,要改启动方式必须要硬件上进行设置,芯片在启动时检查引脚的电平从而决定去何种启动介质中读取启动代码;
(2)软件方式:比如X86架构的芯片用bios启动,在设备启动时进入bios界面,可以修改启动顺序。PC电脑也是用的bios,感兴趣可以去看看关于启动顺序的设置。

2、uboot中对启动方式的判断

2.1、汇编部分代码

		/* 读取启动方式,也就是读取om引脚的状态*/
        ldr	r0, =PRO_ID_BASE
        ldr	r1, [r0,#OMR_OFFSET]
        bic	r2, r1, #0xffffffc1
		
		/* NAND BOOT */
		省略掉NAND BOOT部分的判断

		/* SD/MMC BOOT */
		cmp     r2, #0xc
		moveq   r3, #BOOT_MMCSD	

		/* NOR BOOT */
		cmp     r2, #0x14
		moveq   r3, #BOOT_NOR
		
		/* Uart BOOTONG failed */
		cmp     r2, #(0x1<<4)
		moveq   r3, #BOOT_SEC_DEV
		
		/*将r3寄存器的值保存到[INF_REG_BASE+INF_REG3_OFFSET]地址处*/
		ldr	r0, =INF_REG_BASE
		str	r3, [r0, #INF_REG3_OFFSET]  
		
		#if defined(CONFIG_EVT1)
		/* If BL1 was copied from SD/MMC CH2 */
		ldr	r0, =0xD0037488
		ldr	r1, [r0]
		ldr	r2, =0xEB200000
		cmp	r1, r2
		beq     mmcsd_boot
		#endif

		ldr	r0, =INF_REG_BASE
		ldr	r1, [r0, #INF_REG3_OFFSET]
		cmp	r1, #BOOT_NAND		/* 0x0 => boot device is nand */
		beq	nand_boot
		cmp	r1, #BOOT_ONENAND	/* 0x1 => boot device is onenand */
		beq	onenand_boot
		cmp     r1, #BOOT_MMCSD
		beq     mmcsd_boot
		cmp     r1, #BOOT_NOR
		beq     nor_boot
		cmp     r1, #BOOT_SEC_DEV
		beq     mmcsd_boot
		mmcsd_boot:
		bl      movi_bl2_copy
		b       after_copy

1.读取[PRO_ID_BASE+ OMR_OFFSET]地址处的数据,然后取bit1-bit5赋值给r2;(假设r2的值是0xc,SD卡启动方式)
2.将r2做比较从而判断当前是哪种启动方式,于是得知当前是 SD/MMC BOOT,r3=#BOOT_MMCSD;
3.将r3的数据写到[INF_REG_BASE+INF_REG3_OFFSET]地址处保存起来;
4.将0xD0037488地址处的数据读取出来,如果值为0xEB200000就跳转到mmcsd_boot处执行,跳过后面的步骤;
5.将第三步保存在[INF_REG_BASE+INF_REG3_OFFSET]地址处的数据读取出来保存在r1;
6.r1的值为#BOOT_MMCSD,于是最终跳转到mmcsd_boot处执行;
7.movi_bl2_copy是一个C语言函数,主要作用就是重定位BL2;
8.after_copy就是启动代码的剩余部分;

2.2、特殊地址[PRO_ID_BASE+ OMR_OFFSET]

[PRO_ID_BASE+ OMR_OFFSET]=0xE0000004,是一个寄存器的地址,该寄存器的值是硬件根据OM引脚的设置而自动填充的,这个值反映的是OM引脚的接法,也就是当前我们选择的启动介质是什么。通过判断该寄存器的bit1-bit5就可以知道该去何种启动介质读取启动代码。

2.3、特殊地址[D0037488]和[0xD0037F98]

这两个地址是SD卡启动相关的,参考博客《ARM芯片开发(S5PV210芯片)——SD卡启动》

2.4、movi_bl2_copy函数详解

typedef u32(*copy_sd_mmc_to_mem)(u32 channel, u32 start_block, u16 block_size, u32 *trg, u32 init);

void movi_bl2_copy(void)
{
	ulong ch;
	ch = *(volatile u32 *)(0xD0037488);
	copy_sd_mmc_to_mem copy_bl2 =
	    (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

	#if defined(CONFIG_SECURE_BOOT)
	ulong rv;
	#endif

	u32 ret;
	if (ch == 0xEB000000) {
		ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);
	}
	else if (ch == 0xEB200000) {
		ret = copy_bl2(2, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);
	}
	else
		return;

	if (ret == 0)
		while (1);
	else
		return;
}

该函数作用是重定位bl2:
1.将0xD0037488地址处的数据赋值给ch,;
2.将0xD0037F98强制转换成函数指针,这是从SD/MMC中拷贝数据到内存的函数;
3.通过比较ch的值判断出当前是从SD卡通道2还是通道0启动,从而去对应的通道读取数据;
4.copy_bl2函数功能就是从SD卡某个通道的某个扇区开始读取n个块到某个地址处,具体都可以在函数参数里指定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式开发(S5PV210)——u-boot中如何确定启动方式 的相关文章

随机推荐

  • 单点登录CAS学习(二):使用IDEA搭建cas-overlay-5.3工程

    上一篇对于单点登陆进行了初步了解 我们做单点登录应用的时候 会有两个场景 单点登录的服务端 单点登录的客户端 指各个应用系统 从本篇开始的系列文章将分别介绍服务端的工程如何搭建 客户端如何改造以适用于单点登录 首先从服务端开始 我们往往需要
  • ElasticSearch集群管理(VMware)

    一 集群结构 ES通常以集群方式工作 这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力 同时也增加了系统的 容错能力及高可用 下图是ES集群结构的示意图 此处的设置为 每个主分片有两个副本 如果某个节点挂了也不怕 比如节点1挂了
  • 操作系统学习(十一)处理机调度

    一 知识总览 调度 按某种规则来决定处理这些任务的顺序 多道程序系统中 进程的数目往往多于处理机的数目 按照一定的算法从进程就绪队列中选择一个进程将处理机分配给他 以实现进程的并发执行 二 高级调度 作业调度 作业 用户在一次解题或一个事务
  • 计算机单位换算

    一 计算机容量单位 容量单位 字节 B gt 千字节 KB gt 兆字节 MB gt 吉字节 GB gt TB gt PB gt EB ZB YB NB DB等 注 Byte就是B也就是字节 KB是千字节 MB是兆 GB是千兆 TB是千千兆
  • jvisualvm监控tomcat

    1 修改Tomcat的catalina sh文件 修改tomcat的bin目录下的 catalina sh文件 搜索 JAVA OPTS 在引号中添加参数 Dcom sun management jmxremote port 10086 D
  • 设计RandomPool结构

    详情参看 程序员代码面试指南 P474 package com gxu dawnlab algorithm5 import java util HashMap 设计RandomPool结构 author junbin 2019年7月1日 p
  • 手动添加本地路由表并用Quagga+ospf通知其它路由

    文章目录 参考文章 一 路由设置 1 参数说明 2 查询设置 二 动态路由的设置 实验 参考文章 Linux下使用Quagga搭建软路由 OSPFv2学习 鳥哥的 Linux 私房菜 一 路由设置 1 参数说明 root anzye rou
  • AssetsBundle资源包的打包和加载

    如何打Assetsbundle资源包呢 这样 using UnityEditor using UnityEngine public class BuildAssetBundle
  • openmv图像识别:宝藏多颜色图形同时识别

    前言 最近参加了光电赛 校赛运气不好碰到铁板被淘汰了 emmm 我是大一学硬件的的 负责的是宝藏识别部分 好歹花了好几天学python 研究openmv写出来的代码 即使没啥技术性 我也不甘心就这么没了 发出来记录一下 目录 零 预备知识
  • 物联网【劲爆发现】免费云服务平台,AP透传,Web透传,ESP8266,Hex格式数据

    劲爆发现 免费云服务平台 AP透传 Web透传 ESP8266 Hex格式数据 安卓一键配置 今日 闲暇 发布一个免费的云服务器 供大家测试 先上图 看看如何使用吧 1 先从附件下载Esp8266固件及其下载工具 如下图 链接 http p
  • 单链表的冒泡排序

    当采用冒泡排序时 每一个元素与后一个元素比较 若这个元素小于后一个元素 则交换这两个元素的位置 外层循环n 1次 内循环n 1 i次 首先定义结构体指针stu p q tail p L 让p指向L L是首元结点 Int count 0 先循
  • 一些好的学习网址

    地址 http chs gotdotnet com quickstart 描述 本站点是微软 NET技术的快速入门网站 我们不必再安装 NET Framework中的快速入门示例程序 直接在网上查看此示例即看 名称 微软官方 NET指导站点
  • npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)...

    什么是npm npm有两层含义 一层含义是Node的开放式模块登记和管理系统 网址为npmjs org 另一层含义是Node默认的模块管理器 是一个命令行下的软件 用来安装和管理Node模块 npm不需要单独安装 在安装Node的时候 会连
  • Qt事件处理机制整个流程--以鼠标在一个窗口中点击为例

    转载自 http mobile 51cto com symbian 272812 htm 在此谢谢原作者的分享 第一部分 本篇来介绍Qt 事件处理机制 深入了解事件处理系统对于每个学习Qt人来说非常重要 可以说 Qt是以事件驱动的UI工具集
  • 华为OD机试真题-需要打开多少监控器-2023年OD统一考试(B卷)

    题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时 监控器才需要打开 给出某一时刻停车场的停车分布 请统计最少需要打开多少个监控器 输入描述 第一行输入m n表示长宽 满足1
  • python实现天气数据爬取实现数据可视化和天气查询gui界面设计

    在学校大一实训中 我的实训项目就是使用python爬取天气数据并且实现gui图形界面的设计 实训结束了 希望自己的代码可以帮助大家的学习 代码是大一时候写的 比较青涩 大家多包涵 第一个部分是getdata的部分 就是爬取数据 并将数据存放
  • 刷脸支付有可以大规模落地的商用前景

    科技的高频创新牵引着公众行为发生着快速切换与升级 当人们还沉浸在扫码支付的便利场景中时 刷脸支付作为一种全新的支付方式已不期而至 同时 针对刷脸支付可能大规模落地商用的前景 围绕其便捷性与安全性所展开的舆论博弈也不断被推向高潮 目前刷脸支付
  • vue.config.js中的配置

    兼容性问题 const defineConfig require vue cli service module exports defineConfig node modules里的依赖默认是不会编译的 会导致es6语法在ie中的语法报错
  • 今天第一次用dubbo写一个提供者,消费者,记录一下

    随笔 自己记录一下 一 先创建一个maven项目 dubbo pom 里面包含两个module dubbo api 和 dubbo consumer 如下 dubbo pom xml
  • 嵌入式开发(S5PV210)——u-boot中如何确定启动方式

    1 嵌入式设备确认启动方式 设备确认启动方式分为硬件方式和软件方式 硬件方式是通过芯片某几个引脚的高低电平来决定启动方式 软件方式就是通过代码设置来决定启动方式 1 硬件方式 比如S5PV210芯片 通过拨码开关去设置芯片引脚的高低电平来设