裸机程序SD卡启动BL1拷贝BL2到DDR2中运行;
代码的拷贝会用到一些指针函数,第一个参数为SD卡存放BL2的开始BLOCK,第二个参数为BL2大小有几个BLOCK,第三个参数为BL2拷贝到的目的地址,第四个参数为外部晶振大小,irom会根据其将EPLL设为25MHz,第三个参数设为0。
MMC Copy Function Address Exermal source clock parameter is used to fit EPLL source at 25MHZ*This function copy MMC(MoviNAND/iNand)Card Date to memory*Always use EPLL source clock*This function work at 25MHZ*@param u32 StartBlkAddress:source card (MoviNAND/iNand MMC)Address.(It must block address)*@param u16 blockSize:Number of blocks to copy*@param u32*memoryptr:Buffer to copy from*@param u32extClockspeed:External clock speed(per HZ)*@param bool with_init:determined card initialization*@Return bool(u8)-success or failure #define copyMovitoMen (a,b,c,d,e)(bool(*)(u32,u16,u32*,u32,bool))
(*(u32*)0x40004008)(a,b,c,d,e)
BL1 copy:
#include "types.h"
typedef u32(*copy_sd_mmc_to_mem)(u32 startBlkAdress,u16 blockSize,u32*memoryPtr,u32 extClockSpeed,u32 init);
void copy_sd(u32 start_block,u16 block_size,u32 addr)
{
copy_sd_mmc_to_mem copy_b12=(copy_sd_mmc_to_mem)(*(u32*)(0x40004008));
copy_b12(start_block,block_size,(u32*)addr,1200000,0);
}
BL1 main:
#include "uart.h"
int main ()
{
puts("n##### s3s2451 Running in bl1 #####");
copy_sd(8,2,0x30000000);
return 0;
}
BL1 start.S:
.global _start /* 声明一个全局的标号 */
_start:
bl uart_init /* 串口初始化 */
bl ddr_init /* DDR初始化 */
bl main /* 跳转到C函数去执行 */
ldr sp, =0x34000000 /* 重新设在栈为DDR内存的最高地址 */
ldr pc, =0x30000000 /* 跳转到bl2的起始地址执行 */
halt:
b halt
BL1 Makefile:
OBJ =b11
$(OBJ).bin:start.o,uart.o,add.o,copy.o,main.o;
ARM-linux-ld-Text-0,binary$(OBJ).elf $@; arm-linux-objdump-D $(OBJ).elf>$(OBJ).dis;
%.o:%.c
arm-linux-gcc-c$<-o$@-fno-builtin;
%.o:%.s
arm-linux-gcc-c$<-o$@ ;
clean:
rm*.o*.elf*.bin*.dis
BL2 Makefile:
b12.bin:start.o led.o
arm-linux-ld -text 0x3000000 -o led.elf$@;
arm-linux-objcopy-o binary led.elf $@ ;
arm-linux-objdump-D led.elf>led.dis ;
led.o:main.c
arm-linux-gcc -c $<-o $@ ;
start.o:start.S
arm-linux-gcc -c $<-o $@ ;
clean:
rm*.o*.elf*.bin*.dis ;