使用u-boot 从NOR Flash 启动,前面说过u-boot 属于两个阶段的Bootloader ,第一阶段的文件为cpu/arm920t/start.S 和 board/EmbedSky/lowlevel_init.S, 前者是平台相关的,后者是开发板相关的。
一、u-boot 第一阶段代码分析
(1)硬件设备初始化
依次完成如下设置:将CPU 的工作模式设为管理模式(svc),关闭WATCHDOG ,设置FCLK、HCLK、PCLK 的比例(即设置CLKDIVN寄存器),关闭MMU、CACHE。部分代码如下:
(2)为加载Bootloader 的第二阶段代码准备RAM 空间
所谓准备RAM 空间,就是初始化内存芯片,使它可用。通过在start.S 中调用lowlevel_init 函数来设置存储控制器,使得外接的SDRAM可用。lowlevel_init 函数在board 文件夹里面。
lowlevel_init 函数并不复杂,只要注意这时的代码、数据都只保存在NOR Flash 上,内存中还没有,所以读取数据时要变换地址。代码如下:
第174~176 行进行地址变换,因为这个时候内存中还没有数据,不能使用链接程序时确定的地址来读取数据。
第174行中SMRDATA 表示这13个寄存器的值存放的开始地址(链接地址),值为0x33D0xxxx ,处于内存中。
第175行获得代码段的起始地址,它就是167行中的“TEXT_BASE”,其值在board/EmbedSky/config.mk 中定义为”TEXT_BASE = 0x33D00000“。
第176行将0x33D0xxxx 与0x33D00000相减,这就是13 个寄存器值在NOR Flash 上存放的开始地址。
(3)复制 Bootloader 的第二阶段代码到RAM空间中
这里将整个u-boot 的代码(包括第一、第二阶段)都复制到SDRAM 中,这在cpu/arm920t/start.S 中实现,如下所示:
(4)设置好栈
栈的设置灵活性很大,只要让sp寄存器指向一段没有使用的内存即可。
(5)跳转到第二阶段代码的C入口点
在跳转之前,还要清楚BSS段(初始值为0、无初始值的全局变量、静态变量放在BBS段),代码如下:
现在C函数的运行环境已经完全准备好,通过如下命令直接跳转(这之后,程序才在内存中执行),它将调用lib_arm/board.c 中的start_armboot 函数,这是第二阶段的入口点。
关键字:TQ2440 移植U-Boot 启动过程
引用地址:
TQ2440 学习笔记—— 30、移植U-Boot【U-Boot 的启动过程第一阶段源码分析】
推荐阅读最新更新时间:2024-11-04 18:54
TQ2440 学习笔记—— 10、嵌入式编程基础知识【arm-linux-ld 选项】
arm-linux-ld 用于将多个目标文件、库文件链接成可执行文件。 介绍 “ -T ” 选项,可以直接使用它来指定代码段、数据段、bss 段的起始地址,也可以用来指定一个链接脚本,在链接脚本中进行更复杂的地址设置。 “ -T ” 选项只用于链接Bootloader、内核等“没有底层软件支持”的软件;链接运行于操作系统之上的应用程序时,无需指定“ -T ” 选项,它们使用默认的方式进行链接。 1、直接指定代码段、数据段、bss段的起始地址 格式如下: -Ttext startaddr -Tdata startaddr -Tbss startaddr 其中的“ startaddr ” 分别表示代码段
[单片机]
TQ2440国嵌学院gboot-Makefile工程文件
国嵌学院TQ2440开发板gboot设计之Makefile: $^:所有的依赖目标的集合 $@: 规则中的目标文件集 代码如下:(程序中请不要加 //注释 ) all: start.o //依赖start.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ //链接脚本文件 arm-linux-objcopy -O binary gboot.elf gboot.bin //将elf文件转换为二进制文件bin %.o : %.S //将所有的.S文件编译成.o文件,只编译不链接 arm-l
[单片机]
u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)
本次移植跟以往的不同之处是采用了spl来引导u-boot,参考了博客 http://blog.csdn.net/fulinus/article/details/42738641 下载链接: http://pan.baidu.com/s/1bnlRKgn 使用方法: 1、 编译 make tq2440_defconfig make 2、 然后会在u-boot根目录下生成u-boot.bin,在spl目录下会生成u-boot-spl.bin,目前的分区是: u-boot-spl.bin (1M) u-boot.bin (1M) kernel (3M) rootfs (剩余) 自己可以改动,在arc
[单片机]
STM32时钟树与启动过程时钟设置分析
如果你要深入学习STM32,那么你就应该深入研究STM32从启动开始到结束的各个过程,清楚认识整个过程,才会避免在今后的开发中遇到各种玄学问题(虽然博主也经常遇到各种玄学问题),很多情况下玄学问题都是因为自身对问题没有足够深入的认识。 启动过程???许多刚入门STM32的小白可能会一脸懵逼,我可以正常的写流水灯程序呀,我从来就没设置过启动过程。那么说明你对STM32的固件库还没有足够清晰的认识,我们虽然没有足够的能力去写启动程序,但是我们应该学会去阅读、认识这个过程。此处借助原子的Template工程没有资料的从此处下载:启动程序是./CORE/startup_stm32f40_41xxx.s 这是一段汇编代码,主要是一
[单片机]
S3C2440中断过程详解(ADS,TQ2440)
下面以串口UART0接收中断为例: 串口接收中断初始化时有这么一句:pISR_UART0=(unsigned)__irq UART0 _GetInt /把 UART0 _GetInt这个中断服务子程序的入口地址放到pISR_TICK, S3C2440addr.h中#define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90)) option.inc中_ISR_STARTADDRESS EQU 0x33ffff00 //也就是中断服务子程序的入口地址放到0x33ffff00+0x90这个地址单元,即放入相应的中断向量表中,当中断发生时可通过查向量表(S3C2440addr.h
[单片机]
u-boot-1.1.6移植到TQ2440笔记——准备工作(1)
声明:tq 2440m没有官方的移植文档,本人在网上查看了很多资料都都也很乱,整理较好的是“唐智浩 2009.12”和“By dyf 2010- 9- 5”的《移植u-boot-1.1.6到tq2440》,但是他们的也有些与我的板子不相符的地方,通过参考他们的文档和网上资料,经过两天的努力终于弄好了,以下是本人的笔记。 一、移植说明 1、移植相关源代码:u - boot- 1.1.6.tar.bz2 2、移植开发板tq2440: CUP:S3C2440 SDRAM: NOR FLASH: NAND FLASH: 网卡: 3、文件裁剪: 删除board/下除smdk2410 以外的所
[单片机]
基于ARM9的媒体播放器设计
1 引言 计算机多媒体技术和网络技术飞速发展使得基于流媒体的多媒体应用也被运用在多种领域,特别是网络可视电话、远程监控、视频点播领域。伴随着计算机多媒体压缩技术的成熟和网络传输技术的发展,开发实时可靠、多功能、数字化、操作简单的基于计算机网络通讯技术和多媒体应用的网络化流媒体播放器已成为计算机、通信、消费电子产品领域(3C 产业-Computer、Communication、Consumer Electronics)技术发展的主要方向之一。 2 系统硬件设计 本文使用TQ2440 开发板作为硬件平台。 S3C2440AL 是控制核心,负责控制所有辅助设备。存储器采用SDRAM 和Flash 两种类型,能满足系统运行和调试的
[单片机]
链接地址学习笔记
链接地址 启动过程 示例代码如下: start.S 文件 .globl _start _start: /*硬件相关设置*/ ldr r0,=0x70000000 orr r0,r0,#0x13 mcr p15,0,r0,c15,c2,4 /*关看门狗*/ bl test /*位置无关*/ ldr pc, =test /*位置相关*/ ldr r0,=0x7E00400 mov r1,#0 str r1, /*设置栈*/ ldr sp,=8*1024 bl main halt: b halt test: mov pc,lr Led.c文件 void delay(){ volatile
[单片机]