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. 使用ServerSocket建立聊天服务器(二)

    -------------siwuxie095                         工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:M ...

  2. Spring第五天

    1. [简答题]:简述一下hibernate和spring框架的整合步骤: 答: 1.加入hibernate jar包 2.编写持久化类 3.添加Hibernate的配置文件:hibernate.cf ...

  3. hdu6357 Hills And Valleys

    传送门 题目大意 给定一个序列A,求翻转A中一个区间之后的最长不降子序列的长度即翻转的区间 分析 发现直接枚举翻转的区间的话是无论如何都不行的,于是有一个非常神奇的做法.我们再设一个序列B = {0, ...

  4. Redis应用(django)

    自定义使用redis 创建url 定义单例模式连接池 import redis # 连接池 POOL = redis.ConnectionPool(host='10.211.55.4', port=6 ...

  5. Entity Framework Tutorial Basics(8):Types of Entity in Entity Framework

    Types of Entity in Entity Framework: We created EDM for existing database in the previous section. A ...

  6. [转]Apple耳机兼容非Mac设置

    转至:https://jingyan.baidu.com/article/6079ad0e99858228ff86db19.html 不兼容情况描述: 听音乐貌似只能听见伴奏的声音 解决方法: 第一种 ...

  7. Java50道经典习题-程序36 移动位置

    题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 分析:比如有4个数n=4; 1 2 3 4 各个数向后移动2位m=2,变为 1 2 3 4 将最后m个数,即将最后2个数 ...

  8. c++ 用new后delete,而继续输出指针后果 new/new[]/delete/delete[]区别

    #include<iostream> #include<cstring> #include <string.h> int main(){ ]; ;i<;i++ ...

  9. D - Back and Forth(模拟)

    Problem Statement Dolphin resides in two-dimensional Cartesian plane, with the positive x-axis point ...

  10. DevExpress ASP.NET Dev控件客户端事件 ClientSideEvents

    原文地址:http://www.cnblogs.com/allenlf/p/4171189.html