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

时间:2013-09-13来源:网络

2.U-Boot重要代码

(1)cpu/arm920t/start.S

这是U-Boot的起始位置。在这个文件中设置了处理器的状态、初始化中断向量和内存时序等,从Flash中跳转到定位好的内存位置执行。

.globl_start(起始位置:中断向量设置)

_start:breset

ldrpc,_undefined_instruction

ldrpc,_software_interrupt

ldrpc,_prefetch_abort

ldrpc,_data_abort

ldrpc,_not_used

ldrpc,_irq

ldrpc,_fiq

_undefined_instruction:.wordundefined_instruction

_software_interrupt:.wordsoftware_interrupt

_prefetch_abort:.wordprefetch_abort

_data_abort:.worddata_abort

_not_used:.wordnot_used

_irq:.wordirq

_fiq:.wordfiq

_TEXT_BASE:(代码段起始位置)

.wordTEXT_BASE

.globl_armboot_start

_armboot_start:

.word_start

/*

*Thesearedefinedintheboard-specificlinkerscript.

*/

.globl_bss_start(BSS段起始位置)

_bss_start:

.word__bss_start

.globl_bss_end

_bss_end:

.word_end

reset:(执行入口)

/*

*setthecputoSVC32mode;使处理器进入特权模式

*/

mrsr0,cpsr

bicr0,r0,#0x1f

orrr0,r0,#0xd3

msrcpsr,r0

relocate:(代码的重置)/*relocateU-BoottoRAM*/

adrr0,_start/*r0-currentpositionofcode*/

ldrr1,_TEXT_BASE/*testifwerunfromflashorRAM*/

cmpr0,r1/*dontrelocduringdebug*/

beqstack_setup

ldrr2,_armboot_start

ldrr3,_bss_start

subr2,r3,r2/*r2-sizeofarmboot*/

addr2,r0,r2/*r2-sourceendaddress*/

copy_loop:(拷贝过程)

ldmiar0!,{r3-r10}/*copyfromsourceaddress[r0]*/

stmiar1!,{r3-r10}/*copytotargetaddress[r1]*/

cmpr0,r2/*untilsourceendaddreee[r2]*/

blecopy_loop

/*Setupthestack;设置堆栈*/

stack_setup:

ldrr0,_TEXT_BASE/*upper128KiB:relocateduboot*/

subr0,r0,#CFG_MALLOC_LEN/*mallocarea*/

subr0,r0,#CFG_GBL_DATA_SIZE/*bdinfo*/

clear_bss:(清空BSS段)

ldrr0,_bss_start/*findstartofbsssegment*/

ldrr1,_bss_end/*stophere*/

movr2,#0x00000000/*clear*/

clbss_l:strr2,[r0]/*clearloop...*/

addr0,r0,#4

cmpr0,r1

bneclbss_l

ldrpc,_start_armboot

_start_armboot:.wordstart_armboot

(2)interrupts.c

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

#ifdefCONFIG_USE_IRQ

/*enableIRQinterrupts;中断使能函数*/

voidenable_interrupts(void)

{

unsignedlongtemp;

__asm____volatile__(mrs%0,cpsrn

bic%0,%0,#0x80n

msrcpsr_c,%0

:=r(temp)

:

:memory);

}

/*

*disableIRQ/FIQinterrupts;中断屏蔽函数

*returnstrueifinterruptshadbeenenabledbeforewedisabledthem

*/

intdisable_interrupts(void)

{

unsignedlongold,temp;

__asm____volatile__(mrs%0,cpsrn

orr%1,%0,#0xc0n

msrcpsr_c,%1

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

:

:memory);

return(old0x80)==0;

}

#endif

voidshow_regs(structpt_regs*regs)

{

unsignedlongflags;

constchar*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启动模式下,在原则上要禁止中断处理,所以如果发生中断,当作出错处理*/

voiddo_fiq(structpt_regs*pt_regs)

{

printf(fastinterruptrequestn);

show_regs(pt_regs);

bad_mode();

}

voiddo_irq(structpt_regs*pt_regs)

{

printf(interruptrequestn);

show_regs(pt_regs);

bad_mode();

}

(3)cpu.c

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

intcpu_init(void)

{

/*

*setupupstacksifnecessary;设置需要的堆栈

*/

#ifdefCONFIG_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

return0;

}

intcleanup_before_linux(void)/*准备加载linux*/

{

/*

*thisfunctioniscalledjustbeforewecalllinux

*itpreparestheprocessorforlinux

*

*weturnoffcachesetc...

*/

unsignedlongi;

disable_interrupts();

/*turnoffI/D-cache:关闭cache*/

asm(mrcp15,0,%0,c1,c0,0:=r(i));

i=~(C1_DC|C1_IC);

asm(mcrp15,0,%0,c1,c0,0::r(i));

/*flushI/D-cache*/

i=0;

asm(mcrp15,0,%0,c7,c7,0::r(i));

return(0);

}

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

.=0x00000000;

.=ALIGN(4);

.text:

{

cpu/arm920t/start.o(.text)

*(.text)

}

.=ALIGN(4);

.rodata:{*(.rodata)}

.=ALIGN(4);

.data:{*(.data)}

.=ALIGN(4);

.got:{*(.got)}

__u_boot_cmd_start=.;

.u_boot_cmd:{*(.u_boot_cmd)}

__u_boot_cmd_end=.;

.=ALIGN(4);

__bss_start=.;

.bss:{*(.bss)}

_end=.;

}

1 2 3 4 5

关键词: 嵌入式Linux U-Boot移植 Bootloader

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版