这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基于44b0嵌入式uclinux的bootloader的编写

共1条 1/1 1 跳转至

基于44b0嵌入式uclinux的bootloader的编写

菜鸟
2005-05-20 18:13:41     打赏

各位高手你们好,我刚接触嵌入式系统,对此甚至很少了解,导师让做基于s3c44b0的uclinux的bootloader,于是看了几天书终于明白了bootloader的基本原理,于是参照资料编写了一个,其实我的启动程序只要完成简单的引导功能,将控制权交给内核。从网上找到的资料说,它的他的功能如下:

(1)禁止所有的中断;

(2)设置处理器时钟、运行速度;

(3)存储区初始化;

(4)设置堆栈指针将bss段清零;

(5)跳转到内核映像的入口

我的程序如下: ;************************************************************** ; ; This the bootloader for S3C44B0 ;**************************************************************

AREA Init, CODE, READONLY CODE32 GET snd.s ENTRY

start

;Part 1 ;*************************************************************** ;disable interrupts in CPU and switch to SVC32 mode

MRS r0, cpsr BIC r0, r0, #MASK_MODE ORR r0, r0, #MODE_SVC32 ORR r0, r0, #I_BIT ORR r0, r0, #F_BIT MSR cpsr_c, r0

LDR r2, =ARM7_INTMASK ;R2->interrupt controller MVN r1, #0 ;&FFFFFFFF STR r1, [r2] ;disable all interrupt soucres

LDR r2, =ARM7_INTPEND ;R2->interrupt pend register. MVN r1, #0 ;&FFFFFFFF STR r1, [r2] ;clear all interrupt flags.

;close WATCHDOG LDR r0, =ARM7_WTCON LDR r1, =0x0 STR r1, [r0]

;set port e LDR r1, =ARM7_PCONE LDR r0, =0x25529 STR r0, [r1]

;set timer control registers LDR r1, =ARM7_LOCKTIME LDR r0, =0xfff STR r0, [r1]

LDR r1, =ARM7_PLLCON LDR r0, =0x78061 STR r0, [r1]

LDR r1,=ARM7_CLKCON LDR r0, =0x7ff8 STR r0, [r1]

;Part 2 ;**************************************************************** ;Initalize the memory as follows: ; FLASH 2 M ; SDRAM 8 M

LDR r1, =BWSCON LDR r2, =BANKCON0 LDR r3, =BANKCON1 LDR r4, =BANKCON2 LDR r5, =BANKCON3 LDR r6, =BANKCON4 LDR r7, =BANKCON5 LDR r8, =BANKCON6 LDR r9, =BANKCON7 LDR r10,=REFRESH LDR r11,=BANKSIZE LDR r12,=MRSRB6 LDR r13,=MRSRB7 LDR r0, =ARM7_BWSCON STMIA r0, {r1-r13}

;Part 3 ;*************************************************************** ;Self copy kernel of FLASH to SDRAM

LDR r0, =0x10000 LDR r1, =0xc300000 ADD r2, r0, #(704 * 1024)

COPY LDMIA r0!, {r3-r10} STMIA r1!, {r3-r10} CMP r0, r2 BLE COPY

;Part 4 ;*********************************************************************** ;jump to c function

LDR r0, =0xc300000 MOV pc, r0

END

--------------------------------------------------- snd.s如下: ;/*************************************************************************/ ;/* Format of the Program Status Register */ ;/*************************************************************************/ ;/* */ ;/* 31 30 29 28 7 6 5 4 3 2 1 0 */ ;/*+---+---+---+---+--ss--+---+---+---+---+---+---+---+---+ */ ;/*| N | Z | C | V | | I | F | T | M4 ~ M0 | */ ;/*+---+---+---+---+--ss--+---+---+---+---+---+---+---+---+ */ ;/* */ ;/* Processor Mode and Mask */ ;/* */ ;/*************************************************************************/

Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT EQU 0x17 Mode_UND EQU 0x1B Mode_SYS EQU 0x1F

MASK_MODE EQU 0x0000003F MODE_SVC32 EQU 0x00000013

I_BIT EQU 0x80 ; when I bit is set, IRQ is disabled F_BIT EQU 0x40 ; when F bit is set, FIQ is disabled

;SYSTEM MANAGER REGISTERS ARM7_BWSCON EQU 0x01C80000 ARM7_BANKCON0 EQU 0x01C80004 ARM7_BANKCON1 EQU 0x01C80008 ARM7_BANKCON2 EQU 0x01C8000C ARM7_BANKCON3 EQU 0x01C80010 ARM7_BANKCON4 EQU 0x01C80014 ARM7_BANKCON5 EQU 0x01C80018 ARM7_BANKCON6 EQU 0x01C8001C ARM7_BANKCON7 EQU 0x01C80020 ARM7_REFRESH EQU 0x01C80024 ARM7_BANKSIZE EQU 0x01C80028 ARM7_MRSRB6 EQU 0x01C8002C ARM7_MRSRB7 EQU 0x01C80030

;INTERRUPT CONTROL REGISTERS ARM7_INTMODE EQU 0x01E00008 ARM7_INTPEND EQU 0x01E00004 ARM7_INTMASK EQU 0x01E0000C

;WATCHDOG TIMER REGISTERS ARM7_WTCON EQU 0x01d30000

;PORT E ARM7_PCONE EQU 0x01d20028

;TIMER REGISTERS ARM7_LOCKTIME EQU 0x01d8000c ARM7_PLLCON EQU 0x01d80000 ARM7_CLKCON EQU 0x01d80004

;/*************************************************************************/ ;/* SYSTEM MEMORY CONTROL REGISTER EQU TABLES */ ;/*************************************************************************/

;***************Init*************** BWSCON EQU 0x11110102 BANKCON0 EQU 0x600 BANKCON1 EQU 0x7ffc BANKCON2 EQU 0x7ffc BANKCON3 EQU 0x7ffc BANKCON4 EQU 0x7ffc BANKCON5 EQU 0x7ffc BANKCON6 EQU 0x18000 BANKCON7 EQU 0x18000 REFRESH EQU 0x860459 BANKSIZE EQU 0x10 MRSRB6 EQU 0x20 MRSRB7 EQU 0x20

;/***************************************************************/ END 请高手执教我的程序是否可行呢? 同时我还一下几个问题向请教一下各位: (1)我的程序没有使用子函数和C程序,是否就可以不要设置堆栈了呢? (2)编译内核会有三个文件,image.rom image.ram romfs.img,不知应该烧写哪一个文件呢?我是打算烧写image.rom,现烧在flash的0x10000,然后拷贝到0xc300000,再将pc指向此处,就完成了控制权的转移。不知道是否可行?

我从未接触过关于嵌入式系统方面的课题,所以以上叙述可能有错误的地方,希望大家谅解! 这个课题对我来说很重要,希望大家能够帮助,万分感谢!!!




关键词: 基于     嵌入式     uclinux     bootloader    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]