新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux開發環境的搭建之:U-Boot移植

        嵌入式Linux開發環境的搭建之:U-Boot移植

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257139.htm

        (4)memsetup.S

        這個文件是用于配置開發板參數的,如下所示:

        /*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)建立自己的開發板類型。

        閱讀makefile文件,在makefile文件中添加兩行,如下所示:

        fs2410_config:unconfig

        @./mkconfig$(@:_config=)armarm920tfs2410

        其中“arm”為表示處理器體系結構的種類,“arm920t”表示處理器體系結構的名稱,“fs2410”為主板名稱。

        在board目錄中建立fs2410目錄,并將smdk2410目錄中的內容(cp–asmdk2410/*fs2410)復制到該目錄中。

        n 在include/configs/目錄下將smdk2410.h復制到(cpsmdk2410.hfs2410.h)。

        n 修改ARM編譯器的目錄名及前綴(都要改成以“fs2410”開頭)。

        n 完成之后,可以測試配置。

        $makefs2410_config;make

        (2)修改程序鏈接地址。

        在board/s3c2410中有一個config.mk文件,它是用于設置程序鏈接的起始地址,因為會在U-Boot中增加功能,所以留下6MB的空間,修改33F80000為33A00000。

        為了以后能用U-Boot的“go”命令執行修改過的用loadb或tftp下載的U-Boot,需要在board/s3c2410的memsetup.S中標記符”0:”上加入5句:

        movr3,pc

        ldrr4,=0x3FFF0000

        andr3,r3,r4(以上3句得到實際代碼啟動的內存地址)

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

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

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

        #ifdefined(CONFIG_S3C2410)

        ldrr1,=0x7ff

        ldrr0,=INTSUBMSK

        strr1,[r0]

        #endif

        (4)因為在fs2410開發板啟動時是直接從NandFlash加載代碼,所以啟動代碼應該改成如下所示(/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)修改內存配置(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讀函數(創建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()函數。

        OBJS:=fs2410.oflash.onand_read.o

        c語言相關文章:c語言教程


        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 即墨市| 酒泉市| 方正县| 定南县| 上虞市| 迁西县| 平阳县| 河间市| 阜城县| 永宁县| 德阳市| 汕头市| 大庆市| 双江| 绵竹市| 建昌县| 监利县| 浮山县| 桐柏县| 临泉县| 澎湖县| 建阳市| 福贡县| 安吉县| 铜梁县| 施秉县| 皋兰县| 铁岭市| 双鸭山市| 汝州市| 天等县| 湄潭县| 龙陵县| 奉节县| 巴中市| 垫江县| 德清县| 西青区| 雷州市| 辛集市| 娄底市|