微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux开发环境的搭建之:U-Boot移植

嵌入式Linux开发环境的搭建之:U-Boot移植

时间:08-13 来源:3721RD 点击:

ard-specific linker script.

*/

.globl _bss_start (BSS段起始位置)

_bss_start:

.word __bss_start

.globl _bss_end

_bss_end:

.word _end

reset: (执行入口)

/*

* set the cpu to SVC32 mode;使处理器进入特权模式

*/

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0

relocate: (代码的重置) /* relocate U-Boot to RAM */

adr r0, _start /* r0 <- current position of code */

ldr r1, _TEXT_BASE /* test if we run from flash or RAM */

cmp r0, r1 /* don't reloc during debug */

beq stack_setup

ldr r2, _armboot_start

ldr r3, _bss_start

sub r2, r3, r2 /* r2 <- size of armboot*/

add r2, r0, r2 /* r2 <- source end address */

copy_loop: (拷贝过程)

ldmia r0!, {r3-r10} /* copy from source address [r0] */

stmia r1!, {r3-r10} /* copy to target address [r1] */

cmp r0, r2 /* until source end addreee [r2] */

ble copy_loop

/* Set up the stack;设置堆栈 */

stack_setup:

ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */

sub r0, r0, #CFG_MALLOC_LEN /* malloc area */

sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo*/

clear_bss: (清空BSS段)

ldr r0, _bss_start /* find start of bss segment */

ldr r1, _bss_end /* stop here*/

mov r2, #0x00000000 /* clear */

clbss_l:str r2, [r0] /* clear loop... */

add r0, r0, #4

cmp r0, r1

bne clbss_l

ldr pc, _start_armboot

_start_armboot: .word start_armboot

(2)interrupts.c

这个文件是处理中断的,如打开和关闭中断等。

#ifdef CONFIG_USE_IRQ

/* enable IRQ interrupts;中断使能函数 */

void enable_interrupts (void)

{

unsigned long temp;

__asm__ __volatile__("mrs %0, cpsr\n"

"bic %0, %0, #0x80\n"

"msr cpsr_c, %0"

: "=r" (temp)

:

: "memory");

}

/*

* disable IRQ/FIQ interrupts;中断屏蔽函数

* returns true if interrupts had been enabled before we disabled them

*/

int disable_interrupts (void)

{

unsigned long old,temp;

__asm__ __volatile__("mrs %0, cpsr\n"

"orr %1, %0, #0xc0\n"

"msr cpsr_c, %1"

: "=r" (old), "=r" (temp)

:

: "memory");

return (old & 0x80) == 0;

}

#endif

void show_regs (struct pt_regs *regs)

{

unsigned long flags;

const char *processor_modes[] = {

"USER_26", "FIQ_26", "IRQ_26", "SVC_26",

"UK4_26", "UK5_26", "UK6_26", "UK7_26",

"UK8_26", "UK9_26", "UK10_26", "UK11_26",

"UK12_26", "UK13_26", "UK14_26", "UK15_26",

"USER_32", "FIQ_32", "IRQ_32", "SVC_32",

"UK4_32", "UK5_32", "UK6_32", "ABT_32",

"UK8_32", "UK9_32", "UK10_32", "UND_32",

"UK12_32", "UK13_32", "UK14_32", "SYS_32",

};

}

/* 在U-Boot启动模式下,在原则上要禁止中断处理,所以如果发生中断,当作出错处理 */

void do_fiq (struct pt_regs *pt_regs)

{

printf ("fast interrupt request\n");

show_regs (pt_regs);

bad_mode ();

}

void do_irq (struct pt_regs *pt_regs)

{

printf ("interrupt request\n");

show_regs (pt_regs);

bad_mode ();

}

(3)cpu.c

这个文件是对处理器进行操作,如下所示:

int cpu_init (void)

{

/*

* setup up stacks if necessary;设置需要的堆栈

*/

#ifdef CONFIG_USE_IRQ

DECLARE_GLOBAL_DATA_PTR;

IRQ_STACK_START=_armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;

FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;

#endif

return 0;

}

int cleanup_before_linux (void

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top