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

2015年(1)

2011年(55)

2010年(13)

分类: LINUX

2011-03-22 20:09:53

这里采用另外一种办法,原理详见tekkamannjnia的博客:

也是主要改start.s文件,代码也参考了tekkamannjnia的uboot移植的相关代码。
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. _undefined_instruction: .word undefined_instruction
  24. _software_interrupt:    .word software_interrupt
  25. _prefetch_abort:        .word prefetch_abort
  26. _data_abort:            .word data_abort
  27. _not_used:                .word not_used
  28. _irq:                    .word irq
  29. _fiq:                    .word fiq

  30. .balignl 16, 0xdeadbeef
  31. /******************************************************************
  32. *代码开始
  33. *******************************************************************/
  34. start_code:
  35.         mrs r0, cpsr                        @设置为管理模式
  36.         bic r0, r0, #0x1F                    @ARM指令,禁止中断
  37.         orr r0, r0, #0xD3                    
  38.         msr cpsr, r0

  39.         ldr r0, =0x53000000                    @关闭看门狗
  40.         mov r1, #0x0
  41.         str r1, [r0]
  42.         
  43.         ldr r0, =0x4C000014                    @设置时钟分频比
  44.         mov r1, #0x05                        @FCLK:HCLK:PCLK = 1:4:8
  45.         str r1, [r0]                        
  46.         
  47.         mrc p15, 0, r0, c1, c0, 0            @如果HDIVN不为0,使其从
  48.         orr r0, r0, #0xC0000000                @由快总线模式变为异步总线模式
  49.         mcr p15, 0, r0, c1, c0, 0

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

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

  56.         mov r1, #0x48000000                    @设置SDRAM
  57.         adrl r2, mem_cfg_val
  58.         add r3, r1, #52
  59. 1:
  60.         ldr r4, [r2], #4
  61.         str r4, [r1], #4
  62.         cmp r1, r3
  63.         bne 1b
  64. /******************************************************************
  65. *判断是从norflash还是从nandflash启动,然后复制代码到SDRAM,跳入第二阶段执行
  66. *******************************************************************/                    
  67.         ldr r1, =((4<<28)|(3<<4)|(3<<2))    //SRAM地址0X4000003C写0
  68.         mov r0, #0
  69.         str r0,[r1]
  70.         
  71.         mov r1, #0x3C                        //读取地址0X0000003C处的值是否为0,若不是,则从norflash启动
  72.         ldr r0,[r1]
  73.         cmp r0,#0
  74.         bne relocate
  75.         
  76.         ldr r0, =(0xdeadbeef)                //若为0,则从nandflash启动,并恢复地址0X4000003C处原来的值
  77.         ldr r1, =((4<<28)|(3<<4)|(3<<2))
  78.         str r0, [r1]
  79.         
  80.         /*#define BWSCON 0x48000000
  81.         ldr r0, =BWSCON
  82.         ldr r0, [r0]
  83.         ands r0, r0, #6
  84.         cmp r0, #0
  85.         bne copy_loop*/
  86.         
  87.         ldr sp, =4096                        //从nandflash中复制代码到SDRAM中
  88.         bl s3c2440_nand_init
  89.         ldr r0, =0x30000000
  90.         mov r1, #4096
  91.         mov    r2, #2048
  92.         bl s3c2440_nand_read
  93.         b laststep

  94. not_match:                                    //如果从norflash中验证0x0000003c处不是0xdeadbeef,则出错
  95. error:
  96.         b error

  97. relocate:    
  98.         ldr r1, =(0xdeadbeef)                //验证0x0000003c处是不是0xdeadbeef
  99.         cmp r0, r1
  100.         bne error

  101.         ldr r0, =4096                        //从norflash中复制代码到SDRAM
  102.         ldr r1, =0x30000000
  103.         mov r2, #102400
  104.         
  105. copy_loop:
  106.         ldmia {r3-r10}
  107.         stmia {r3-r10}
  108.         cmp r0, r2
  109.         ble copy_loop

  110. laststep:
  111.         ldr lr, =halt_loop
  112.         ldr pc, =main

  113. halt_loop:
  114.         b halt_loop

  115. /*******************************************************************
  116. *存储控制器13个寄存器的设置值
  117. ********************************************************************/
  118. .align 4
  119. mem_cfg_val:
  120.         .long    0x22011110
  121.         .long    0x00000700
  122.         .long    0x00000700
  123.         .long    0x00000700
  124.         .long    0x00000700
  125.         .long    0x00000700
  126.         .long    0x00000700
  127.         .long    0x00018005
  128.         .long    0x00018005
  129.         .long    0x008C07A3
  130.         .long    0x000000B2
  131.         .long    0x00000030
  132.         .long    0x00000030

  133. /******************************************************************
  134. *设置各模式堆栈
  135. *******************************************************************/
  136. stack_setup:
  137.         mrs r0, cpsr
  138.         bic    r0, r0, #0x1F
  139.         orr r0, r0, #0xDB
  140.         msr cpsr, r0
  141.         ldr sp, =UNDEFINE_STACK

  142.         mrs r0, cpsr
  143.         bic    r0, r0, #0x1F
  144.         orr r0, r0, #0xD7
  145.         msr cpsr, r0
  146.         ldr sp, =ABORT_STACK

  147.         mrs r0, cpsr
  148.         bic    r0, r0, #0x1F
  149.         orr r0, r0, #0xD2
  150.         msr cpsr, r0
  151.         ldr sp, =IRQ_STACK
  152.         
  153.         mrs r0, cpsr
  154.         bic    r0, r0, #0x1F
  155.         orr r0, r0, #0xD1
  156.         msr cpsr, r0
  157.         ldr sp, =FIQ_STACK

  158.         mrs r0, cpsr
  159.         bic    r0, r0, #0x1F
  160.         orr r0, r0, #0xD0
  161.         msr cpsr, r0
  162.         ldr sp, =USER_STACK

  163.         mrs r0, cpsr
  164.         bic    r0, r0, #0x1F
  165.         orr r0, r0, #0xD3
  166.         msr cpsr, r0
  167.         ldr sp, =SVC_STACK
  168. /*******************************************************************
  169. *中断处理
  170. ********************************************************************/
  171. undefined_instruction:
  172.         b undefined_instruction
  173. software_interrupt:
  174.         b software_interrupt
  175. prefetch_abort:
  176.         b prefetch_abort
  177. data_abort:
  178.         b data_abort
  179. not_used:
  180.         b not_used
  181. irq:
  182.         b irq
  183. fiq:
  184.         b fiq

程序就是思想方法的一种具体体现。。。。。,所以有思想才是最重要的。

附源代码:



好,前面的几个目标都实现了,继续下一步,加油。


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