s3c2410 bootloader 第一部分启动代码分析

来源:互联网 发布:图像形态学 知乎 编辑:程序博客网 时间:2024/06/11 04:53
/*   * vivi/arch/s3c2410/head.S:(启动代码第一部分 前200行左右)   *   Initialise hardware   *     *  芯片:         s3c2410   *  中文注释:   刘星(362377891@qq.com)   *  注释时间:   2012-05-30   *   */  #include "config.h"         @ 配置文件  #include "linkage.h"        @ 实现了ENTRT宏的封装  #include "machine.h"        @ 开发板环境参数  @ 启动代码   ENTRY(_start)               @ 引入外部_start  ENTRY(ResetEntryPoint)      @ 引入外部ResetEntryPoint  @  @ 中断向量表 (物理地址 = 0x00000000)  @  @ ARM规定,在起始的地方必须要有中断向量表这8句话,相当于startup中的  @ b标号也可以用ldr pc标号,这8句话可以认为是bootloader的识别代码,  @ 因为在实际中,可能会没有bootloader  @ 0x00: 复位地址      b   Reset  @ 0x04: 未定义中断地址  UndefEntryPoint:      b   HandleUndef  @ 0x08: 软中断地址  SWIEntryPoint:      b   HandleSWI  @ 0x0c: 内存操作异常中断地址  PrefetchAbortEnteryPoint:      b   HandlePrefetchAbort  @ 0x10: 数据异常中断地址  DataAbortEntryPoint:      b   HandleDataAbort  @ 0x14: 未使用  NotUsedEntryPoint:      b   HandleNotUsed  @ 0x18: 慢中断地址  IRQEntryPoint:      b   HandleIRQ  @ 0x1c: 快速中断地址  FIQEntryPoint:      b   HandleFIQ  @  @ 环境变量的存放  @  @ 0x20: magic number so we can verify that we only put       .long   0  @ 0x24:      .long   0  @ 0x28: _start用来指定链接后的起始装载地址装载到内存中的地址      .long   _start  @ 0x2C: this contains the platform, cpu and machine id      .long   ARCHITECTURE_MAGIC  @ 0x30: vivi capabilities       .long   0  #ifdef CONFIG_PM  @ 0x34: 电源管理的设置      b   SleepRamProc  #endif  #ifdef CONFIG_TEST  @ 0x38:      b   hmi  #endif  @  @ Start VIVI head  @  Reset:      @ 禁用看门狗定时器       mov r1, #0x53000000      mov r2, #0x0      str r2, [r1]        @给看门狗寄存器WTCON赋值0 disable  #ifdef CONFIG_S3C2410_MPORT3 @GPH配置      @基址=0x56000000      mov r1, #0x56000000       @给0x56000070 GPHCON赋值0x05  GPH1=OUTPUT GPH0=OUTPUT    mov r2, #0x00000005      str r2, [r1, #0x70]      @给0x56000078 GPHUP赋值0x01 禁用上拉函数       mov r2, #0x00000001      str r2, [r1, #0x78]      @给0x56000074 GPHDAT赋值0x01 使能数据寄存器      mov r2, #0x00000001      str r2, [r1, #0x74]  #endif      @ 禁用所有中断      mov r1, #INT_CTL_BASE      mov r2, #0xffffffff      str r2, [r1, #oINTMSK]      @掩码关闭所有中断      ldr r2, =0x7ff      str r2, [r1, #oINTSUBMSK]         @ 初始CPU的速度和时钟频率      mov r1, #CLK_CTL_BASE      mvn r2, #0xff000000      str r2, [r1, #oLOCKTIME]      @ldr    r2, mpll_50mhz      @str    r2, [r1, #oMPLLCON]  #ifndef CONFIG_S3C2410_MPORT1      @ 1:2:4      mov r1, #CLK_CTL_BASE      mov r2, #0x3      str r2, [r1, #oCLKDIVN]      mrc p15, 0, r1, c1, c0, 0       @ 读取控制寄存器       orr r1, r1, #0xc0000000     @ Asynchronous        mcr p15, 0, r1, c1, c0, 0       @ 写去控制寄存器      @ CPU频率 200 Mhz      mov r1, #CLK_CTL_BASE      ldr r2, mpll_200mhz      str r2, [r1, #oMPLLCON]  #else    @ 1:2:2      mov r1, #CLK_CTL_BASE      ldr r2, clock_clkdivn      str r2, [r1, #oCLKDIVN]      mrc p15, 0, r1, c1, c0, 0       @ 读取控制寄存器       orr r1, r1, #0xc0000000     @ Asynchronous      mcr p15, 0, r1, c1, c0, 0       @ 写去控制寄存器      @ CPU频率 100 Mhz      mov r1, #CLK_CTL_BASE      ldr r2, mpll_100mhz      str r2, [r1, #oMPLLCON]  #endif      bl  memsetup  #ifdef CONFIG_PM    @ 电源配置      @ 检查是否从睡眠模式唤醒      ldr r1, PMST_ADDR      ldr r0, [r1]      tst r0, #(PMST_SMR)      bne WakeupStart  #endif  #ifdef CONFIG_S3C2410_SMDK      @ 点亮所有LED灯      mov r1, #GPIO_CTL_BASE  add r1, r1, #oGPIO_F      ldr r2,=0x55aa      str r2, [r1, #oGPIO_CON]      mov r2, #0xff      str r2, [r1, #oGPIO_UP]      mov r2, #0x00      str r2, [r1, #oGPIO_DAT]  #endif  #if 0      @ SVC      mrs r0, cpsr      bic r0, r0, #0xdf      orr r1, r0, #0xd3      msr cpsr_all, r1  #endif      @ 配置UART串口      mov r1, #GPIO_CTL_BASE  add r1, r1, #oGPIO_H      ldr r2, gpio_con_uart         str r2, [r1, #oGPIO_CON]      ldr r2, gpio_up_uart      str r2, [r1, #oGPIO_UP]       bl  InitUART    @初始化UART  #ifdef CONFIG_DEBUG_LL      @ Print current Program Counter      ldr r1, SerBase      mov r0, #'\r'    bl  PrintChar      mov r0, #'\n'    bl  PrintChar      mov r0, #'@'    bl  PrintChar      mov r0, pc      bl  PrintHexWord  #endif  #ifdef CONFIG_BOOTUP_MEMTEST      @ 简单内存测试跳转      bl  memtest  #endif  #ifdef CONFIG_S3C2410_NAND_BOOT      bl  copy_myself      @ 跳转到ram      ldr r1, =on_the_ram  add pc, r1, #0      nop      nop  1:  b   1b      @ infinite loop  on_the_ram:  #endif  #ifdef CONFIG_DEBUG_LL      ldr r1, SerBase      ldr r0, STR_STACK      bl  PrintWord      ldr r0, DW_STACK_START      bl  PrintHexWord  #endif      @ 读取C语言函数      ldr sp, DW_STACK_START  @ 启动栈指针      mov fp, #0          @ fp赋值0      mov a2, #0          @ 设置argv = 0       bl  main            @ 跳转到main函数       mov pc, #FLASH_BASE     @ 覆盖,重启  @  @ End VIVI head  @ 有些是板子上的配置参数

原创粉丝点击