一个简单的基于MINI2440开发板的启动代码

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, #4
    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,0,r0,c7,c7,0
    mrc p15,0,r0,c1,c0,0
    bic r0, r0, #0x00000007
    mcr p15,0,r0,c1,c0,0
    mov pc, lr

#define CLKDIVN 0x4c000014
#define MPLLCON 0x4c000004
#define MPLL_405MHZ ((127<<12)|(2<<4)|(1<<0))

init_clock:
    ldr r0, =CLKDIVN
    mov r1, #0x5        //FCLK : HCLK : PCLK = 1 : 4 : 8(Divide Ratio)
    str r1, [r0]

    mcr p15,0,r0,c1,c0,0
    orr r0,r0,#0xc0000000
    mcr p15,0,r0,c1,c0,0

    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, #4*13
    adrl r1, mem_data

0:
    ldr r2, [r1], #4
    str r2, [r0], #4
    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, #0
    str r2, [r0], #4
    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(4);
    .text :
    {
    start.o (.text)
    *(.text)
    }

    . = ALIGN(4);
    .data :
    {
    *(.data)
    }

    . = ALIGN(4);
    bss_start = .;
    .bss :
    {
    *(.bss)
    }
    bss_end = .;

    . = ALIGN(4);
    boot_cmd_start = .;
    .boot_cmd :
    {
    *(.boot_cmd)
    }
    boot_cmd_end = .;

    . = ALIGN(4);
    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/4.3.2/lib/gcc/arm-none-linux-gnueabi/4.3.2/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
时间: 2024-10-14 12:06:33

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

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

前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值.这篇文章主要是介绍Qt上位机如何实现波形的显示,串口数据的解析,以及一些小细节实现.这篇文章写完,uFUN心率计这个小项目就算结束了,最近又做了个uFUN开发板的扩展板,在微信群里的朋友都已经看到了,后面会做一些好玩的东西,大家要保持关注哈! 关于Qt Qt是一个1991年由Qt Company开

emWin 移植 - 基于红牛开发板

一直想利用所学的东西自己设计一个精致一些的作品,手头正好有一块红牛开发板,就先用它来写一些软件,熟悉一下过程和一些想法的可行性.首先当然是选择一个操作系统了,对比了几种之后选择了emWin.那就移植一下吧. 这里首先要感谢一下http://www.openedv.com/posts/list/0/27697.htm 这篇帖子.我的思路基本是照着这个帖子做的.感谢楼主把辛苦的研究成果贡献出来,让我这个菜鸟能够快些入门. STemWin下载地址: http://www.st.com/web/en/c

基于Nucleo开发板STM32F4XX模版的建立与ST-Link的配置

本文将建立一个基于Nucleo开发板和KEIL5.14的工程模版,由一下几个部分组成: 1.工程模版的建立 2.STlink的设置与永远的流水灯 1.工程模版的建立 1)在建立工程之前,首先建立一个存放模版文件的文件夹,我们把它叫做template.然后在建立6个子文件夹:Doc,Libraries,Listing,Output,Project,USER,在Libraries里建立CMSIS和FWlib文件夹,在CMSIS中建立startup,这些文件夹的名字可以任意取的,这样命名只是为了方便识

(转载)移植最新内核linux-3.14.6到mini2440开发板

1.建立目标平台1.1 添加机器码--LINGD2440在arch/arm/tools/mach-types 下,添加以下一行[email protected]:~/arm/linux-3.14.6$ vim arch/arm/tools/mach-types lingd2440 MACH_LINGD2440 LINGD2440 19981.2 添加平台文件--mach-lingd2440.c复制arch/arm/mach-s3c24xx目录下的 mach-smdk2440.c,命名为mach-

使用telnet登陆mini2440开发板

使用telnet登陆mini2440开发板 by HYH | 2018 年 1 月 18 日 下午 3:40 一.说明 1.mini2440的linux自带的busybox包含有telnetd这个程序,故可用于telnet登陆,方便调试. 2.如果自己做的linux里面并没有busybox或者busybox并没有包含telnetd这个程序.可在https://busybox.net/downloads/binaries/下载任意一个版本的busybox(注意要下载armv4*版本). 3.登陆之

基于Tiny210开发板视频显示

基于Tiny210开发板视频显示 1.写基于V4L2编程 ========videodevice.h文件========= #ifndef VIDEODEVICE_H #define VIDEODEVICE_H #include <string.h> #include <stdlib.h> #include <errno.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/m

【内核】四、搭建完整的mini2440开发板驱动开发环境(仿照JZ2440驱动开发环境搭建)

一.mini2440开发板驱动环境搭建: <mini2440用户手册>说明原文>>注意:本开发板提供的 linux 内核并不能直接用于 u-boot ,因为我们公司是不使用u-boot的,并且对其各个参数设置并不了解,关于 U-Boot 的使用方法用户可以参考网上的资料. 我了个...鉴于使用免费版的mini2440光盘资料,驱动开发环境搭建从未成功过,罢了,虽然以后LCD和触摸屏驱动学习时会有些问题,但还是换熟悉的u-boot和uImage来搭建环境吧. 二.在mini2440开

(转)关于三星cortex A9 Sate4412 开发板 uboot 启动的一些问题释疑

说明:本文转载自:http://blog.csdn.net/gooogleman/article/details/17238079 作者:gooogleman                   日期:2013.11.27 最近,发现4412 和S5PV210的一些iNand/TF启动方式有些不同,4412 的一些磁盘索引不是固定在某一个通道的上的,而S5PV210 是固定的,这就导致一些人在烧写4412 ,分区格式化的时候会莫名其妙,不知所以然,现在看看代码,看是4412 代码到底是为何会这样

linux-2.6.32在mini2440开发板上移植之DM9000网卡移植

   移植DM9000 网卡驱动1 设备资源初始化      Linux-2..6.32.2 已经自带了完善的DM9000 网卡驱动驱动(源代码位置:linux-2.6.32.2/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可,具体步骤如下: 首先添加驱动所需的头文件dm9000.h:#include <linux/dm9000.h> 再定义DM9000 网卡设备的物理基地址,以便后面用到:/* DM9000AEP 10/