嵌入式Linux開發(fā)環(huán)境的搭建之:U-Boot移植
(4)memsetup.S
這個文件是用于配置開發(fā)板參數(shù)的,如下所示:
/*memsetup.c*/
/*memorycontrolconfiguration*/
/*maker0relativethecurrentlocationsothatit*/
/*readsSMRDATAoutofFLASHratherthanmemory!*/
ldrr0,=SMRDATA
ldrr1,_TEXT_BASE
subr0,r0,r1
ldrr1,=BWSCON /*BusWidthStatusController*/
addr2,r0,#52
0:
ldrr3,[r0],#4
strr3,[r1],#4
cmpr2,r0
bne0b
/*everythingisfinenow*/
movpc,lr
.ltorg
5.2.4U-Boot移植主要步驟
(1)建立自己的開發(fā)板類型。
閱讀makefile文件,在makefile文件中添加兩行,如下所示:
fs2410_config:unconfig
@./mkconfig$(@:_config=)armarm920tfs2410
其中“arm”為表示處理器體系結(jié)構(gòu)的種類,“arm920t”表示處理器體系結(jié)構(gòu)的名稱,“fs2410”為主板名稱。
在board目錄中建立fs2410目錄,并將smdk2410目錄中的內(nèi)容(cp–asmdk2410/*fs2410)復(fù)制到該目錄中。
n 在include/configs/目錄下將smdk2410.h復(fù)制到(cpsmdk2410.hfs2410.h)。
n 修改ARM編譯器的目錄名及前綴(都要改成以“fs2410”開頭)。
n 完成之后,可以測試配置。
$makefs2410_config;make
(2)修改程序鏈接地址。
在board/s3c2410中有一個config.mk文件,它是用于設(shè)置程序鏈接的起始地址,因?yàn)闀赨-Boot中增加功能,所以留下6MB的空間,修改33F80000為33A00000。
為了以后能用U-Boot的“go”命令執(zhí)行修改過的用loadb或tftp下載的U-Boot,需要在board/s3c2410的memsetup.S中標(biāo)記符”0:”上加入5句:
movr3,pc
ldrr4,=0x3FFF0000
andr3,r3,r4(以上3句得到實(shí)際代碼啟動的內(nèi)存地址)
aadr0,r0,r3(用go命令調(diào)試u-boot時,啟動地址在RAM)
addr2,r2,r3(把初始化內(nèi)存信息的地址,加上實(shí)際啟動地址)
(3)將中斷禁止的部分應(yīng)該改為如下所示(/cpu/arm920t/start.S):
#ifdefined(CONFIG_S3C2410)
ldrr1,=0x7ff
ldrr0,=INTSUBMSK
strr1,[r0]
#endif
(4)因?yàn)樵趂s2410開發(fā)板啟動時是直接從NandFlash加載代碼,所以啟動代碼應(yīng)該改成如下所示(/cpu/arm920t/start.S):
#ifdefCONFIG_S3C2410_NAND_BOOT@START
@resetNAND
movr1,#NAND_CTL_BASE
ldrr2,=0xf830@initialvalue
strr2,[r1,#oNFCONF]
ldrr2,[r1,#oNFCONF]
bicr2,r2,#0x800@enablechip
strr2,[r1,#oNFCONF]
movr2,#0xff@RESETcommand
strbr2,[r1,#oNFCMD]
movr3,#0@wait
nand1:
addr3,r3,#0x1
cmpr3,#0xa
bltnand1
nand2:
ldrr2,[r1,#oNFSTAT]@waitready
tstr2,#0x1
beqnand2
ldrr2,[r1,#oNFCONF]
orrr2,r2,#0x800@disablechip
strr2,[r1,#oNFCONF]
@getreadtocallCfunctions(fornand_read())
ldrsp,DW_STACK_START@setupstackpointer
movfp,#0@nopreviousframe,sofp=0
@copyU-BoottoRAM
ldrr0,=TEXT_BASE
movr1,#0x0
movr2,#0x20000
blnand_read_ll
tstr0,#0x0
beqok_nand_read
bad_nand_read:
loop2:bloop2@infiniteloop
ok_nand_read:
@verify
movr0,#0
ldrr1,=TEXT_BASE
movr2,#0x400@4bytes*1024=4K-bytes
go_next:
ldrr3,[r0],#4
ldrr4,[r1],#4
teqr3,r4
bnenotmatch
subsr2,r2,#4
beqstack_setup
bnego_next
notmatch:
loop3:bloop3@infiniteloop
#endif@CONFIG_S3C2410_NAND_BOOT@END
在“_start_armboot:.wordstart_armboot”后加入:
.align2
DW_STACK_START:.wordSTACK_BASE+STACK_SIZE-4
(5)修改內(nèi)存配置(board/fs2410/lowlevel_init.S)。
#defineBWSCON0x48000000
#definePLD_BASE0x2C000000
#defineSDRAM_REG0x2C000106
/*BWSCON*/
#defineDW8 (0x0)
#defineDW16(0x1)
#defineDW32(0x2)
#defineWAIT(0x12)
#defineUBLB(0x13)
/*BANKSIZE*/
#defineBURST_EN(0x17)
#defineB1_BWSCON(DW16+WAIT)
#defineB2_BWSCON(DW32)
#defineB3_BWSCON(DW32)
#defineB4_BWSCON(DW16+WAIT+UBLB)
#defineB5_BWSCON(DW8+UBLB)
#defineB6_BWSCON(DW32)
#defineB7_BWSCON(DW32)
/*BANK0CON*/
#defineB0_Tacs0x0/*0clk*/
#defineB0_Tcos0x1/*1clk*/
#defineB0_Tacc0x7/*14clk*/
#defineB0_Tcoh0x0/*0clk*/
#defineB0_Tah0x0/*0clk*/
#defineB0_Tacp0x0/*pagemodeisnotused*/
#defineB0_PMC0x0/*pagemodedisabled*/
/*BANK1CON*/
#defineB1_Tacs0x0/*0clk*/
#defineB1_Tcos0x1/*1clk*/
#defineB1_Tacc0x7/*14clk*/
#defineB1_Tcoh0x0/*0clk*/
#defineB1_Tah0x0/*0clk*/
#defineB1_Tacp0x0/*pagemodeisnotused*/
#defineB1_PMC0x0/*pagemodedisabled*/
……
/*REFRESHparameter*/
#defineREFEN0x1/*Refreshenable*/
#defineTREFMD0x0/*CBR(CASbeforeRAS)/Autorefresh*/
#defineTrp0x0/*2clk*/
#defineTrc0x3/*7clk*/
#defineTchr0x2/*3clk*/
#defineREFCNT1113/*period=15.6us,HCLK=60Mhz,(2048+1-15.6*60)*/
......
.word((B6_MT15)+(B6_Trcd2)+(B6_SCAN))
.word((B7_MT15)+(B7_Trcd2)+(B7_SCAN))
.word((REFEN23)+(TREFMD22)+(Trp20)+(Trc18)+(Tchr16)+REFCNT)
.word0x32
.word0x30
.word0x30
(6)加入NandFlash讀函數(shù)(創(chuàng)建board/fs2410/nand_read.c文件)。
#includeconfig.h>
#define__REGb(x)(*(volatileunsignedchar*)(x))
#define__REGi(x)(*(volatileunsignedint*)(x))
#defineNF_BASE0x4e000000
#defineNFCONF__REGi(NF_BASE+0x0)
#defineNFCMD__REGb(NF_BASE+0x4)
#defineNFADDR__REGb(NF_BASE+0x8)
#defineNFDATA__REGb(NF_BASE+0xc)
#defineNFSTAT__REGb(NF_BASE+0x10)
#defineBUSY1
inlinevoidwait_idle(void)
{
Inti;
while(!(NFSTATBUSY))
{
for(i=0;i10;i++);
}
}
/*lowlevelnandreadfunction*/
intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)
{
inti,j;
if((start_addrNAND_BLOCK_MASK)||(sizeNAND_BLOCK_MASK))
{
return-1;/*invalidalignment*/
}
/*chipEnable*/
NFCONF=~0x800;
for(i=0;i10;i++);
for(i=start_addr;i(start_addr+size);)
{
/*READ0*/
NFCMD=0;
/*WriteAddress*/
NFADDR=i0xff;
NFADDR=(i>>9)0xff;
NFADDR=(i>>17)0xff;
NFADDR=(i>>25)0xff;
wait_idle();
for(j=0;jNAND_SECTOR_SIZE;j++,i++)
{
*buf=(NFDATA0xff);
buf++;
}
}
/*chipDisable*/
NFCONF|=0x800;/*chipdisable*/
return0;
}
修改board/fs2410/makefile文件,以增加nand_read()函數(shù)。
OBJS:=fs2410.oflash.onand_read.o
c語言相關(guān)文章:c語言教程
linux相關(guān)文章:linux教程
評論