uboot分析之第一阶段

2023-11-18

1.初始化
关看门狗
初始化时钟
初始化SDRAM
2.把程序从Nand flash 拷贝到 SDAM
3.设置SP,sp指向某块内存(因为要调用c函数,就要使用栈)
4.c函数就是读出内核,启动内核

1.起始位置
在这里插入图片描述
2.跳转到reset
在这里插入图片描述

3.关闭看门狗
在这里插入图片描述
4.关中断
在这里插入图片描述
5.
在这里插入图片描述
6.cpu init
关MMU,
初始化lowlevel_init(初始化存储控制器),
在这里插入图片描述
在这里插入图片描述
7.设置栈
在这里插入图片描述

在这里插入图片描述
设置好栈就可以调用c函数
clock_init()
把uboot从falsh读到RAM中去
在这里插入图片描述
清bss段
在这里插入图片描述
uboot第一阶段
1.设置svc(超级用户)模式
2.关闭看门狗
3.屏蔽中断
4.初始化SDRM
5.设置栈
6.时钟初始化
7.将uboot代码从flash拷贝到SDARM中去
8.清bss段(BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。)
9.调用C语言接口_start_armboot

拷贝代码到ram的函数

#if 1
	bl  CopyCode2Ram	/* r0: source, r1: dest, r2: size */
#else
	add	r2, r0, r2		/* r2 <- source end address         */
 
copy_loop:
	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
	cmp	r0, r2			/* until source end addreee [r2]    */
	ble	copy_loop
#endif


int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)
{
    unsigned int *pdwDest;
    unsigned int *pdwSrc;
    int i;

    if (bBootFrmNORFlash())//判断是从nand启动的还是从nor启动的,如果条件成立,表示是从nor启动的
    {
        pdwDest = (unsigned int *)buf;
        pdwSrc  = (unsigned int *)start_addr;
        /* 从 NOR Flash启动 */
        for (i = 0; i < size / 4; i++)//4字节的写入,所以需要size / 4  by andy
        {
            pdwDest[i] = pdwSrc[i];//norfalsh可以在配置完内存管理单元后,读数据可以像内存一样操作
        }
        return 0;
    }
    else
    {
        /* 初始化NAND Flash */
        nand_init_ll();
        /* 从 NAND Flash启动 */
        nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP));
        return 0;
    }
}
//判断是否从0地址启动
int bBootFrmNORFlash(void)
{
    volatile unsigned int *pdw = (volatile unsigned int *)0;
    unsigned int dwVal;
    
    /*
     * 无论是从NOR Flash还是从NAND Flash启动,
     * 地址0处为指令"b    Reset", 机器码为0xEA00000B,
     * 对于从NAND Flash启动的情况,其开始4KB的代码会复制到CPU内部4K内存中,
     * 对于从NOR Flash启动的情况,NOR Flash的开始地址即为0。
     * 对于NOR Flash,必须通过一定的命令序列才能写数据,
     * 所以可以根据这点差别来分辨是从NAND Flash还是NOR Flash启动:
     * 向地址0写入一个数据,然后读出来,如果没有改变的话就是NOR Flash
     */

    dwVal = *pdw;       
    *pdw = 0x12345678;
    if (*pdw != 0x12345678)
    {
        return 1;//从nor启动
    }
    else
    {
        *pdw = dwVal;//复原原先0地址处的数据
        return 0;//从nand启动 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uboot分析之第一阶段 的相关文章

  • 【华为OD机试真题 JAVA】可以组成网络的服务器

    JS版 华为OD机试真题 JS 可以组成网络的服务器 标题 可以组成网络的服务器 时间限制 1秒 内存限制 262144K 语言限制 不限 在一个机房中 服务器的位置标识在 n m 的整数矩阵网格中 1 表示单元格上有服务器 0 表示没有
  • UI页面切换按钮随页面切换缩放

    选中按钮放大其余按钮缩小的 效果 using System Collections using System Collections Generic using UnityEngine public class BottomBarBtn M
  • No module named cv2 报错处理

    运行python脚本出现 No module named cv2 这时我们安装下opencv python依赖即可 python3 m pip install opencv python 转载于 https www cnblogs com
  • flutter for循环removeAt(i)数据遇到的问题

    通常都是for循环遍历从前往后顺序 这时候遇到符合条件的通过下标把该数据删掉 for int i 0 i lt 40 i if i 2 removeAt i 删一个数据不会出问题 如果要删多个数据就会有问题了 比如i为0时删了列表第一个 那

随机推荐

  • Windows安装Linux子系统

    win10更新了安装linux子系统的步骤 使之更加方便 只需要在CMD运行命令 wsl install 当然这会涉及很多默认的选项 Windows 命令提示符中输入以下命令 找到可供安装的 Linux 发行版列表 wsl list onl
  • LSPosed 安装教程(LSP框架安装教程)

    1 下载LSPosed模块 CSDN下载 Riru 版 LSPosed Riru Zygisk版 LSPosed Zygisk 或 github下载 LSPosed GitHub 2 打开Magisk 设置 开启 Zygisk 3 打开面具
  • 手把手教你玩转YOLOX--Windows(上)

    旷视开源的YOLOX其性能超越 YOLOv3 YOLOv4 和 YOLOv5 应不少小伙伴的要求 我在这里用手把手教学的方式展示一下YOLOX的搭建 上篇 下一篇将着重介绍YOLOX如何进行模型的训练 进阶篇介绍YOLOX的原理 代码讲解及
  • 卷积原理(卷积,padding填充,步长,多通道卷积)

    1 卷积 卷积可以用于对输入数据进行特征提取 特征提取的过程可以理解为通过卷积对输入特征进行加权运算 提取输入中的重要信息 卷积运算的过程就是通过卷积核扫描输入矩阵的元素 将卷积核和扫描对应的元素相乘再相加 得到一个输出 通过不断地滑动 得
  • 看书标记【R语言数据分析与挖掘实战】4

    第四章 数据预处理 4 1 数据清洗 缺失值处理 使用is na 判断缺失值是否存在 complete cases 可以识别样本数据是否完整从而判断缺失情况 删除法 na omit 函数移除所有含有缺失数据的行 data p 删除p列 替换
  • canal简介及canal部署、原理和使用介绍

    阿里canal简介及canal部署 原理和使用介绍 canal入门 什么是canal 阿里巴巴B2B公司 因为业务的特性 卖家主要集中在国内 买家主要集中在国外 所以衍生出了杭州和美国异地机房的需求 从2010年开始 阿里系公司开始逐步的尝
  • 学习心态

    今天 2019年6月4日 将属于自己的域名写上了属于我决定的页面 那种感觉我觉得对于正在学习的我们来说是一种催化剂 尽管还有很多很多我们不知道 等待我们去发掘和使用 但当我们时刻保持这种一边学习一边让自己充满自豪的感觉 那会让我们学的轻松
  • promise和async await的区别

    之前面试的时候被面试官问到 你能说说Promise和async await的区别吗 我才发现自己写了这么久的Promise then all async await 还真是没了解过这两者的原理和区别 于是赶紧学习了些资料 拿出小本本记录下来
  • 华为od机试题9 真题

    华为od机试题 真题 9 寻找重复字符 7 字符串翻转 6 小朋友身高排序 5 CPU最少执行时间 4 猴子爬山 3 输出信元的值 2 指定元素对最小和 1 勾股数元组 以下题目附带Java解法 是我个人写的 不一定是标准答案 没有真正的测
  • 对JS中global、window、document、this区别的理解

    本文章综合了很多地方对global和widow区别的解释 我加以挑选再结合我自己的理解以及遇到的问题写出来的 可能比较乱 但是全部看完或许对global和window对象的理解还是有帮助的 一个关于window和global区别的链接 可以
  • 12-Linux下Oracle 11g R2数据库安装

    Oracle 11g R2数据库安装 安装环境准备 需要先装centos系统 并更新组件 安装请参考centos6 5安装手册 用户一览 用户 所在组 权限 Root root 超级用户 Oracle oinstall dba 安装地址 组
  • 【windows核心编程】第二章-笔记

    一个字节8位 最多表示256个字符 UTF 16 将每个字符编码为2个字节 即Unicode windows使用 utf 16 支持代理 代理使用32位来表示一个字符 UTF 8 将一些字符编码为1个字节 一些字符编码为2个字符 一些字符编
  • IDEA 集成VisualVM Launcher JDK 监控程序插件

    IDEA 安装VisualVM Launcher 插件 1 打开setting 找到Plugins选项 安装VisualVM Launcher 插件 如果有就跳过这一步 检索 VisualVM Launcher 安装成功后 重新启动IDEA
  • 感知机与支持向量机

    感知机 追求最大程度正确划分 最小化错误 容易造成过拟合 SVM 追求大致正确分类的同时 最大化分类间隔 一定程度上避免过拟合 1 普通感知机不能产生最大间隔 而SVM可以 2 带margin的感知机可以通过两种手段实现 早停 加正则化项
  • shell 脚本关键字&符号

    shell概念 shell 既是一种解释型编程语言 也是一个这种编程语言的解释器的名字 shell是解释型语言 就是解释器会一条一条的翻译每一条语句并执行 对比之下 C语言是编译型语言 编译器把整个工程编译成可执行文件才能执行 在没有续行符
  • win10下Linux子系统(ubuntu)开启并配置(shell主题,设置中文环境,图形界面...)

    创作不易 如果以下内容对你有帮助 别忘了点一个赞 让更多的小伙伴能看到吧 一 开启win10子系统 Windows Subsystem for Linux WSL 1 启动开发者模式 设置 gt 更新和安全 gt 开发者选项 gt 开发人员
  • 自动化测试框架Testng相关

    1 Testng简介 Testng是一套开源测试框架 是从Junit继承而来 testng意为test next generation 2 Testng介绍 适合测试的原因 比Junit涵盖功能更全面的测试框架 Junit更适合隔离性比较强
  • VS2017打开自身项目提示项目不兼容问题解决

    几天前用VS2017建的控制台程序 今天打开弹出对话框 提示版本不兼容 这我就很纳闷 VS2010的项目你打不开就算了 怎么自己的也提示版本不兼容 这重新创建一个再导入太麻烦了 在试了多次无果 而且百度到的都牛头不对马嘴 用NOTEPAD
  • PLSQL Developer的详细安装步骤

    1 下载地址http www allroundautomations com 下载下来 得到 2 解压到当前文件夹 3 双击plsqldev1105 x64 exe 安装PLSQL Developer 开发工具 点击plsqlev1105
  • uboot分析之第一阶段

    1 初始化 关看门狗 初始化时钟 初始化SDRAM 2 把程序从Nand flash 拷贝到 SDAM 3 设置SP sp指向某块内存 因为要调用c函数 就要使用栈 4 c函数就是读出内核 启动内核 1 起始位置 2 跳转到reset 3