U-Boot启动:lowlevel_init.S汇编解析与内存初始化
3星 · 超过75%的资源 需积分: 11 115 浏览量
更新于2024-09-23
1
收藏 52KB DOC 举报
"深入解析U-Boot启动流程中的lowlevel_init.S汇编代码"
在嵌入式系统中,U-Boot(Microcontroller Bootloader)作为引导加载程序,是系统启动过程中的重要一环。本文将详细解析U-Boot启动过程中汇编代码`lowlevel_init.S`的实现,该文件通常位于`board/myboard/`目录下,负责执行一些底层硬件初始化工作。
首先,`lowlevel_init.S`的主要任务是进行硬件初始化,包括内存、GPIO(通用输入输出)等关键模块。这段代码通常由汇编语言编写,因为对于这些低级别的初始化,需要精确控制硬件寄存器以确保系统能够正确运行。
1. **LR到R10的备份**
在汇编代码的开始部分,`lowlevel_init`函数首先保存链接寄存器LR(R14)的值到R10。这是为了在完成初始化后能够恢复执行。LR寄存器在函数调用中通常用于保存返回地址,这里是为了确保初始化结束后能正确返回到调用者。
2. **GPIO初始化**
接下来,代码按顺序配置GPIO(General Purpose Input/Output)寄存器,如GPSR0、GPSR1等,以设定各个引脚的功能。这通常涉及到读取配置常量,如`CFG_GPSR0_VAL`,然后将其写入相应的GPIO寄存器,以设置GPIO端口的行为,例如输入、输出、中断等。
3. **内存控制器初始化**
内存控制器初始化是一个关键步骤,因为它是系统访问内存的基础。`lowlevel_init.S`会检查当前程序是否正在RAM中运行,如果是,则跳过内存初始化,因为这意味着内存已经准备好使用。否则,它会执行一系列特定于目标平台的初始化步骤,如设置内存控制器的基地址(如PXA270开发板的`MEMC_BASE`),以及初始化相关寄存器以配置内存时序和特性,如`RBUFFx`和`RRRx`等。
初始化内存控制器可能涉及以下步骤:
- 设置静态内存控制寄存器(Static Memory Control register, MSCx)
- 配置Bank选择、预充电时间、行地址时钟周期等参数
- 启动自校验或内存测试,以确保内存的可靠性
4. **其他硬件初始化**
除了以上提到的内存和GPIO,`lowlevel_init.S`可能还会处理其他硬件初始化,比如时钟控制器、中断控制器、看门狗定时器等,这些都是系统启动前必不可少的。
5. **结束和恢复执行**
在所有必要的初始化完成后,代码会跳转到`mem_init_done`标签处,标志着`lowlevel_init`函数的结束。然后,通过恢复之前保存的LR(R10)值,U-Boot的执行将继续进行到下一个阶段,可能是C语言实现的更高级别的初始化函数。
`lowlevel_init.S`是U-Boot启动流程的关键部分,负责初始化底层硬件,为后续的系统启动和运行提供基础环境。其代码通常高度依赖于目标硬件平台,因此不同的板子可能会有不同实现。理解这部分代码有助于开发者更好地调试和定制U-Boot,以适应特定的嵌入式系统需求。
点击了解资源详情
2020-01-15 上传
2021-07-13 上传
2018-10-27 上传
2019-08-24 上传
2014-06-26 上传
yuminghou66
- 粉丝: 0
- 资源: 2
最新资源
- 深入浅出:自定义 Grunt 任务的实践指南
- 网络物理突变工具的多点路径规划实现与分析
- multifeed: 实现多作者间的超核心共享与同步技术
- C++商品交易系统实习项目详细要求
- macOS系统Python模块whl包安装教程
- 掌握fullstackJS:构建React框架与快速开发应用
- React-Purify: 实现React组件纯净方法的工具介绍
- deck.js:构建现代HTML演示的JavaScript库
- nunn:现代C++17实现的机器学习库开源项目
- Python安装包 Acquisition-4.12-cp35-cp35m-win_amd64.whl.zip 使用说明
- Amaranthus-tuberculatus基因组分析脚本集
- Ubuntu 12.04下Realtek RTL8821AE驱动的向后移植指南
- 掌握Jest环境下的最新jsdom功能
- CAGI Toolkit:开源Asterisk PBX的AGI应用开发
- MyDropDemo: 体验QGraphicsView的拖放功能
- 远程FPGA平台上的Quartus II17.1 LCD色块闪烁现象解析