s3c2410 bootloader 第一部分启动代码分析
/* * 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=OUTPUTmov 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
@
有些是板子上的配置参数
s3c2410 bootloader 第一部分启动代码分析相关推荐
- arm9 c语言函数库,s3c2410(ARM9)启动代码分析(转载)
ADS下C语言的入口方式和ROM镜像文件的生成 这部分介绍下ADS下如何生成可以运行的ROM镜像文件,我们知道当程序下载到flash中运行的时候,对于RW.ZI数据就存在着两个环境,一个load环境, ...
- ARM裸机篇---启动代码分析
ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...
- linux 启动代码分析--xscale
width="0" height="0" id="hiddenframe" src="http://safelab.nku.cn: ...
- (others)U-Boot启动代码分析
U-Boot启动代码分析(MIPS) 2012-06-14 23:52:26 分类: 原文地址:U-Boot启动代码分析(MIPS) 作者:cao5170 U-Boot代码分析(by MulinB) ...
- Linux第一条指令地址,arm-linux 启动代码分析——stage1 (1)
本文针对arm linux, 从kernel的第一条指令开始分析,一直分析到进入start_kernel()函数. 我们当前以linux-2.6.19内核版本作为范例来分析,本文中所有的代码,前面都会 ...
- tq2440 启动代码分析
一直畏惧启动代码,和汇编,今天搜资料的时候碰见我学习用的arm 开发板的启动代码的分析,看着还不错,因此在这和大家分享一下,共同参考学习. 启动文件就是引导ARM启动,并进入我们熟悉的C语言程序.它主 ...
- Fuchsia X86 kernel启动代码分析
Google整Fuchsia代码整了好些年了,近期是有看到说Fuchsia可能会正式商用了,所以抽了空把Fuchsia代码下了下来,想从kernel起好好捋一捋代码,想从根本上理解其kernel部分的 ...
- STM32 启动代码分析
#PS:要转载请注明出处,本人版权所有 #PS:这个只是 < 我自己 >理解,如果和你的 #原则相冲突,请谅解,勿喷 对于keil的启动代码(针对STM32F042),添加 备注 和 自己 ...
- stm32启动代码分析
本文转自:http://blog.sina.com.cn/s/blog_4f09c0b501016eo9.html 在<<STM32不完全手册里面>>,用的是STM32F103 ...
最新文章
- mongo报错:not authorized on bb to execute command { create: \“xxx\“...}
- Python爬取4399好wan的小游戏!
- python 归一化_只需 45 秒,Python 给故宫画一组手绘图!
- 比特大陆发布第三代AI芯片,INT8算力达17.6Tops
- linux shell 实现循环输出
- 靠谱的N95消毒方法终于来了:放你家电饭锅里,干烧丨伊利诺伊香槟分校出品...
- 百度云使用第三方工具下载文件
- Windows线程同步机制的区别与比较及进程通信方法
- Cordova实战培训
- CentOS下设置服务自动启动的方法
- boost::yap::make_expression_function相关的测试程序
- lofter 爬虫_本日Lofter德哈tag榜单 20201125
- The Bottom of a Graph Poj 2553
- Java UnknownHostException –服务器的无效主机名–如何解决?
- 防止ASP.NET按钮多次提交的办法
- linux(ubuntu)给vmware中的windows虚拟机共享磁盘
- 随机过程 - 马尔可夫链
- win10 安装mysql 卡死_win10安装Mysql5.5卡住假死
- 阿里网盘rar再打包分享工具
- 03 【Nginx虚拟主机和域名解析】
热门文章
- geek 手势代表什么_询问How-To Geek:为什么您永远不应该清理PC,为Kindle转换书籍以及使用一个键盘控制多台计算机...
- 长沙SEO优化(SEO内页优化步骤)
- NSUserDefaults(偏好设置)
- 2023年第十五届计算机与自动化工程国际会议(ICCAE 2023)
- 深度学习-机器学习-联邦学习-可视化等最全python软件整理分享
- Hive的元数据存储与元数据表
- 视频合并分割软件如何合并视频
- c++运算符重载与输入输出流重载
- 马云:社会责任的前提是做好企业
- 2018世界杯热点运营活动案例剖析