简单说说U-boot的修改
简单说说U-boot的修改
uboot是一个通用的免费开放源码的boot程序,支持很多的处理器。
以下是现在网上下载一个u-boot-1.1.1版本,用于at91rm9200系统的修改的例子。最后在redhat8.0上,用gcc2.95编译通过。
在网上下载了uboot-1.1.1版本。要用于自己的at91rm9200的系统,这个系统的情况是:
SDRAM: 32Mbytes NCS1
FLASH: 8Mbytes NCS0
涉及到的文件有四个:
common.h
flash.c
flash.h
”./board/at91rm9200dk/config.mk”
以下简单的说说。
一、首先读读uboot自带的readme文件,了解了一个大概。
二、看看common.h,这个文件定义了一些基本的东西,并包含了一些必要的头文件。再看
看flash.h,这个文件里面定义了flash_info_t为一个struct。包含了flash的一些属性定
义。并且定义了所有的flash的属性,其中,AMD的有:AMD_ID_LV320B,定义为“#define
AMD_ID_LV320B 0x22F922F9”。
三、对于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:
“void flash_identification(flash_info_t *info)”这个函数的目的是确认flash的型
号。注意的是,这个函数里面有一些宏定义,直接读写了flash。并获得ID号。
四、修改:”./board/at91rm9200dk/config.mk”为
TEXT_BASE=0x21f80000 为TEXT_BASE=0x21f00000 (当然,你应该根据自己的板子来修改
,和一级boot的定义的一致即可)。
五、再修改”./include/configs/at91rm9200dk.h”为
修改flash和SDRAM的大小。
六、另外一个要修改的文件是:
./borad/at91rm9200dk/flash.c。这个文件修改的部分比较的多。
1. 首先是OrgDef的定义,加上目前的flash。
2. 接下来,修改”#define FLASH_BANK_SIZE 0x200000”为自己flash的容量
3. 在修改函数flash_identification(flash_info_t * info)里面的打印信息,这部分将
在u-boot启动的时候显示。
4. 然后修改函数flash_init(void)里面对一些变量的赋值。
5. 最后修改的是函数flash_print_info(flash_info_t * info)里面实际打印的函数信息
。
6. 还有一个函数需要修改,就是:“flash_erase”,这个函数要检测先前知道的flash
类型是否匹配,否则,直接就返回了。把这里给注释掉。
七、接下来看看SDRAM的修改。
这个里面对于“SIZE”的定义都是基于字节计算的。
只要修改”./include/configs/at91rm9200dk.h”里面的
“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以字节为单位的。
八、还有一个地方要注意
就是按照目前的设定,一级boot把u_boot加载到了SDRAM的空间为:21F00000 -> 21F16B1
0,这恰好是SDRAM的高端部分。另外,BSS为21F1AE34。
九、编译后,可以写入flash了。
1. 压缩这个u-boot.bin
“gzip –c u-boot.bin > u-boot.gz”
压缩后的文件大小为:
43Kbytes
2. 接着把boot.bin和u-boot.gz烧到flash里面去。
Boot.bin大约11kBytes,在flash的0x1000 0000 ~ 0x1000 3fff
免费参加,名额有限!2005DVTF;MP3 U盘礼物...
zlei 发表于 2005-1-16 12:31 ARM 论坛 ←返回版面
U-Boot 在44B0X 开发板上的移植以及代码分析(ZT)
armboot的原理
1、BIOS的源码,其作用是初始化硬件,并COPY Boot到SDRAM中
2、在SDRAM中运行BOOT达到在线升级的目的。
3、此源代码与硬件无关,在44b0x上测试通过
4、串口通讯协议自己制定,很好理解。在线升级很快
5、目前只支持SST39LVF160,可以自己修改成相信的NOR FLASH
U-Boot 在44B0X 开发板上的移植以及代码分析
1. u-boot 介绍
u-boot 是一个open source 的bootloader,目前版本是0.4.0。u-boot 是在ppcboot 以及
armboot 的基础上发展而来,虽然宣称是0.4.0 版本,却相当的成熟和稳定,已经在许多
嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。唯一遗憾的是
并不支持我们现在学习所用samsung 44B0X 的开发板。
为什么我们需要u-boot?显然可以将ucLinux 直接烧入flash,从而不需要额外的
引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自
动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的
自动更新的需要就说明我们的开发是必要的。同时,u-boot 移植的过程也是一个对嵌入式
系统包括软硬件以及操作系统加深理解的一个过程。
2. u-boot 移植的框架
移植u-boot 到新的开发板上仅需要修改和硬件相关的部分。在代码结构上:
1) 在board 目录下创建ev44b0ii 目录,创建ev44b0ii.c 以及flash.c,memsetup.S,u-bo
ot.lds等。不需要从零开始,可选择一个相似的目录,直接复制过来,修改文件名以及内
容。我在移植u-boot 过程中,选择的是ep7312 目录。由于u-boot 已经包含基于s3c24b0
的开发板目录,作为参考,也可以复制相应的目录。
2) 在cpu 目录下创建arm7tdmi 目录,主要包含start.S,interrupts.c 以及cpu.c,seria
l.c几个文件。同样不需要从零开始建立文件,直接从arm720t 复制,然后修改相应内容。
3) 在include/configs 目录下添加ev44b0ii.h,在这里放上全局的宏定义等。
4) 找到u-boot 根目录下Makefile 修改加入
ev44b0ii_config : unconfig
@./mkconfig $(@:_config=) arm arm7tdmi ev44b0ii
5) 运行make ev44bii_config,如果没有错误就可以开始硬件相关代码移植的工作
3. u-boot 的体系结构
1) 总体结构
u-boot 是一个层次式结构。从上图也可以看出,做移植工作的软件人员应当提供串口驱动
(UART Driver),以太网驱动(Ethernet Driver),Flash 驱动(Flash 驱动),USB 驱动(
USB Driver)。目前,通过USB 口下载程序显得不是十分必要,所以暂时没有移植USB 驱
动。驱动层之上是u-boot 的应用,command 通过串口提供人机界面。我们可以使用一些命
令做一些常用的工作,比如内存查看命令md。
Kermit 应用主要用来支持使用串口通过超级终端下载应用程序。TFTP 则是通过网络方式
来下载应用程序,例如uclinux 操作系统。
2) 内存分布
在flash rom 中内存分布图ev44b0ii 的flash 大小2M(8bits),现在将0-40000 共256k 作
为u-boot 的存储空间。由于u-boot 中有一些环境变量,例如ip 地址,引导文件名等,可
在命令行通过setenv 配置好,通过saveenv 保存在40000-50000(共64k)这段空间里。如
果存在保存好的环境变量,u-boot 引导将直接使用这些环境变量。正如从代码分析中可以
看到,我们会把flash 引导代码搬移到DRAM 中运行。下图给出u-boot 的代码在DRAM中的
位置。引导代码u-boot 将从0x0000 0000 处搬移到0x0C700000 处。特别注意的由于ev44
b0ii uclinux 中断向量程序地址在0x0c00 0000 处,所以不能将程序下载到0x0c00 0000
出,通常下载到0x0c08 0000 处。
4. start.S 代码结构
1) 定义入口
一个可执行的Image 必须有一个入口点并且只能有一个唯一的全局入口,通常这个入口放
在Rom(flash)的0x0 地址。例如start.S 中的
.globl _start
_start:
值得注意的是你必须告诉编译器知道这个入口,这个工作主要是修改连接器脚本文件(ld
s)。
2) 设置异常向量(Exception Vector)
异常向量表,也可称为中断向量表,必须是从0 地址开始,连续的存放。如下面的就包括
了复位(reset),未定义处理(undef),软件中断(SWI),预去指令错误(Pabort),数据错误(
Dabort),保留,以及IRQ,FIQ 等。注意这里的值必须与uclinux 的vector_base 一致。这
就是说如果uclinux 中vector_base(include/armnommu/proc-armv/system.h)定义为0x0c
00 0000,则HandleUndef 应该在
0x0c00 0004。
b reset //for debug
ldr pc,=HandleUndef
ldr pc,=HandleSWI
ldr pc,=HandlePabort
ldr pc,=HandleDabort
b .
ldr pc,=HandleIRQ
ldr pc,=HandleFIQ
ldr pc,=HandleEINT0 /*mGA H/W interrupt vector table*/
ldr pc,=HandleEINT1
ldr pc,=HandleEINT2
ldr pc,=HandleEINT3
ldr pc,=HandleEINT4567
ldr pc,=HandleTICK /*mGA*/
b .
b .
ldr pc,=HandleZDMA0 /*mGB*/
ldr pc,=HandleZDMA1
ldr pc,=HandleBDMA0
ldr pc,=HandleBDMA1
ldr pc,=HandleWDT
ldr pc,=HandleUERR01 /*mGB*/
b .
b .
ldr pc,=HandleTIMER0 /*mGC*/
ldr pc,=HandleTIMER1
ldr pc,=HandleTIMER2
ldr pc,=HandleTIMER3
ldr pc,=HandleTIMER4
ldr pc,=HandleTIMER5 /*mGC*/
b .
b .
ldr pc,=HandleURXD0 /*mGD*/
ldr pc,=HandleURXD1
ldr pc,=HandleIIC
ldr pc,=HandleSIO
ldr pc,=HandleUTXD0
ldr pc,=HandleUTXD1 /*mGD*/
b .
b .
ldr pc,=HandleRTC /*mGKA*/
b .
b .
b .
b .
b . /*mGKA*/
b .
b .
ldr pc,=HandleADC /*mGKB*/
b .
b .
b .
b .
b . /*mGKB*/
b .
b .
ldr pc,=EnterPWDN
作为对照:请看以上标记的值:
.equ HandleReset, 0xc000000
.equ HandleUndef,0xc000004
.equ HandleSWI, 0xc000008
.equ HandlePabort, 0xc00000c
.equ HandleDabort, 0xc000010
.equ HandleReserved, 0xc000014
.equ HandleIRQ, 0xc000018
.equ HandleFIQ, 0xc00001c
/*the value is different with an address you think it may be.
*IntVectorTable */
.equ HandleADC, 0xc000020
.equ HandleRTC, 0xc000024
.equ HandleUTXD1, 0xc000028
.equ HandleUTXD0, 0xc00002c
.equ HandleSIO, 0xc000030
.equ HandleIIC, 0xc000034
.equ HandleURXD1, 0xc000038
.equ HandleURXD0, 0xc00003c
.equ HandleTIMER5, 0xc000040
.equ HandleTIMER4, 0xc000044
.equ HandleTIMER3, 0xc000048
.equ HandleTIMER2, 0xc00004c
.equ HandleTIMER1, 0xc000050
.equ HandleTIMER0, 0xc000054
.equ HandleUERR01, 0xc000058
.equ HandleWDT, 0xc00005c
.equ HandleBDMA1, 0xc000060
.equ HandleBDMA0, 0xc000064
.equ HandleZDMA1, 0xc000068
.equ HandleZDMA0, 0xc00006c
.equ HandleTICK, 0xc000070
.equ HandleEINT4567, 0xc000074
.equ HandleEINT3, 0xc000078
.equ HandleEINT2, 0xc00007c
.equ HandleEINT1, 0xc000080
.equ HandleEINT0, 0xc000084
3) 初始化CPU 相关的pll,clock,中断控制寄存器
依次为关闭watch dog timer,关闭中断,设置LockTime,PLL(phase lock loop),以及时钟
。
这些值(除了LOCKTIME)都可从Samsung 44b0 的手册中查到。
ldr r0,WTCON //watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,INTMSK
ldr r1,MASKALL //all interrupt disable
str r1,[r0]
/*****************************************************
* Set clock control registers *
*****************************************************/
ldr r0,LOCKTIME
ldr r1,=800 // count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800
str r1,[r0]
ldr r0,PLLCON /*temporary setting of PLL*/
ldr r1,PLLCON_DAT /*Fin=10MHz,Fout=40MHz or 60MHz*/
str r1,[r0]
ldr r0,CLKCON
ldr r1,=0x7ff8 //All unit block CLK enable
str r1,[r0]
4) 初始化内存控制器
内存控制器,主要通过设置13 个从1c80000 开始的寄存器来设置,包括总线宽度,
8 个内存bank,bank 大小,sclk,以及两个bank mode。
/*****************************************************
* Set memory control registers *
*****************************************************/
memsetup:
adr r0,SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 //BWSCON Address
stmia r0,{r1-r13}
5) 将rom 中的程序复制到RAM 中
首先利用PC 取得bootloader 在flash 的起始地址,再通过标号之差计算出这个程序代
码的大小。这些标号,编译器会在连接(link)的时候生成正确的分布的值。取得正
确信息后,通过寄存器(r3 到r10)做为复制的中间媒介,将代码复制到RAM 中。
relocate:
/*
* relocate armboot to RAM
*/
adr r0, _start /* r0 <- current position of code */
ldr r2, _armboot_start
ldr r3, _armboot_end
sub r2, r3, r2 /* r2 <- size of armboot */
ldr r1, _TEXT_BASE /* r1 <- destination address */
add r2, r0, r2 /* r2 <- source end address */
/*
* r0 = source address
* r1 = target address
* r2 = source end address
*/
copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop
6) 初始化堆栈
进入各种模式设置相应模式的堆栈。
InitStacks:
/*Don't use DRAM,such as stmfd,ldmfd......
SVCstack is initialized before*/
mrs r0,cpsr
bic r0,r0,#0X1F
orr r1,r0,#0xDB /*UNDEFMODE|NOINT*/
msr cpsr,r1 /*UndefMode*/
ldr sp,UndefStack
orr r1,r0,#0XD7 /*ABORTMODE|NOINT*/
msr cpsr,r1 /*AbortMode*/
ldr sp,AbortStack
orr r1,r0,#0XD2 /*IRQMODE|NOINT*/
msr cpsr,r1 /*IRQMode*/
ldr sp,IRQStack
orr r1,r0,#0XD1 /*FIQMODE|NOINT*/
msr cpsr,r1 /*FIQMode*/
ldr sp,FIQStack
bic r0,r0,#0XDF /*MODEMASK|NOINT*/
orr r1,r0,#0X13
msr cpsr,r1 /*SVCMode*/
ldr sp,SVCStack
7) 转到RAM 中执行
使用指令ldr,pc,RAM 中C 函数地址就可以转到RAM 中去执行。
5. 系统初始化部分
1. 串口部分
串口的设置主要包括初始化串口部分,值得注意的串口的Baudrate 与时钟MCLK 有很大关
系,是通过:rUBRDIV0=( (int)(MCLK/16./(gd ->baudrate) + 0.5) -1 )计算得出。这可
以在手册中查到。其他的函数包括发送,接收。这个时候没有中断,是通过循环等待来判
断是否动作完成。
例如,接收函数:
while(!(rUTRSTAT0 & 0x1)); //Receive data read
return RdURXH0();
2. 时钟部分
实现了延时函数udelay。
这里的get_timer 由于没有使用中断,是使用全局变量来累加的。
3. flash 部分
flash 作为内存的一部分,读肯定没有问题,关键是flash 的写部分。
Flash 的写必须先擦除,然后再写。
unsigned long flash_init (void)
{
int i;
u16 manId,devId;
//first we init it as unknown,even if you forget assign it below,it's not a pr
oblem
for (i=0; i < CFG_MAX_FLASH_BANKS; ++i){
flash_info[i].flash_id = FLASH_UNKNOWN;
flash_info[i].sector_count=CFG_MAX_FLASH_SECT;
}
/*check manId,devId*/
_RESET();
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0x90);
manId=_RD(0x0);
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0x90);
devId=_RD(0x1);
_RESET();
printf("flashn");
printf("Manufacture ID=%4x(0x0004), Device ID(0x22c4)=%4xn",manId,devId);
if(manId!=0x0004 && devId!=0x22c4){
printf("flash check faliluren");
return 0;
}else{
for (i=0; i < CFG_MAX_FLASH_BANKS; ++i){
flash_info[i].flash_id=FLASH_AM160T;/*In fact it is fujitu,I _disibledevent="_blank" href="http://sourceforge.net/projects/U-Boot上获得;">http://sourceforge.net/projects/U-Boot上获得;
② 阅读相关文档,主要是U-Boot源码根目录下的README文档和U-Boot官方网站的DULG(T
he DENX U-Boot and Linux Guide)文档http://www.denx.de/twiki/bin/view/DULG/Man
ual。尤其是DULG文档,从如何安装建立交叉开发环境和解决U-Boot移植中常见问题都一一
给出详尽的说明;
③ 订阅U-Boot用户邮件列表http://lists.sourceforge.net/lists/listinfo/u-boot-us
ers。在移植U-Boot过程中遇有问题,在参考相关文档和搜索U-Boot-User邮件档案库http
://sourceforge.net/mailarchive/forum.php?forum_id=12898仍不能解决的情况下,第一
时间提交所遇到的这些问题,众多热心的U-Boot开发人员会乐于迅速排查问题,而且很有
可能,W.D本人会直接参与指导;
④ 在建立的开发环境下进行移植工作。绝大多数的开发环境是交叉开发环境。在这方面,
DENX 和MontaVista均提供了完整的开发工具集;
⑤ 在目标板与开发主机间接入硬件调试器。这是进行U-Boot移植应当具备且非常关键的调
试工具。因为在整个U-Boot的移植工作中,尤其是初始阶段,硬件调试器是我们了解目标板
真实运行状态的唯一途径。在这方面,W.D本人和众多嵌入式开发人员倾向于使用BDI2000
。一方面,其价格不如ICE调试器昂贵,同时其可靠性高,功能强大,完全能胜任移植和调
试U-Boot。另外,网上也有不少关于BDI2000调试方面的参考文档。
⑥ 如果在参考开发板上移植U-Boot,可能需要移除目标板上已有的BOOT LOADER。可以根
据板上BOOT LOADER的说明文档,先着手解决在移除当前BOOT LOADER的情况下,如何进行
恢复。以便今后在需要场合能重新装入原先的BOOT LOADER。
5 U-Boot移植方法
当前,对于U-Boot的移植方法,大致分为两种。一种是先用BDI2000创建目标板初始运行环
境,将U-Boot镜像文件u-boot.bin下载到目标板RAM中的指定位置,然后,用BDI2000进行
跟踪调试。其好处是不用将U-Boot镜像文件烧写到FLASH中去。但弊端在于对移植开发人员
的移植调试技能要求较高,BDI2000的配置文件较为复杂。另外一种方法是用BDI2000先将
U-Boot镜像文件烧写到FLASH中去,然后利用GDB和BDI2000进行调试。这种方法所用BDI20
00的配置文件较为简单,调试过程与U-Boot移植后运行过程相吻合,即U-Boot先从FLASH中
运行,再重载至RAM中相应位置,并从那里正式投入运行。唯一感到有些麻烦的就是需要不
断烧写FLASH。但考虑到FLASH常规擦写次数基本为10万次左右,作为移植U-Boot,不会占
用太多的次数,应该不会为FLASH烧写有什么担忧。同时,W. D本人也极力推荐使用后一种
方法。笔者建议,除非U-Boot移植资深人士或有强有力的技术支持,建议采用第二种移植
方法。
6 U-Boot移植主要修改的文件
从移植U-Boot最小要求-U-Boot能正常启动的角度出发,主要考虑修改如下文件:
① <目标板>.h头文件,如include/configs/RPXlite.h。可以是U-Boot源码中已有的目标
板头文件,也可以是新命名的配置头文件;大多数的寄存器参数都是在这一文件中设置完
成的;
② <目标板>.c文件,如board/RPXlite/RPXlite.c。它是SDRAM的驱动程序,主要完成SDR
AM的UPM表设置,上电初始化。
③ FLASH的驱动程序,如board/RPXlite/flash.c,或common/cfi_flash.c。可在参考已有
FLASH驱动的基础上,结合目标板FLASH数据手册,进行适当修改;
④ 串口驱动,如修改cpu/mpc8xx/serial.c串口收发器芯片使能部分。
7 U-Boot移植要点
① BDI2000的配置文件。如果采用第二种移植方法,即先烧入FLASH的方法,配置项只需很
少几个,就可以进行U-Boot的烧写与调试了。对PPC 8xx系列的主板,可参考DULG文档中T
QM8xx的配置文件进行相应的修改。下面,笔者以美国Embedded Planet公司的RPXlite DW
板为例,给出在嵌入式Linux交叉开发环境下的BDI2000参考配置文件以作参考:
; bdiGDB configuration file for RPXlite DW or LITE_DW
; --------------------------------------------
[INIT]
; init core register
WSPR 149 0x2002000F ;DER : set debug enable register
; WSPR 149 0x2006000F ;DER : enable SYSIE for BDI flash program
WSPR 638 0xFA200000 ;IMMR : internal memory at 0xFA200000
WM32 0xFA200004 0xFFFFFF89 ;SYPCR
[TARGET]
CPUCLOCK 40000000 ;the CPU clock rate after processing the init list
BDIMODE AGENT ;the BDI working mode (LOADONLY | AGENT)
BREAKMODE HARD ;SOFT or HARD, HARD uses PPC hardware breakpoints
[HOST]
IP 173.60.120.5
FILE uImage.litedw
FORMAT BIN
LOAD MANUAL ;load code MANUAL or AUTO after reset
DEBUGPORT 2001
START 0x0100
[FLASH]
CHIPTYPE AM29BX8 ;;Flash type (AM29F | AM29BX8 | AM29BX16 | I28BX8 | I28BX16)
CHIPSIZE 0x400000 ;;The size of _disibledevent="0" cellpadding="0" width="100%" border="0" style="border-collapse: collapse; word-wrap: break-word">
《关于u-boot移植的一点记录》
拿到一款新的cpu ,我们到底药怎么作呢?
首先是看datasheet , 第一, 就是要看datasheet 里面的memory map 。 Memory map 里面最打紧的就是 SDRAM的起始地址。这对于我们来说很重要的。
当然在u-boot第一阶段我们还要对SDRAM进行初始化。 SDRAM初始化的过程:
Initialization and mode register setting - The SDRAM device needs to be initialized after power-up, and before applied application _disibledevent="margin: 0pt 0pt 0pt 18pt; text-indent: -18pt; text-align: left" align="left">- The SDR-SDRAM controller follows the JEDEC-recommended SDR-SDRAM initialization sequence as follows: 1. 最少延迟100usMaintain stable clock, and NOP input conditions for a minimum of “t_init” clock cycles (about 100us). 2. 发送预充电命令Issue pre-charge commands for all banks of the device. 3. 发送自动刷新的命令Issue auto-refresh commands to SDRAM device. 4. 发送设置模式寄存器命令来设置SDRAM的模式寄存器Issue a set-mode register command to initialize the mode register of SDRAM device. 5. 发送扩展模式寄存器命令。Issue a set-extended-mode register command to initialize the extended-mode register of SDRAM device l In step 1, hardware will apply a stable clock with NOP commands to SDRAM device after power reset, but 100usec waiting time needs to be count by software. l After the 100usec, software needs to set the enable bit of initialization; so that step 2 and 3 could be carried out by hardware. The enable will be clear by hardware while step 2 and 3 have been finished. l Software needs to set enble bit of mode register setting to have hardware carry out step 4. The enable bit will be clear automatically after hardware finish the mode register setting to SDRAM device. l Software needs to set enble bit of extended mode register setting to have hardware carry out step 5. The enable bit will be clear automatically after hardware finish the extended mode register setting to SDRAM device. l The SDRAM controller performs an initialization sequence of the SDRAM under 2 circumstances: (1) Immediately after power-on-reset (2) When exit from deep power down mode. l All SDRAM read/write requests during initialization will be pending until the initialization is finished.
2. 本身的搬移。 u-boot U-boot 在启动的过程要把flash中的u-boot 搬移到SDRAM中去。
__bss_start - _start 才是u-boot的大小
#ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate: /* relocate U-Boot to RAM */ adr r0, _start /* r0 <- current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ beq stack_setup
ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 /* r2 <- size of armboot */ 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 /* CONFIG_SKIP_RELOCATE_UBOOT */
/* Set up the stack */ stack_setup: ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ sub r0, r0, #CFG_MALLOC_LEN /* malloc area , I have modifed this macro in ixdk0015.h to fit for SDRAM and SRAM */ //sub r0, r0, #0xa000 /* malloc area 40kB*/ sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo 128bytes */
#ifdef CONFIG_USE_IRQ // sub r0, r0, #(256 + 1024) sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) //256+0 |