移植 U-Boot(四)

U-Boot的启动过程源码分析

u-boot属于两阶段的bootloader,第一阶段的文件为cpu/arm920t/start.S和board/smdk2410/lowlevel_init.S,前者是平台相关的,后者是开发板相关的。

1.u-boot第一阶段代码分析

(1)硬件设备初始化

依次完成如下设置:将CPU的工作模式设为管理模式(svc),关闭看门狗,设置FCLK、HCLK、PCLK的比例(即设置CLKDIVN寄存器),关闭MMU、CACHE。

代码在cpu/arm920t/start.S中。

(2)为加载bootloader的第二阶段代码准备RAM空间

初始化内存芯片,使能。对于S3C2410/S3C2440,通过在start.S中调用lowlevel_init函数来设置存储控制器,使得外接的SDRAM可用。代码在board/smdk2410/lowlevel_init.S中。(该文件是开发板相关的,如果外接设备不一样,可以修改相关宏定义)

129 _TEXT_BASE:
130     .word    TEXT_BASE
131
132 .globl lowlevel_init
133 lowlevel_init:
134     /* memory control configuration */
135     /* make r0 relative the current location so that it */
136     /* reads SMRDATA out of FLASH rather than memory ! */
137     ldr     r0, =SMRDATA
138     ldr    r1, _TEXT_BASE
139     sub    r0, r0, r1
140     ldr    r1, =BWSCON    /* Bus Width Status Controller */
141     add     r2, r0, #13*4
142  0:
143     ldr     r3, [r0], #4
144     str     r3, [r1], #4
145     cmp     r2, r0
146     bne     0b
147
148      /* everything is fine now */
149     mov    pc, lr
150
151     .ltorg
152 /* the literal pools origin */
153
154   SMRDATA:
155     .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
156     .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
  • 第137~139行进行地址变换,因为这时候内存还没有数据,不能使用连接程序时确定的地址来读取数据;
  • 第137行中的SMRDATA表示这13个寄存器的值存放的开始地址(连接地址),值为0x33F8xxxx,处于内存中;
  • 第138行获得代码的起始地址,他就是第130行中的“TEXT_BASE”,其值在board/smdk2410/config.mk中定义为“TEXT_BASE=0x33F80000”。
  • 第139行将0x33F8xxxx与0x33F80000相减,这就是13个寄存器值在NOR Flash上存放的开始地址

(3)复制bootloader的第二段代码到RAM空间

这里将整个u-boot的代码(包括第一、第二阶段)都复制到SDRAM中,这在cpu/arm920t/start.S中实现,如下所示:

164 relocate:                /* relocate U-Boot to RAM ,将u-boot复制到ram中       */
165     adr    r0, _start        /* r0 <- current position of code ,r0:当前代码的开始地址  */
166     ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM ,r1:代码段的连接地址*/
167     cmp     r0, r1                  /* don‘t reloc during debug ,测试现在是在flash中还是在ram中 */
168     beq     stack_setup
169
170     ldr    r2, _armboot_start   第一条指令的运行地址
171     ldr    r3, _bss_start       在连接脚本u-boot.lds中定义,是代码的结束地址
172     sub    r2, r3, r2        /* r2 <- size of armboot ,r2=代码段长度 */
173     add    r2, r0, r2        /* r2 <- source end address ,r2=nor flash上代码段的结束地址 */
174
175 copy_loop:
176     ldmia    r0!, {r3-r10}        /* copy from source address [r0] ,从地址[r0]处获得数据   */
177     stmia    r1!, {r3-r10}        /* copy to   target address [r1] ,复制到地址[r1]处  */
178     cmp    r0, r2            /* until source end addreee [r2] ,判断是否幅值完毕   */
179    ble    copy_loop            没复制完,则继续

(4)设置好栈

栈的设置灵活性很大,只要让sp寄存器指向一段没有使用的内存即可。

(5)跳转到第二段代码的c入口点

在跳转前,要清除BSS段(初始值为0、无初始值的全局变量、静态变量放在BSS段)

此时,C函数的运行环境已经完全准备好,通过如下命令直接跳转(之后,程序开始在内存中运行),将调用lib_arm/board.c中的start_armboot函数,这是第二阶段的入口点。

223     ldr    pc, _start_armboot
224
225 _start_armboot:    .word start_armboot

2.u-boot移植第二阶段代码分析

第二阶段从lib_arm/board.c中的start_armboot函数开始,完成对硬件的初始化、驱动

(1)初始化本阶段

时间: 2024-08-26 19:31:19

移植 U-Boot(四)的相关文章

Spring Boot (四):打包部署

springboot 打包与部署 一.jar 包 pom文件中packaging: 1.编译 进入项目目录,使用如下命令: //命令打包(-Dmaven.test.skip=true 跳过测试) mvn clean package -Dmaven.test.skip=true或者执行Maven install 2.运行 当前目录的target 就有一个.jar 文件 #启动命令 nohub java -jar xxxx.jar >/dev/null 2>&1 & 二.war 包

spring boot(四) 多数据源

前言 前一篇中我们使用spring boot+mybatis创建了单一数据源,其中单一数据源不需要我们自己手动创建,spring boot自动配置在程序启动时会替我们创建好数据源. 准备工作 application.yml中配置connection的4个属性 spring: datasource: read: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.80.129:3306/test username:

MTK Camera驱动移植

对于MTK Camera驱动移植一般分为四部分: 1.硬件IO口配置: 2.Camera驱动移植: 3.上电时序. 4.改动i2c控制器: 硬件电路: 1.GPIO配置 打开 mediatek\dct\DrvGen.exe 选择 mediatek\custom\xiaoxi\kernel\dct\dct\codegen.dws 配置文件 设置前后摄像头的CMRST和CMPDN引脚.这是跟上电时序有关: 2.Camera驱动移植(以SP5507+SP2509为例) (1)将kernel层代码整个文

uboot移植总结

1.uboot的介绍及体系结构 1.1 uboot的介绍 Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统.UBoot除了支持PowerPC系列的处理器外,还能支持MIPS. x86.ARM.NIOS.XScale等诸多常用系列的处理器. 1.2 uboot的体系结构 目录树 |--board |--c

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g

ORACLE官方提供的Sql Developer自带的Oracle Migration Workbench. 什么是Oracle SQL Developer?在官方页面上,是这样介绍它的: Oracle SQL Developer is a free and fully supported graphical tool for database development. With SQL Developer, you can browse database objects, run SQL st

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 一:本文的主要内容介绍 CA证书的下载及相应文件的介绍CA证书在tomcat的部署CA证书在sprin

Https系列之三:让服务器同时支持http、https,基于spring boot

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 前面已介绍了:"https在服务器端的部署,基于tomcat,spring boot&quo

spring boot 1.5.4 从入门到实践

Spring Boot四个重要核心: 自动配置:针对很多Sping应用程序常见的应用功能,Spring Boot能自动提供相关配置: 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库: 命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建(实际开发中,可用性小): Actuator:让你能够深入运行中的SpringBoot应用程序的开发,一探究竟. spring-boot相关项目源码, 码云地址:https://git.o

Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个 Demo 来试试它的效果,越简单越容易上手最好.在网上找相关资料的时候总是很麻烦,有的文章写的挺不错的但是没有源代码,有的有源代码但是文章介绍又不是很清楚,所在找资料的时候稍微有点费劲.因此在我学习 Spring Boot 的时候,会写一些最简单基本的示例项目,一方面方便其它朋友以最快的方式去了解,一方面如果我的项目需要用到相