Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395079
  • 博文数量: 69
  • 博客积分: 1992
  • 博客等级: 上尉
  • 技术积分: 1162
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 19:50
文章分类
文章存档

2015年(1)

2011年(55)

2010年(13)

分类: LINUX

2011-03-22 20:00:46

这里用的方法,见下面的博客:

主要就是读OM1 OM0的值,若为00,则是nand启动,若不为0,则为nor启动。
主要就是修改start.s代码:
  1. /******************************************************************
  2. *定义各模式堆栈空间
  3. *******************************************************************/
  4. .equ    FIQ_STACK,        0x36FFF000
  5. .equ    IRQ_STACK,        0x36FFE000
  6. .equ    ABORT_STACK,    0x36FFD000
  7. .equ    UNDEFINE_STACK,    0x36FFC000
  8. .equ    USER_STACK,        0x36FFB000
  9. .equ    SVC_STACK,        0x36FFA000
  10. /******************************************************************
  11. *中断向量表
  12. *******************************************************************/
  13. .text
  14. .global    _start
  15. _start:    b    start_code                        @0x00,复位异常
  16.         ldr    pc, undefined_instruction        @0x04,未定义指令异常
  17.         ldr pc, software_interrupt            @0x08,软中断
  18.         ldr pc, prefetch_abort                @0x0c,指令预取终止异常
  19.         ldr    pc, data_abort                    @0x10,数据访问终止异常
  20.         ldr    pc, not_used                    @0x14,保留
  21.         ldr    pc, irq                            @0x18,中断
  22.         ldr    pc, fiq                            @0x1c,快速中断
  23. /******************************************************************
  24. *代码开始
  25. *******************************************************************/
  26. start_code:
  27.         mrs r0, cpsr                        @设置为管理模式
  28.         bic r0, r0, #0x1F                    @ARM指令,禁止中断
  29.         orr r0, r0, #0xD3                    
  30.         msr cpsr, r0

  31.         ldr r0, =0x53000000                    @关闭看门狗
  32.         mov r1, #0x0
  33.         str r1, [r0]
  34.         
  35.         ldr r0, =0x4C000014                    @设置时钟分频比
  36.         mov r1, #0x05                        @FCLK:HCLK:PCLK = 1:4:8
  37.         str r1, [r0]                        
  38.         
  39.         mrc p15, 0, r0, c1, c0, 0            @如果HDIVN不为0,使其从
  40.         orr r0, r0, #0xC0000000                @由快总线模式变为异步总线模式
  41.         mcr p15, 0, r0, c1, c0, 0

  42.         ldr r0, =0x4C000008                    @设置UCLK=48MHz
  43.         ldr r1, =0x00038022                    @(56<<12)|(2<<4)|(2)
  44.         str r1, [r0]

  45.         ldr r0, =0x4C000004                    @设置FCLK=400MHz
  46.         ldr r1, =0x0005C011                    @(92<<12)|(1<<4)|(1)            
  47.         str    r1, [r0]

  48.         mov r1, #0x48000000                    @设置SDRAM
  49.         adrl r2, mem_cfg_val
  50.         add r3, r1, #52
  51. 1:
  52.         ldr r4, [r2], #4
  53.         str r4, [r1], #4
  54.         cmp r1, r3
  55.         bne 1b
  56. /******************************************************************
  57. *判断是从norflash启动还是从nandflash启动,复制代码到SDRAM,跳入第二阶段执行
  58. *******************************************************************/        
  59.         #define BWSCON 0x48000000            //判断是从norflash启动还是从nandflash启动
  60.         ldr r0, =BWSCON                        //若OM1:OM0 = 00则从nandflash启动
  61.         ldr r0, [r0]
  62.         ands r0, r0, #6
  63.         cmp r0, #0
  64.         bne relocate                        //不为0则从norflash启动
  65.         
  66.         ldr sp, =4096                        //从nandflash启动,复制代码到SDRAM
  67.         bl s3c2440_nand_init
  68.         ldr r0, =0x30000000
  69.         mov r1, #4096
  70.         mov    r2, #2048
  71.         bl s3c2440_nand_read
  72.         b laststep

  73. relocate:                                    //从norflash启动,复制代码到SDRAM
  74.         ldr r0, =4096
  75.         ldr r1, =0x30000000
  76.         mov r2, #10240
  77.         
  78. copy_loop:
  79.         ldmia {r3-r10}
  80.         stmia {r3-r10}
  81.         cmp r0, r2
  82.         ble copy_loop

  83. laststep:
  84.         ldr lr, =halt_loop
  85.         ldr pc, =main

  86. halt_loop:
  87.         b halt_loop

  88. /*******************************************************************
  89. *存储控制器13个寄存器的设置值
  90. ********************************************************************/
  91. .align 4
  92. mem_cfg_val:
  93.         .long    0x22011110
  94.         .long    0x00000700
  95.         .long    0x00000700
  96.         .long    0x00000700
  97.         .long    0x00000700
  98.         .long    0x00000700
  99.         .long    0x00000700
  100.         .long    0x00018005
  101.         .long    0x00018005
  102.         .long    0x008C07A3
  103.         .long    0x000000B2
  104.         .long    0x00000030
  105.         .long    0x00000030

  106. /******************************************************************
  107. *设置各模式堆栈
  108. *******************************************************************/
  109. stack_setup:
  110.         mrs r0, cpsr
  111.         bic    r0, r0, #0x1F
  112.         orr r0, r0, #0xDB
  113.         msr cpsr, r0
  114.         ldr sp, =UNDEFINE_STACK

  115.         mrs r0, cpsr
  116.         bic    r0, r0, #0x1F
  117.         orr r0, r0, #0xD7
  118.         msr cpsr, r0
  119.         ldr sp, =ABORT_STACK

  120.         mrs r0, cpsr
  121.         bic    r0, r0, #0x1F
  122.         orr r0, r0, #0xD2
  123.         msr cpsr, r0
  124.         ldr sp, =IRQ_STACK
  125.         
  126.         mrs r0, cpsr
  127.         bic    r0, r0, #0x1F
  128.         orr r0, r0, #0xD1
  129.         msr cpsr, r0
  130.         ldr sp, =FIQ_STACK

  131.         mrs r0, cpsr
  132.         bic    r0, r0, #0x1F
  133.         orr r0, r0, #0xD0
  134.         msr cpsr, r0
  135.         ldr sp, =USER_STACK

  136.         mrs r0, cpsr
  137.         bic    r0, r0, #0x1F
  138.         orr r0, r0, #0xD3
  139.         msr cpsr, r0
  140.         ldr sp, =SVC_STACK
  141. /*******************************************************************
  142. *中断处理
  143. ********************************************************************/
  144. undefined_instruction:
  145.         b undefined_instruction
  146. software_interrupt:
  147.         b software_interrupt
  148. prefetch_abort:
  149.         b prefetch_abort
  150. data_abort:
  151.         b data_abort
  152. not_used:
  153.         b not_used
  154. irq:
  155.         b irq
  156. fiq:
  157.         b fiq
  1. relocate:                                    //从norflash启动,复制代码到SDRAM
  2.         ldr r0, =4096
  3.         ldr r1, =0x30000000
  4.         mov r2, #10240


若为nor启动,只复制norflash4k以后的10240长度的代码到SDRAM中,其余的代码在norflash中直接执行。

  1.         #define BWSCON 0x48000000            //判断是从norflash启动还是从nandflash启动
  2.         ldr r0, =BWSCON                        //若OM1:OM0 = 00则从nandflash启动
  3.         ldr r0, [r0]
  4.         ands r0, r0, #6
  5.         cmp r0, #0
  6.         bne relocate                        //不为0则从norflash启动

这就是判断的方法,只有读出00的时候与6(0110)与才为0。

代码无论是烧到NORFLASH还是NANDFLASH中都可以运行,实现了自动识别。代码以实际在mini2440开发板上测试通过。

附全部代码:








阅读(918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~