1. S3C2440大概的启动流程(NAND启动):

①设置CPU为SVC模式

②关闭看门狗

③屏蔽中断

④关闭MMU

⑤初始化时钟

⑥初始化内存(SDRAM)

⑦初始化栈指针(SP, R13)

⑧初始化NAND Flash

⑨拷贝代码从NAND到内存

⑩清除BSS段

最后,跳转至C语言的Main函数执行

2. 汇编语言源代码

.text
.global _start
_start:
b reset
ldr pc, _undifined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq _undifined_instruction: .word undifined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word reset undifined_instruction:
nop software_interrupt:
nop prefetch_abort:
nop data_abort:
nop not_used:
nop irq:
sub lr, lr, #
stmfd sp!, {r0-r12, lr} /* Save envrionment */
bl HandleIrq
ldmfd sp!, {r0-r12, pc}^ /* Recover envrionment, ^ take spsr to cpsr */ fiq:
nop
.global reset
reset:
bl set_svc
bl disable_watchdog
bl disable_interrupt
bl disable_mmu
bl init_clock
bl init_sdram
bl init_stack
bl nandflash_init
bl light_led
bl copy_to_ram
bl clean_bss
ldr pc, =gboot_main set_svc:
mrs r0, cpsr
bic r0, r0,#0x1f
orr r0, r0,#0xd3
msr cpsr, r0
mov pc, lr #define pWTCON 0x53000000
disable_watchdog:
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
mov pc, lr disable_interrupt:
mvn r1, #0x0
ldr r0, =0x4a000008
str r1, [r0]
mov pc, lr disable_mmu:
mcr p15,,r0,c7,c7,
mrc p15,,r0,c1,c0,
bic r0, r0, #0x00000007
mcr p15,,r0,c1,c0,
mov pc, lr #define CLKDIVN 0x4c000014
#define MPLLCON 0x4c000004
#define MPLL_405MHZ ((<<)|(<<)|(<<)) init_clock:
ldr r0, =CLKDIVN
mov r1, #0x5 //FCLK : HCLK : PCLK = : : (Divide Ratio)
str r1, [r0] mcr p15,,r0,c1,c0,
orr r0,r0,#0xc0000000
mcr p15,,r0,c1,c0, ldr r0, =MPLLCON
ldr r1, =MPLL_405MHZ
str r1, [r0]
mov pc, lr #define mem_contrl 0x48000000
init_sdram:
ldr r0, =mem_contrl
add r3, r0, #*
adrl r1, mem_data :
ldr r2, [r1], #
str r2, [r0], #
cmp r0, r3
bne 0b
mov pc, lr #define copy_length 0x350000
copy_to_ram:
mov r0,#0x00
ldr r1,=_start
ldr r2,=EFI_driver_end
sub r2,r2,r1
mov ip,lr
bl nand_to_ram
mov lr,ip
mov pc,lr init_stack:
msr cpsr_c, #0xd2 //Switch irq mode and set sps
ldr sp, =0x33000000
msr cpsr_c, #0xd3 //Switch back to SVC
ldr sp, =0x34000000
mov pc ,lr clean_bss:
ldr r0, =bss_start
ldr r1, =bss_end
cmp r0, r1
moveq pc, lr clean_loop:
mov r2, #
str r2, [r0], #
cmp r0, r1
bne clean_loop
mov pc, lr mem_data:
.long 0x22000000
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00018001
.long 0x00018001
.long 0x008c04f5
.long 0x000000b1
.long 0x00000030
.long 0x00000030 #define GPBCON 0x56000010
#define GPBDAT 0x56000014
light_led:
ldr r0, =GPBCON
mov r1, #0x400
str r1, [r0] ldr r0, =GPBDAT
mov r1, #0x0
str r1, [r0]
mov pc, lr

3. 链接器脚本

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS {
. = 0x30004000; . = ALIGN();
.text :
{
start.o (.text)
*(.text)
} . = ALIGN();
.data :
{
*(.data)
} . = ALIGN();
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .; . = ALIGN();
boot_cmd_start = .;
.boot_cmd :
{
*(.boot_cmd)
}
boot_cmd_end = .; . = ALIGN();
EFI_driver_start = .;
.EFI_driver :
{
*(.EFI_driver)
}
EFI_driver_end = .;
}

4. Makefile

CC := arm-linux-gcc
LD := arm-linux-ld
OBJCOPY := arm-linux-objcopy CFLAGS := -fno-builtin -I$(shell pwd)/Include
export CFLAGS all: start.o main.o Core/Core.o CommonLib/CommonLib.o Driver/Driver.o Test/Test.o Net/Net.o
arm-linux-ld -Tgboot.lds -o gboot.elf $^ -L /usr/local/arm/../lib/gcc/arm-none-linux-gnueabi/../armv4t -lgcc
arm-linux-objcopy -O binary gboot.elf gboot.bin %.o : %.S
arm-linux-gcc -g -c $^ %.o : %.c
arm-linux-gcc $(CFLAGS) -g -c $^ Core/Core.o :
make -C Core all Driver/Driver.o :
make -C Driver all CommonLib/CommonLib.o :
make -C CommonLib all Test/Test.o :
make -C Test all Net/Net.o :
make -C Net all .PHONY: clean
clean:
make -C Driver clean
make -C CommonLib clean
make -C Test clean
make -C Core clean
make -C Net clean
rm *.o *.elf *.bin

一个简单的基于MINI2440开发板的启动代码的更多相关文章

  1. 【基于mini2440开发板的交叉编译环境及内核树配置.

    在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...

  2. 从零开始搭建一个简单的基于webpack的vue开发环境

    原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧

    之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s ...

  4. 基于uFUN开发板和扩展板的联网校准时钟

    项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...

  5. 基于uFUN开发板的RGB调色板

    前言 使用uFUN开发板配合Qt上位机,实现任意颜色的混合,Qt上位机下发RGB数值,范围0-255,uFUN开发板进行解析,然后输出不同占空比的PWM,从而实现通过RGB三原色调制出任意颜色. Qt ...

  6. 基于uFUN开发板的心率计(三)Qt上位机的实现

    前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...

  7. 基于uFUN开发板的心率计(二)动态阈值算法获取心率值

    前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...

  8. 【转】Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板

    Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板 开发板:mini2440(2011.04.21)环境:ubuntu9.10 为方便的将文件上传到开发板,采用vsftpd, ...

  9. 基于Neptune开发板的键盘蓝牙模块DIY指南

    目录: 1.下载开发板程序2.安装USB串口(CH340)驱动3.安装烧写工具4.烧写开发板程序 本期我们带来基于润和Neptune开发板(以下简称Neptune开发板)的键盘蓝牙模块DIY指南,利用 ...

随机推荐

  1. day36-hibernate检索和优化 09-Hibernate中的事务:事务处理

  2. C++ 面向对象: I/O对象的应用

    1. 补充完整从text.txt文件读取数据后,再写入in.txt文件.2. 完成从text.txt文件读取数据后,进行排序,再写入in.txt文件.数据量自行设定.3. 请解决在主程序文件中加载多个 ...

  3. boost::thread 库的使用

    转载自:http://blog.csdn.net/yockie/article/details/9181939 概要 通过实例介绍boost thread的使用方式,本文主要由线程启动.Interru ...

  4. iOS Simulator hang up ( Xcode4.6.3)

    最近遇见个Xcode的bug,搞的十分郁闷. 具体现象是:程序前段时间都是好好的,可以运行,第二天开机,调试就无法进入模拟器.就连main()函数都进不了.模拟器完全挂起了.具体说来就是代码一句都没改 ...

  5. Spring第五篇

    在Spring第四篇中 我们主要介绍了set get的注入方式 在Spring第五篇中 我们主要介绍使用注解配置Spring 主要分为两个步骤 1 导包的同时引入新得约束 导包如下 1.1 重写注解代 ...

  6. [转]CentOS 7.3 安装MySQL

    1.下载mysql源 yum -y install wget wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarc ...

  7. iOS组件化方案

    一.蘑菇街url-block方案 这是蘑菇街中应用的一种页面间调用的方式,通过在启动时注册组件提供的服务,把调用组件使用的url和组件提供的服务block对应起来,保存到内存中.在使用组件的服务时,通 ...

  8. 答C++复杂多余者之惑

    C和C++有太多的历史包袱而其它语言并没有这些,从另一个角度下来讲C和C++其实就是现代语言的活字典,也是现代软件设计的基础,当然有更古老的语言,但像C和C++影响力这么大的却无其它语言可以出其左右. ...

  9. 从零开始搭建.NET Core 2.0 API(学习笔记一)

    从零开始搭建.NET Core 2.0 API(学习笔记一) 一. VS 2017 新建一个项目 选择ASP.NET Core Web应用程序,再选择Web API,选择ASP.NET Core 2. ...

  10. python之编辑器pycharm

    在进行python开发的时候,习惯使用pycharm这个编辑器进行开发工作,总结一些常用到的功能点 常用功能: 1. 打开当前文件所在的目录 在文件右击 -> Show in Exploer   ...