新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux開發(fā)環(huán)境的搭建之:U-Boot移植

嵌入式Linux開發(fā)環(huán)境的搭建之:U-Boot移植

作者: 時間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

本文引用地址:http://2s4d.com/article/257139.htm

(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.4主要步驟

(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è)置程序鏈接的起始地址,因為會在U-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句得到實際代碼啟動的內(nèi)存地址)

aadr0,r0,r3(用go命令調(diào)試u-boot時,啟動地址在RAM)

addr2,r2,r3(把初始化內(nèi)存信息的地址,加上實際啟動地址)

(3)將中斷禁止的部分應(yīng)該改為如下所示(/cpu/arm920t/start.S):

#ifdefined(CONFIG_S3C2410)

ldrr1,=0x7ff

ldrr0,=INTSUBMSK

strr1,[r0]

#endif

(4)因為在fs2410開發(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教程




評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉