/* * 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 @ 有些是板子上的配置参数