首页 > 代码库 > (二)识别NAND Flash Nor Flash

(二)识别NAND Flash Nor Flash

检测步骤:在启动的时候,将0x4000003c位置开始的四个字节清零,然后读取0x0000003c位置开始的四个字节。

        如果回读的结果为零,说明是Nand boot,否则就是Nor boot

 修改start.S

  第90 行左右添加一个Flash 启动标志,从Nand 启动时将其设置为0 ,从Nor 启动时将其设置为1

  1. .globl _bss_start  
  2. _bss_start:  
  3. .word __bss_start  
  4. .globl _bss_end  
  5. _bss_end:  
  6. .word _end  
  7. .globl bBootFrmNORFlash  
  8. bBootFrmNORFlash:  
  9. .word 0 
从第224 行左右开始,添加代码为:  
  判断当前代码位置,如果在内存,直接跳到stack_setup 
  1.  #ifndef CONFIG_SKIP_LOWLEVEL_INIT  
  2. bl cpu_init_crit  
  3. #endif  
  4. /***************** CHECK_CODE_POSITION***************************************/  
  5. adr r0, _start  /* r0 <- current position of code */  
  6. 11  
  7. ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */  
  8. cmp r0, r1  /* don‘t reloc during debug */  
  9. beq stack_setup  
  10. /***************** CHECK_CODE_POSITION*************************************/ 

 如果代码当前位置不在内存中,就判断启动方为Nand Flash 或者Nor Flash

  1. /***************** CHECK_BOOT_FLASH ******************************************/  
  2. ldr r1, =( (4<<28)|(3<<4)|(3<<2) )  /* address of Internal SRAM 0x4000003C*/  
  3. mov  r0, #0  /* r0 = 0 */  
  4. str r0, [r1]  
  5. mov  r1, #0x3c  /* address of 0x0000003C*/  
  6. ldr r0, [r1]  
  7. cmp r0, #0 /* 判断0x0000003C所指向的4个字节是否被清0*/  
  8. bne relocate /* 没有被清0,就是在Nor Flash中启动,则跳到Nor Flash的重定向代码处relocate*/  
  9. /* recovery */  
  10. ldr r0, =(0xdeadbeef) /* 被清0,就是在Nand Flash中启动*/  
  11. ldr r1, =( (4<<28)|(3<<4)|(3<<2) ) /* 恢复0x4000003C指向的4字节的数据0xdeadbeef*/  
  12. str r0, [r1]  
  13. /***************** CHECK_BOOT_FLASH ******************************************/

 

 

  在Nand Flash 中启动的话,那么Nand Flash 搬移代码如下:

 

定义u-boot在Nand flash中存放的长度为#define LENGTH_UBOOT 0x100000,可以方便修改
u-boot因为裁剪和增添大小的改变而占的长度
  1. /***************** NAND_BOOT *************************************************/  
  2. #define LENGTH_UBOOT 0x100000  
  3. #define NAND_CTL_BASE 0x4E000000  
  4.   
  5. #ifdef CONFIG_S3C2440  
  6. /* Offset */  
  7. #define oNFCONF 0x00  
  8. #define oNFCONT 0x04  
  9. #define oNFCMD  0x08  
  10. #define oNFSTAT 0x20  
  11.   
  12.     @ reset NAND  
  13.     mov  r1, #NAND_CTL_BASE  
  14.     ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )  
  15.     str r2, [r1, #oNFCONF]  
  16.     ldr r2, [r1, #oNFCONF]  
  17.   
  18.     ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control  
  19.     str r2, [r1, #oNFCONT]  
  20.     ldr r2, [r1, #oNFCONT]  
  21.   
  22.     ldr r2, =(0x6)  @ RnB Clear  
  23.     str r2, [r1, #oNFSTAT]  
  24.     ldr r2, [r1, #oNFSTAT]  
  25.   
  26.     mov  r2, #0xff  @ RESET command  
  27.     strb r2, [r1, #oNFCMD]  
  28.       
  29.     mov  r3, #0  @ wait  
  30. nand1:  
  31.     add r3, r3, #0x1  
  32.     cmp r3, #0xa  
  33.     blt nand1  
  34.   
  35. nand2:  
  36.     ldr r2, [r1, #oNFSTAT] @ wait ready  
  37.     tst r2, #0x4  
  38.     beq nand2  
  39.   
  40.     ldr r2, [r1, #oNFCONT]  
  41.     orr r2, r2, #0x2 @ Flash Memory Chip Disable  
  42.     str r2, [r1, #oNFCONT]  
  43.   
  44.     @ get read to call C functions (for nand_read())  
  45.     ldr sp, DW_STACK_START  @ setup stack pointer  
  46.     mov  fp, #0  @ no previous frame, so fp=0  
  47.   
  48.     @ copy U-Boot to RAM  
  49.     ldr r0, =TEXT_BASE  
  50.     mov  r1, #0x0  
  51.     mov  r2, #LENGTH_UBOOT  
  52.     bl nand_read_ll  
  53.     tst r0, #0x0  
  54.     beq ok_nand_read  
  55.   
  56. bad_nand_read:  
  57. loop2:  
  58.     b  loop2  @ infinite loop  
  59. ok_nand_read:  
  60.     @ verify  
  61.     mov  r0, #0  
  62.     ldr r1, =TEXT_BASE  
  63.     mov  r2, #0x400 @ 4 bytes * 1024 = 4K-bytes  
  64. go_next:  
  65.     ldr r3, [r0], #4  
  66.     ldr r4, [r1], #4  
  67.     teq r3, r4  
  68.     bne notmatch  
  69.     subs  r2, r2, #4  
  70.     beq stack_setup  
  71.     bne go_next  
  72.   
  73. notmatch:  
  74. loop3:  
  75.     b  loop3  @ infinite loop  
  76. #endif  
  77. /***************** NAND_BOOT *************************************************/

 

   在Nor Flash 中启动的话,那么Nor Flash 搬移代码如下:

 

  1. /***************** NOR_BOOT *************************************************/  
  2. relocate: /* relocate U-Boot to RAM  */  
  3. /*********** CHECK_FOR_MAGIC_NUMBER***************/  
  4.     ldr r1, =(0xdeadbeef)  
  5.     cmp r0, r1  
  6.     bne loop3  
  7. /*********** CHECK_FOR_MAGIC_NUMBER***************/  
  8.     adr r0, _start  /* r0 <- current position of code */  
  9.     ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */  
  10.     ldr r2, _armboot_start  
  11.     ldr r3, _bss_start  
  12.     sub r2, r3, r2  /* r2 <- size of armboot */  
  13.     add r2, r0, r2  /* r2 <- source end address */  
  14. copy_loop:  
  15.     ldmia  r0!, {r3-r10} /* copy from source address [r0] */  
  16.     stmia  r1!, {r3-r10} /* copy to target address [r1] */  
  17.     cmp r0, r2  /* until source end addreee [r2] */  
  18.     ble copy_loop  
  19. SetBootFlag:  
  20.     ldr r0, =bBootFrmNORFlash  
  21.     mov r1, #1 /*从Nor启动,将标志设置为1*/  
  22.     str r1, [r0]  
  23. /***************** NOR_BOOT *************************************************/  

  将下面的代码全部删掉:

  1. #ifndef CONFIG_SKIP_RELOCATE_UBOOT  
  2. relocate: /* relocate U-Boot to RAM  */  
  3.     adr r0, _start  /* r0 <- current position of code */  
  4.     ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */  
  5.     cmp r0, r1  /* don‘t reloc during debug */  
  6.     beq stack_setup  
  7.     ldr r2, _armboot_start  
  8.     ldr r3, _bss_start  
  9.     sub r2, r3, r2  /* r2 <- size of armboot */  
  10.     add r2, r0, r2  /* r2 <- source end address */  
  11. copy_loop:  
  12.     ldmia  r0!, {r3-r10} /* copy from source address [r0] */  
  13.     stmia  r1!, {r3-r10} /* copy to target address [r1] */  
  14.     cmp r0, r2  /* until source end addreee [r2] */  
  15.     ble copy_loop  
  16. #endif /* CONFIG_SKIP_RELOCATE_UBOOT *

  第378 行左右添加代码:

  1. _start_armboot: .word start_armboot  
  2. #define STACK_BASE 0x33f00000  
  3. #define STACK_SIZE 0x10000  
  4. .align  2  
  5. DW_STACK_START: .word  STACK_BASE+STACK_SIZE-4 

 

(二)识别NAND Flash Nor Flash