Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6506453
  • 博文数量: 1418
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 16809
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1418)

文章存档

2021年(46)

2020年(158)

2019年(193)

2018年(81)

2017年(77)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2013-09-22 11:26:07

基于 smdk 2410.

start.S


点击(此处)折叠或打开

  1. #include <common.h>  //include 下 包含其他头文件的头文件
  2. #include <config.h>  //包含 include/linux 的头文件

点击(此处)折叠或打开

  1. .globl _start    //.global 声明一个全局变量(4个字节), 供外部函数调用
  2. _start:    b    start_code                                    //处理器上电后执行的第一天指令,该条指令占四个字节
  3.     ldr    pc, _undefined_instruction            // 未定义指令异常处理向量地址,  跳转向量表, 和芯片的体系结构有关.
  4.     ldr    pc, _software_interrupt        //软中断. ldr 把第二个操作数指向的地址数据传给 PC
  5.     ldr    pc, _prefetch_abort    //指令预取终止
  6.     ldr    pc, _data_abort    //数据访问终止
  7.     ldr    pc, _not_used    //保留未用
  8.     ldr    pc, _irq        //中断处理
  9.     ldr    pc, _fiq        //快速中断
  10. //下面七条指令是分配一个字(四个字节)的空间,存放异常处理函数的入口地址
  11. _undefined_instruction:    .word undefined_instruction  //.word 为定义一个 4 字节的空间. undefined_instruction 为地址, 即标号所对应的偏移地址.
  12. _software_interrupt:    .word software_interrupt
  13. _prefetch_abort:    .word prefetch_abort
  14. _data_abort:        .word data_abort
  15. _not_used:        .word not_used
  16. _irq:            .word irq
  17. _fiq:            .word fiq
  18. //上面的一共15条指令,每条指令占四个字节,一共15*4=60字节
  19.     .balignl 16,0xdeadbeef  //用四个字节(死牛肉)填充,刚好64字节,以16字节对齐

点击(此处)折叠或打开

  1. .globl _TEXT_BASE
  2. _TEXT_BASE:
  3. #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_TEXT_BASE)
  4.     .word    CONFIG_SPL_TEXT_BASE
  5. #else
  6.     .word    CONFIG_SYS_TEXT_BASE  // include/configs/$BOARD.h 例如 CONFIG_SYS_TEXT_BASE = 0x33F80000, 定义为在代码的存放地址.
  7. #endif

  8. /*
  9.  * __bss_start,__bss_end__,_end都是定义在链接脚本文件\arch\arm\cpu\arm920t\uboot.lds
  10.  */
  11. .globl _bss_start_ofs
  12. _bss_start_ofs:           //存放bss段开始地址的偏移量
  13.     .word __bss_start - _start

  14. .globl _bss_end_ofs
  15. _bss_end_ofs:            //存放bss段结束地址的偏移量
  16.     .word __bss_end - _start

  17. .globl _end_ofs
  18. _end_ofs:                //_end标号结束地址偏移量
  19.     .word _end - _start
  20.                         //到此刚好分配了16字节

  21. #ifdef CONFIG_USE_IRQ    //分配irq栈空间
  22. /* IRQ stack memory (calculated at run-time) */
  23. .globl IRQ_STACK_START
  24. IRQ_STACK_START:        //存放irq栈空间的起始地址calculated at run-time 运行时分配
  25.     .word    0x0badc0de

  26. /* IRQ stack memory (calculated at run-time) */
  27. .globl FIQ_STACK_START
  28. FIQ_STACK_START:        //存放fiq栈空间的起始地址calculated at run-time 运行时分配
  29.     .word 0x0badc0de
  30. #endif

  31. /* IRQ stack memory (calculated at run-time) + 8 bytes */
  32. .globl IRQ_STACK_START_IN
  33. IRQ_STACK_START_IN:        //存放irq栈空间的起始地址
  34.     .word    0x0badc0de


点击(此处)折叠或打开

  1. start_code:
  2.     /*
  3.      * set the cpu to SVC32 mode
  4.      */
  5.     mrs    r0, cpsr
  6.     bic    r0, r0, #0x1f  //设置cpu为管理模式
  7.     orr    r0, r0, #0xd3  //关闭irq,fiq中断
  8.     msr    cpsr, r0
  9. # define pWTCON    0x53000000
  10. # define INTMSK    0x4A000008    /* Interrupt-Controller base addresses */
  11. # define INTSUBMSK    0x4A00001C
  12. # define CLKDIVN    0x4C000014    /* clock divisor register */
  13.     //关闭看门狗
  14.     ldr    r0, =pWTCON
  15.     mov    r1, #0x0
  16.     str    r1, [r0]

  17.     /*
  18.      * 设置所有的中断掩码,屏蔽所有一级中断
  19.      */
  20.     mov    r1, #0xffffffff
  21.     ldr    r0, =INTMSK
  22.     str    r1, [r0]
  23.     
  24.     //屏蔽二级中断
  25.     ldr r1, =0x3ff
  26.     ldr r0, =INTSUBMSK
  27.     str r1, [r0]

  28.     /* FCLK:HCLK:PCLK = 1:4:8 */
  29.     ldr r0, =CLKDIVN
  30.     mov r1, #5
  31.     str r1, [r0]

  32. #ifndef CONFIG_SKIP_LOWLEVEL_INIT   //该宏用于直接下载到内存中调试用的
  33.     bl cpu_init_crit                //该函数用于I/D caech,tlb的刷新,以及mmu的设置,sdram的设置
  34. #endif
  35.     bl _main  //_main 定义在 arch/arm/lib/crt0.S 中, 即原来Start.S中部分的汇编代码进行了整合, 一般crt0.S的代码不需要改动.


点击(此处)折叠或打开

  1. /*------------------------------------------------------------------------------*/

  2.     .globl    c_runtime_cpu_setup
  3. c_runtime_cpu_setup:

  4.     mov    pc, lr

  5. /*
  6.  *************************************************************************
  7.  *
  8.  * CPU_init_critical registers
  9.  *
  10.  * setup important registers
  11.  * setup memory timing
  12.  *
  13.  *************************************************************************
  14.  */


  15. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  16. cpu_init_crit:
  17.     /*
  18.      * flush v4 I/D caches; 刷新指令和数据缓存,TLB缓存表
  19.      */
  20.     mov    r0, #0
  21.     mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
  22.     mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */

  23.     /*
  24.      * disable MMU stuff and caches  关闭 mmu
  25.      */
  26.     mrc    p15, 0, r0, c1, c0, 0
  27.     bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
  28.     bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
  29.     orr    r0, r0, #0x00000002    @ set bit 2 (A) Align
  30.     orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache
  31.     mcr    p15, 0, r0, c1, c0, 0

  32.     /*
  33.      * before relocating, we have to setup RAM timing
  34.      * because memory timing is board-dependend, you will
  35.      * find a lowlevel_init.S in your board directory.
  36.      */
  37.     mov    ip, lr

  38.     bl    lowlevel_init  /* ./board/samsung/smdk2410/lowlevel_init.S  对内存进行初始化, 串口等初级输出, LED 状态灯点亮等等 */

  39.     mov    lr, ip
  40.     mov    pc, lr
  41. #endif /* CONFIG_SKIP_LOWLEVEL_INIT */



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