uboot移植.docx

上传人:b****4 文档编号:4877458 上传时间:2022-12-11 格式:DOCX 页数:57 大小:1.01MB
下载 相关 举报
uboot移植.docx_第1页
第1页 / 共57页
uboot移植.docx_第2页
第2页 / 共57页
uboot移植.docx_第3页
第3页 / 共57页
uboot移植.docx_第4页
第4页 / 共57页
uboot移植.docx_第5页
第5页 / 共57页
点击查看更多>>
下载资源
资源描述

uboot移植.docx

《uboot移植.docx》由会员分享,可在线阅读,更多相关《uboot移植.docx(57页珍藏版)》请在冰豆网上搜索。

uboot移植.docx

uboot移植

交叉编译器:

4.3.2

一、建立自己的开发项目并测试编译

目前u-boot对很多cpu直接支持,比如smdk2400、smdk2410、smdk6400,但是没有smdk6410,由于smdk6400与smdk6410硬件资源相近,所以我们选择smdk6400为参照,建立自己的开发项目。

1、下载源码、解压

从网上ftp:

//ftp.denx.de/pub/u-boot/下载 u-boot-2010.03.tar.bz2,之所以选择此版本,是因为此版本与三星提供的u-boot.1.1.6相近,降低移植的难度。

2、进入board/samsun目录下,会发现有smdk6400文件夹,建立新文件夹smdk6410,并将smdk6400里的所有文件复制到smdk6410中,进入smdk6410文件夹将smdk6400.c更名为smdk6410.c,并且打开此文件,将里面的6400全部改为6410。

打开Makfile,将里面的6400改为6410。

结束推出到 u-boot-2010.03根目录。

3、进入到nand_spl/board/sansung/,复制smdk6400,并黏贴,将副本smdk6400更名为smdk6410,更改Makefile文件,将里面的6400全部改成6410。

4、进入到include/configs/复制smdk6400.h,并将副本改为smdk6410.h。

5、进入到 u-boot-2010.03根目录,打开Makefile,将CROSS_COMPILE?

=改成为CROSS_COMPILE?

=arm-linux-,然后搜索6400,会跳转到如下图所示

 

然后复制所有以上代码,并且将6400改成6410,如下图

 

然后运行makesmdk6410_config 然后在运行make,若通过则说明此次移植第一步基本成功,但是编译出来的u-boot.bin尚不能用,还要继续深入工作。

二、修改启动代码

1、首先修改cpu/arm1176/start.s,修改后的代码如下,

.globl_start

_start:

breset

#ifndefCONFIG_NAND_SPL

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

_pad:

.word0x12345678/*now16*4=64*/

#else

.=_start+64

#endif

.global_end_vect

_end_vect:

.balignl16,0xdeadbeef

/*

 *************************************************************************

 *

 *StartupCode(resetvector)

 *

 *doimportantinitonlyifwedon'tstartfrommemory!

 *setupMemoryandboardspecificbitspriortorelocation.

 *relocatearmboottoram

 *setupstack

 *

 *************************************************************************

 */

_TEXT_BASE:

.wordTEXT_BASE

/*

 *BelowvariableisveryimportantbecauseweuseMMUinU-Boot.

 *Withoutit,wecannotruncodecorrectlybeforeMMUisON.

 *byscsuh.

 */

_TEXT_PHY_BASE:

.wordCONFIG_SYS_PHY_UBOOT_BASE

.globl_armboot_start

_armboot_start:

.word_start

/*

 *Thesearedefinedintheboard-specificlinkerscript.

 */

.globl_bss_start

_bss_start:

.word__bss_start

.globl_bss_end

_bss_end:

.word_end

/*

 *theactualresetcode

 */

reset:

/*

 *setthecputoSVC32mode

 */

mrsr0,cpsr

bicr0,r0,#0x1f

orrr0,r0,#0xd3

msrcpsr,r0

/*

 *************************************************************************

 *

 *CPU_init_criticalregisters

 *

 *setupimportantregisters

 *setupmemorytiming

 *

 *************************************************************************

 */

/*

 *wedosys-criticalinitsonlyatreboot,

 *notwhenbootingfromram!

 */

cpu_init_crit:

/*

 *WhenbootingfromNAND-ithasdefinitelybeenareset,so,noneed

 *toflushcachesanddisabletheMMU

 */

/*

 *flushv4I/Dcaches

 */

movr0,#0

mcrp15,0,r0,c7,c7,0/*flushv3/v4cache*/

mcrp15,0,r0,c8,c7,0/*flushv4TLB*/

/*

 *disableMMUstuffandcaches

 */

mrcp15,0,r0,c1,c0,0

bicr0,r0,#0x00002300@clearbits13,9:

8(--V---RS)

bicr0,r0,#0x00000087@clearbits7,2:

0(B----CAM)

orrr0,r0,#0x00000002@setbit2(A)Align

orrr0,r0,#0x00001000@setbit12(I)I-Cache

mcrp15,0,r0,c1,c0,0

/*Periportsetup*/

ldrr0,=0x70000000

orrr0,r0,#0x13

mcrp15,0,r0,c15,c2,4   @256M(0x70000000-0x7fffffff)

/*

 *GosetupMemoryandboardspecificbitspriortorelocation.

 */

bllowlevel_init/*gosetuppll,mux,memory*/

/*whenwealreadyruninram,wedon'tneedtorelocateU-Boot.

 *andactually,memorycontrollermustbeconfiguredbeforeU-Boot

 *isrunninginram.

 */

ldrr0,=0xff000fff

bicr1,pc,r0/*r0<-currentbaseaddrofcode*/

ldrr2,_TEXT_BASE/*r1<-originalbaseaddrinram*/

bicr2,r2,r0/*r0<-currentbaseaddrofcode*/

cmp  r1,r2         /*comparer0,r1         */

beq  after_copy/*r0==r1thenskipflashcopy */

#ifdefCONFIG_BOOT_NAND

movr0,#0x1000

blcopy_from_nand

#endif

after_copy:

#ifdefCONFIG_ENABLE_MMU

enable_mmu:

/*enabledomainaccess*/

ldrr5,=0x0000ffff

mcrp15,0,r5,c3,c0,0/*loaddomainaccessregister*/

/*SettheTTBregister*/

ldrr0,_mmu_table_base

ldrr1,=CONFIG_SYS_PHY_UBOOT_BASE

ldrr2,=0xfff00000

bicr0,r0,r2

orrr1,r0,r1

mcrp15,0,r1,c2,c0,0

/*EnabletheMMU*/

mmu_on:

mrcp15,0,r0,c1,c0,0

orrr0,r0,#1/*SetCR_MtoenableMMU*/

mcrp15,0,r0,c1,c0,0

nop

nop

nop

nop

#endif

skip_hw_init:

/*Setupthestack   */

stack_setup:

#ifdefCONFIG_MEMORY_UPPER_CODE

ldrsp,=(CONFIG_SYS_UBOOT_BASE+ CONFIG_SYS_UBOOT_SIZE-0xc)

#else

ldrr0,_TEXT_BASE/*upper128KiB:

relocateduboot */

subr0,r0,#CONFIG_SYS_MALLOC_LEN/*mallocarea           */

subr0,r0,#CONFIG_SYS_GBL_DATA_SIZE/*bdinfo            */

#ifdefCONFIG_USE_IRQ

subr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

subsp,r0,#12/*leave3wordsforabort-stack  */

#endif

clear_bss:

ldrr0,_bss_start/*findstartofbsssegment    */

ldrr1,_bss_end/*stophere            */

mov r2,#0/*clear              */

clbss_l:

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

addr0,r0,#4

cmpr0,r1

bleclbss_l

ldrpc,_start_armboot

_start_armboot:

.wordstart_armboot

#ifdefCONFIG_ENABLE_MMU

_mmu_table_base:

.wordmmu_table

#endif

/*

 *copyU-BoottoSDRAMandjumptoram(fromNANDorOneNAND)

 *r0:

sizetobecompared

 *Load1'st2blockstoRAMbecauseU-boot'ssizeislargerthan1block(128k)size

 */

.globlcopy_from_nand

copy_from_nand:

movr10,lr/*savereturnaddress*/

movr9,r0

/*getreadytocallCfunctions*/

ldrsp,_TEXT_PHY_BASE/*setuptempstackpointer*/

subsp,sp,#12

movfp,#0/*nopreviousframe,sofp=0*/

movr9,#0x1000

blcopy_uboot_to_ram     //此函数需要添加,稍后说明。

3:

tst r0,#0x0

bnecopy_failed

ldrr0,=0x0c000000

ldrr1,_TEXT_PHY_BASE

1:

ldrr3,[r0],#4

ldrr4,[r1],#4

teqr3,r4

bnecompare_failed/*notmatched*/

subsr9,r9,#4

bne1b

4:

movlr,r10/*allisOK*/

movpc,lr

copy_failed:

nop/*copyfromnandfailed*/

bcopy_failed

compare_failed:

nop/*comparefailed*/

bcompare_failed

 

/*

 *weassumethatcacheoperationisdonebefore.(eg.cleanup_before_linux())

 *actually,wedon'tneedtodoanythingaboutcacheifnotused-cachein

 *U-Boot.So,inthisfunctionwecleanonlyMMU.byscsuh

 *

 *voidtheLastJump(void*kernel,intarch_num,uintboot_params);

 */

#ifdefCONFIG_ENABLE_MMU

.globltheLastJump

theLastJump:

movr9,r0

ldrr3,=0xfff00000

ldrr4,_TEXT_PHY_BASE

adrr5,phy_last_jump

bicr5,r5,r3

orrr5,r5,r4

movpc,r5

phy_last_jump:

/*

 *disableMMUstuff

 */

mrcp15,0,r0,c1,c0,0

bicr0,r0,#0x00002300/*clearbits13,9:

8(--V---RS)*/

bicr0,r0,#0x00000087/*clearbits7,2:

0(B----CAM)*/

orrr0,r0,#0x00000002/*setbit2(A)Align*/

orrr0,r0,#0x00001000/*setbit12(I)I-Cache*/

mcrp15,0,r0,c1,c0,0

mcrp15,0,r0,c8,c7,0/*flushv4TLB*/

movr0,#0

movpc,r9

#endif

/*

 *************************************************************************

 *

 *Interrupthandling

 *

 *************************************************************************

 */

@

@IRQstackframe.

@

#defineS_FRAME_SIZE72

#defineS_OLD_R068

#defineS_PSR64

#defineS_PC60

#defineS_LR56

#defineS_SP52

#defineS_IP48

#defineS_FP44

#defineS_R1040

#defineS_R936

#defineS_R832

#defineS_R728

#defineS_R624

#defineS_R520

#defineS_R416

#defineS_R312

#defineS_R28

#defineS_R14

#defineS_R00

#defineMODE_SVC0x13

#defineI_BIT 0x80

/*

 *usebad_save_user_regsforabort/prefetch/undef/swi...

 */

.macrobad_save_user_regs

/*carveoutaframeoncurrentuserstack*/

subsp,sp,#S_FRAME_SIZE

/*Saveuserregisters(nowinsvcmode)r0-r12*/

stmiasp,{r0-r12}

ldrr2,_armboot_start

subr2,r2,#(CONFIG_SYS_MALLOC_LEN)

/*setbase2wordsintoabortstack*/

subr2,r2,#(CONFIG_SYS_GBL_DATA_SIZE+8)

/*getvaluesfor"aborted"pcandcpsr(intoparmregs)*/

ldmiar2,{r2-r3}

/*grabpointertooldstack*/

addr0,sp,#S_FRAME_SIZE

addr5,sp,#S_SP

movr1,lr

/*savesp_SVC,lr_SVC,pc,cpsr*/

stmiar5,{r0-r3}

/*savecurrentstackintor0(paramregister)*/

movr0,sp@savecurrentstackintor0(paramregister)

.endm

.macroirq_save_user_regs

subsp,sp,#S_FRAME_SIZE

stmiasp,{r0-r12}@Callingr0-r12

addr8,sp,#S_PC@!

!

!

!

R8NEEDStobesaved!

!

!

!

areservedstackspotwouldbegood.

stmdbr8,{sp,lr}^@CallingSP,LR

strlr,[r8,#0]@SavecallingPC

mrsr6,spsr

strr6,[r8,#4]@SaveCPSR

strr0,[r8,#8]@SaveOLD_R0

movr0,sp

.endm

.macroirq_restore_user_regs

ldmiasp,{r0-lr}^@Callingr0-lr

movr0,r0

ldrlr,[sp,#S_PC]@GetPC

addsp,sp,#S_FRAME_SIZE

subspc,lr,#4@return&movespsr_svcintocpsr

.endm

.macroget_bad_stack

/*setupourmodestack(enterinbankedmode)*/

ldrr13,_armboot_start

/*movepastmallocpool*/

subr13,r13,#(CONFIG_SYS_MALLOC_LEN)

/*movetoreservedacouplespotsforabortstack*/

subr13,r13,#(CONFIG_SYS_GBL_DATA_SIZE+8)

/*savecallerlrinposition0ofsavedstack*/

strlr,[r13]

/*getthespsr*/

mrslr,spsr

/*savespsrinposition1ofsavedstack*/

strlr,[r13,#4]

/*prepareSVC-Mode*/

movr13,#MODE_SVC

@msrspsr_c,r13

/*switchmodes,makesuremoveswillexecute*/

msrspsr,r13

/*captu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1