程序代码从Flash复制到SDRAM
1、先分辨是Nor Flash启动还是Nand Flash启动。
巧妙利用Nor Flash的特点:Nor Flash,它可以像内存一样读,但不能像内存一样写。
访问0地址,可不可以写?Nor 启动:不能简单的写;Nand 启动:0地址是4K RAM内存,内存可以写。
2、然后用某些函数把程序(bootloader)复制到链接地址来。
boot.lds(链接脚本)
SECTIONS {
. = 0x33f80000;
.text : { *(.text) }
. = ALIGN(4);
.rodata : {*(.rodata*)}
. = ALIGN(4);
.data { *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) *(COMMON) }
__bss_end = .;
}
start.S(汇编代码)
/* 4. 重定位 : 把bootloader本身代码从flash复制到它的链接地址去 */
ldr sp, =0x34000000
mov r0, #0
ldr r1, =_start //_start = 0x33f80000
ldr r2, =__bss_start //因为bss段存放的是一些初始化为0的全局变量,所以bss段前面的就是二进制文件的内容
sub r2, r2, r1
bl copy_code_sdram //r0,r1,r2对应3个参数
bl clear_bss
init.c(C函数)
int isBootFromNorFlash(void)
{
volatile int *p = (volatile int *)0;
int val;
val = *p;
*p = 0x12345678;
if(*p == 0x12345678)
{
/* 写成功,是nand启动 */
*p = val;
return 0;
}
else
{
/* NOR不能像内存一样写 */
return 1;
}
}
void copy_code_sdram(unsigned char *src, unsigned char *dest, unsigned int led)
{
int i=0;
/* 如果是NOR启动 */
if(isBootFromNorFlash())
{
while(i < len)
{
dest[i] = src[i]; //从源地址读出一个值,存给目的地址
i++;
}
}
else
{
nand_init();
nand_read(src, dest, len);
}
}