從NAND Flash啟動的原理很簡單,就是利用S3C2440內部4K大小的SRAM,存儲在NAND Flash中的代碼不能被執行,而S3C2440在從NAND Flash啟動把NAND Flash的前4k代碼復制到SRAM中運行,U-boot支持從NAND Flash啟動的方法就是利用這前4K代碼完成SDRAM的初始化(SDRAM有64M),然後還要完成從U-boot代碼從NAND Flash中復制到SDRAM中,然後再跳轉到SDRAM中去運行完整的U-boot。
為了便於系統啟動的方便,可以在start.S文件中添加代碼以識別系統是從NAND Flash啟動還是從NOR Flash啟動,從S3C2440芯片手冊中可以看到
到OM[1:0]都為0時,說明是從NAND Flash啟動,01和10都是從NOR Flash啟動,OM[1:0]就是寄存器BWSCON的第2位~第1位(DW0)
一、添加NOR Flash啟動和NAND Flash啟動的識別
修改arch/arm/cpu/arm920t/start.S,首先將217行附近修改為:
- #ifndef CONFIG_SKIP_LOWLEVEL_INIT
- bl cpu_init_crit
- #endif
-
- #define BWSCON 0x48000000
- ldr r0, =BWSCON
- ldr r0, [r0]
- ands r0, r0, #0x6
- tst r0, #0x0
- bne norflash_boot /*OM[1:0] != 0, 跳轉到NOR FLASH 啟動處*/
- /*判斷uboot是從nand flash啟動還是從 nor flash啟動*/
在220行附近將:
- #ifndef CONFIG_SKIP_RELOCATE_UBOOT
- relocate:
修改為
- norflash_boot:
- #ifndef CONFIG_SKIP_RELOCATE_UBOOT
- relocate:
二、添加NAND Flash的U-boot代碼從NAND FLash到SDRAM搬移的代碼
在前面修改的 bne norflash_boot ,227行後添加
- /*****************************nand boot**************************/
- nandflash_boot:
- #define LENGTH_UBOOT 0x40000
- #define NAND_CTL_BASE 0x4e000000
- #define oNFCONF 0x00
- #define oNFCONT 0x04
- #define oNFCMD 0x08
- #define oNFSTAT 0x20
-
- @reset NAND
- mov r1,#NAND_CTL_BASE
- ldr r2,=((7<<12)|(7<<8)|(7<<4))
- str r2,[r1,#oNFCONF]
- ldr r2,[r1,#oNFCONF]
-
- ldr r2,=((1<<4)|(1<<1)|(1<<0)) @Active low CE control
- str r2,[r1,#oNFCONT]
- ldr r2,[r1,#oNFCONT]
-
- @ get read to call C functions
- ldr sp,DW_STACK_START @setup stack point
- mov fp,#0 @no previous frame, so fp = 0
-
- @copy Uboot to ram
- ldr r0, =TEXT_BASE
- mov r1,#0x0
- mov r2,#LENGTH_UBOOT
- bl nand_read_ll
- tst r0,#0x0
- beq ok_nand_read
-
- bad_nand_read:
- loop2:
- b loop2 @infinite loop
-
- ok_nand_read:
- @verify
- mov r0,#0
- ldr r1,=TEXT_BASE
- mov r2,#0x400 @ compare 4k code from sram to sdram
-
- go_next:
- ldr r3, [r0], #4
- ldr r4, [r1], #4
- teq r3, r4
- bne notmatch
- subs r2,r2,#4
- tst r2,#0x0 @do not forget the instruction if have not this command the uboot can't break the loop
- beq stack_setup
- bne go_next
-
- notmatch:
- loop3:
- b loop3 @infinite loop
- /*****************************nand boot**************************/
上面這部分代碼首先初始化了NAND Flash寄存器,然後進行了一個函數調用(這個函數中完成了代碼搬移)後面則是對復制出來的數據進行一個簡單的校驗。在327行附近添加為:
- _start_armboot: .word start_armboot
- #define STACK_BASE 0x33f00000
- #define STACK_SIZE 0x10000
- .align 2
- DW_STACK_START: .word STACK_BASE+STACK_SIZE-4
添加函數的棧調用空間
相關閱讀:
U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm
FL2440的U-boot-2010.09移植(一)http://www.linuxidc.com/Linux/2012-06/63755.htm
FL2440的U-boot-2010.09移植(二)http://www.linuxidc.com/Linux/2012-06/63756.htm
FL2440的U-boot-2010.09移植(三)DM9000網卡及開發板相關配置 http://www.linuxidc.com/Linux/2012-07/64155.htm
FL2440的U-boot-2010.09移植(四) 添加NOR FLash啟動支持 http://www.linuxidc.com/Linux/2012-07/64156.htm
FL2440的U-boot-2010.09移植(五)uboot架構中NAND FLash驅動修改 http://www.linuxidc.com/Linux/2012-07/64157.htm
FL2440的U-boot-2010.09移植(六)NAND FLash啟動支持 http://www.linuxidc.com/Linux/2012-07/641587.htm
FL2440的U-boot-2010.09移植(七)LCD的支持 http://www.linuxidc.com/Linux/2012-07/641587.htm
針對FL2440開發板的u-boot-2010.09版本補丁 http://www.linuxidc.com/Linux/2012-07/64116.htm