单板选择NandFlash启动,则硬件上电后,系统会自动将NandFlash中的前4K内容拷贝到STEPSTONE即4K SRAM中,然后从SRAM中的0X0地址启动。基于mini2440的简易bootloader制作方法在上一篇文章中有提到,它编译出的boot.bin只有1.96KB,小于STEPSTONE的4KB,因此我们可以考虑将bootloader从nandflash拷贝到内存这一步给省略掉。
一、编辑start.S:
- .text
- .global _start
- _start:
-
-
- ldr r0, =0x53000000
- mov r1, #0
- str r1, [r0]
-
- @关闭看门狗
- @数据手册:WTCON 0x53000000 R/W Watchdog timer control register
-
-
- ldr r0, =0x4c000014
- mov r1, #0x03; @ FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
- str r1, [r0]
-
- mrc p15, 0, r1, c1, c0, 0
- orr r1, r1, #0xc0000000
- mcr p15, 0, r1, c1, c0, 0
-
- ldr r0, =0x4c000004
- ldr r1, =((0x5c<<12)|(0x01<<4)|(0x02)) @MPLL:200MHz
- str r1, [r0]
-
- @设置系统时钟
- @如果HDIVN不是0,CPU的总线模式应该设置成asynchronous bus mode
-
-
- mrc p15, 0, r0, c1, c0, 0 @ read control register
- orr r0, r0, #(1<<12)
- mcr p15, 0, r0, c1, c0, 0 @ write back
-
- @使能高速缓存,为系统提速,此段可不要,但程序执行速度要慢
-
-
- ldr r0, =0x48000000 @MEM_CTL_BASE
- adr r1, config
- add r3, r0, #(52) @13*4
- 1:
- ldr r2, [r1], #4
- str r2, [r0], #4
- cmp r0, r3
- bne 1b
-
- @初始化SDRAM
- @根据数据手册对与SDRAM有关的13个寄存器进行配置
-
-
- ldr sp, =0x34000000
- bl nand_init
-
-
-
-
-
-
-
- bl clear_bss
-
- @把bootloader本身的代码从nandflash复制到它的链接地址去
-
-
- ldr lr, =halt
- ldr pc, =main
- halt:
- b halt
-
- @跳转到main函数执行
-
- config:
- .long 0x22011110 @BWSCON
- .long 0x00000700 @BANKCON0
- .long 0x00000700 @BANKCON1
- .long 0x00000700 @BANKCON2
- .long 0x00000700 @BANKCON3
- .long 0x00000700 @BANKCON4
- .long 0x00000700 @BANKCON5
- .long 0x00018005 @BANKCON6
- .long 0x00018005 @BANKCON7
- .long 0x008C04F4 @REFRESH
- .long 0x000000B1 @BANKSIZE
- .long 0x00000030 @MRSRB6
- .long 0x00000030 @MRSRB7
注释掉:
-
-
-
-
-
-
二、编辑boot.lds:
- SECTIONS {
- . = 0x00000000;
- .text : { *(.text) }
-
- . = ALIGN(4);
- .rodata : {*(.rodata*)}
-
- . = ALIGN(4);
- .data : { *(.data) }
-
- . = ALIGN(4);
- __bss_start = .;
- .bss : { *(.bss) *(COMMON) }
- __bss_end = .;
- }
将0x33f80000改为0x00000000。
三、make之后将生成的boot.bin下载到nandflash中,可以成功引导内核。