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