非常好,可借鉴。
下面放一段可以启动的,位置无关的bootloader启动:
//Makefile
FILE_NAME = zkj-loader
SCRIPT_FILE = zkjloader.lds
CROSS_COMPILE=arm-linux-
###################################################
#C compiler
CC = $(CROSS_COMPILE)gcc
#Assembler
AS = $(CROSS_COMPILE)as
#Linker
LD = $(CROSS_COMPILE)ld
#Liblary
AR = $(CROSS_COMPILE)ar
#Object dump
OBJDMP = $(CROSS_COMPILE)objdump
#Object copy
OBJCOPY = $(CROSS_COMPILE)objcopy
#clean
CL = rm -f
###################################################
OBJ_FILE = \
start.o \
main.o
.PHONY: all
all:$(OBJ_FILE)
$(LD) $(OBJ_FILE) -T $(SCRIPT_FILE) -o $(FILE_NAME).elf -Map $(FILE_NAME).map
$(OBJDMP) -S -d $(FILE_NAME).elf > $(FILE_NAME)_disassemble.txt
$(OBJCOPY) -O binary $(FILE_NAME).elf $(FILE_NAME).bin
@echo ========== zkj-loader Compile Complete==========
.PHONY: clean
clean:
$(CL) *.o *.elf *.bin *.txt *.map
/
//start.s
.global _start
.global c_runtime_go
_start:
ldr sp,=0xe633fffc
/*
* set the cpu to SVC32 mode , ke yao ke bu yao
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
bl c_runtime_go
loop:
b loop
/
//main.c
//#include "board.h"
#define OUTDT3 0xE6053008 //GP3_26:TP139
#define INOUTSEL3 0xE6053004 //GP3_26:TP139
extern void c_runtime_go(void);
void c_runtime_go(void)
{
*(volatile unsigned int *)(INOUTSEL3) = 0xFFFFFFFF;
*(volatile unsigned int *)(OUTDT3) = 0xFFFFFFFF;
//*(volatile unsigned int *)(OUTDT3) = 0;
while(1);
}
/
//zkjloader.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0xe6300000;
. = ALIGN(4);
.text :
{
_start = .;
start.o (.text*)
*(.text*)
}
}
下面放一段可以启动的,位置无关的bootloader启动:
//Makefile
FILE_NAME = zkj-loader
SCRIPT_FILE = zkjloader.lds
CROSS_COMPILE=arm-linux-
###################################################
#C compiler
CC = $(CROSS_COMPILE)gcc
#Assembler
AS = $(CROSS_COMPILE)as
#Linker
LD = $(CROSS_COMPILE)ld
#Liblary
AR = $(CROSS_COMPILE)ar
#Object dump
OBJDMP = $(CROSS_COMPILE)objdump
#Object copy
OBJCOPY = $(CROSS_COMPILE)objcopy
#clean
CL = rm -f
###################################################
OBJ_FILE = \
start.o \
main.o
.PHONY: all
all:$(OBJ_FILE)
$(LD) $(OBJ_FILE) -T $(SCRIPT_FILE) -o $(FILE_NAME).elf -Map $(FILE_NAME).map
$(OBJDMP) -S -d $(FILE_NAME).elf > $(FILE_NAME)_disassemble.txt
$(OBJCOPY) -O binary $(FILE_NAME).elf $(FILE_NAME).bin
@echo ========== zkj-loader Compile Complete==========
.PHONY: clean
clean:
$(CL) *.o *.elf *.bin *.txt *.map
/
//start.s
.global _start
.global c_runtime_go
_start:
ldr sp,=0xe633fffc
/*
* set the cpu to SVC32 mode , ke yao ke bu yao
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
bl c_runtime_go
loop:
b loop
/
//main.c
//#include "board.h"
#define OUTDT3 0xE6053008 //GP3_26:TP139
#define INOUTSEL3 0xE6053004 //GP3_26:TP139
extern void c_runtime_go(void);
void c_runtime_go(void)
{
*(volatile unsigned int *)(INOUTSEL3) = 0xFFFFFFFF;
*(volatile unsigned int *)(OUTDT3) = 0xFFFFFFFF;
//*(volatile unsigned int *)(OUTDT3) = 0;
while(1);
}
/
//zkjloader.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0xe6300000;
. = ALIGN(4);
.text :
{
_start = .;
start.o (.text*)
*(.text*)
}
}