ubootfs移植过程.docx

上传人:b****5 文档编号:8001006 上传时间:2023-01-27 格式:DOCX 页数:16 大小:21.46KB
下载 相关 举报
ubootfs移植过程.docx_第1页
第1页 / 共16页
ubootfs移植过程.docx_第2页
第2页 / 共16页
ubootfs移植过程.docx_第3页
第3页 / 共16页
ubootfs移植过程.docx_第4页
第4页 / 共16页
ubootfs移植过程.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

ubootfs移植过程.docx

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

ubootfs移植过程.docx

ubootfs移植过程

实验三移植U-Boot-1.3.1实验

【实验目的】

了解U-Boot-1.3.1的代码结构,掌握其移植方法。

【实验环境】

1、Ubuntu7.0.4发行版

2、u-boot-1.3.1

3、FS2410平台

4、交叉编译器arm-softfloat-linux-gnu-gcc-3.4.5

【实验步骤】

一、建立自己的平台类型

(1)解压文件

#tarjxvfu-boot-1.3.1.tar.bz2

(2)进入U-Boot源码目录

#cdu-boot-1.3.1

(3)创建自己的开发板:

#cdboard

#cpsmdk2410fs2410–a

#cdfs2410

#mvsmdk2410.cfs2410.c

#viMakefile(将smdk2410修改为fs2410)

#cd../../include/configs

#cpsmdk2410.hfs2410.h

退回U-Boot根目录:

#cd../../

(4)建立编译选项

#viMakefile

smdk2410_config:

      unconfig

       @$(MKCONFIG)$(@:

_config=)armarm920tsmdk2410NULLs3c24x0

fs2410_config   :

   unconfig

       @$(MKCONFIG)$(@:

_config=)armarm920tfs2410NULLs3c24x0

arm:

CPU的架构(ARCH)

arm920t:

CPU的类型(CPU),其对应于cpu/arm920t子目录。

fs2410:

开发板的型号(BOARD),对应于board/fs2410目录。

NULL:

开发者/或经销商(vender),本例为空

s3c24x0:

片上系统(SOC)

(5)编译

#makefs2410_config;

#make

本步骤将编译u-boot.bin文件,但此时还无法运行在FS2410开发板上。

二、修改cpu/arm920t/start.S文件,完成U-Boot的重定向

(1)修改中断禁止部分

#ifdefined(CONFIG_S3C2410)

   ldr   r1,=0x7ff  /*根据2410芯片手册,INTSUBMSK有11位可用*/

ldr   r0,=INTSUBMSK

   str   r1,[r0]

#endif

(2)修改时钟设置(这个文件要根据具体的平台进行修改)

(3)将从NorFlash启动改成从NANDFlash启动

在文件中找到195-201代码,并在201行后面添加如下代码:

195copy_loop:

196ldmiar0!

{r3-r10}/*copyfromsourceaddress[r0]*/

197stmiar1!

{r3-r10}/*copytotargetaddress[r1]*/

198cmpr0,r2/*untilsourceendaddreee[r2]*/

199blecopy_loop

200#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/

201#endif

#ifdefCONFIG_S3C2410_NAND_BOOT

@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,#0x30000

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

(4)在“_start_armboot:

   .wordstart_armboot ”后加入:

.align2

DW_STACK_START:

.wordSTACK_BASE+STACK_SIZE-4

三、创建board/fs2410/nand_read.c文件,加入读NANDFlash的操作。

#include

#define__REGb(x)(*(volatileunsignedchar*)(x))

#define__REGi(x)(*(volatileunsignedint*)(x))

#defineNF_BASE0x4e000000

#ifdefined(CONFIG_S3C2410)

#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(!

(NFSTAT&BUSY))

for(i=0;i<10;i++);

}

/*lowlevelnandreadfunction*/

intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)

{

inti,j;

if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK)){

return-1;/*invalidalignment*/

}

/*chipEnable*/

NFCONF&=~0x800;

for(i=0;i<10;i++);

for(i=start_addr;i<(start_addr+size);){

/*READ0*/

NFCMD=0;

/*WriteAddress*/

NFADDR=i&0xff;

NFADDR=(i>>9)&0xff;

NFADDR=(i>>17)&0xff;

NFADDR=(i>>25)&0xff;

wait_idle();

for(j=0;j

*buf=(NFDATA&0xff);

buf++;

}

}

/*chipDisable*/

NFCONF|=0x800;/*chipdisable*/

return0;

}

#endif

四.同时修改board/fs2410/Makefile文件,增加nand_read文件

COBJS :

=fs2410.o nand_read.oflash.o

五、修改board/fs2410/fs2410.c文件,加入NANDFlash操作

(1)加入NandFlash的初始化函数

在文件的最后加入NandFlash的初始化函数,该函数在后面NandFlash的操作都要用到。

u-boot运行到第2阶段会进入start_armboot()函数。

其中nand_init()函数是对nandflash的最初初始化函数。

nand_init()函数在两个文件中实现。

其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用drivers/nand/nand.c中的nand_init();否则调用自己在本文件中的nand_init()函数,本例使用后者。

fs2410.c代码如下:

#ifdefined(CONFIG_CMD_NAND)

typedefenum{

NFCE_LOW,

NFCE_HIGH

}NFCE_STATE;

staticinlinevoidNF_Conf(u16conf)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

nand->NFCONF=conf;

}

staticinlinevoidNF_Cmd(u8cmd)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

nand->NFCMD=cmd;

}

staticinlinevoidNF_CmdW(u8cmd)

{

NF_Cmd(cmd);

udelay

(1);

}

staticinlinevoidNF_Addr(u8addr)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

nand->NFADDR=addr;

}

staticinlinevoidNF_WaitRB(void)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

while(!

(nand->NFSTAT&(1<<0)));

}

staticinlinevoidNF_Write(u8data)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

nand->NFDATA=data;

}

staticinlineu8NF_Read(void)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

return(nand->NFDATA);

}

staticinlineu32NF_Read_ECC(void)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

return(nand->NFECC);

}

staticinlinevoidNF_SetCE(NFCE_STATEs)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

switch(s){

caseNFCE_LOW:

nand->NFCONF&=~(1<<11);

break;

caseNFCE_HIGH:

nand->NFCONF|=(1<<11);

break;

}

}

staticinlinevoidNF_Init_ECC(void)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

nand->NFCONF|=(1<<12);

}

externulongnand_probe(ulongphysadr);

staticinlinevoidNF_Reset(void)

{

inti;

NF_SetCE(NFCE_LOW);

NF_Cmd(0xFF);/*resetcommand*/

for(i=0;i<10;i++);/*tWB=100ns.*/

NF_WaitRB();/*wait200~500us;*/

NF_SetCE(NFCE_HIGH);

}

staticinlinevoidNF_Init(void)

{

#if0

#defineTACLS0

#defineTWRPH03

#defineTWRPH10

#else

#defineTACLS0

#defineTWRPH04

#defineTWRPH12

#endif

#ifdefined(CONFIG_S3C2440)

NF_Conf((TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4));

NF_Cont((1<<6)|(1<<4)|(1<<1)|(1<<0));

#else

NF_Conf((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0));

/*nand->NFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);*/

/*1111,1xxx,rxxx,rxxx*/

/*En512B4stepECCRnFCE=HtACLStWRPH0tWRPH1*/

#endif

NF_Reset();

}

voidnand_init(void)

{

S3C2410_NAND*constnand=S3C2410_GetBase_NAND();

NF_Init();

#ifdefDEBUG

printf("NANDflashprobingat0x%.8lX\n",(ulong)nand);

#endif

printf("%4luMB\n",nand_probe((ulong)nand)>>20);

}

#endif

(2)配置GPIO和PLL

根据开发板的硬件说明和芯片手册,修改GPIO和PLL的配置。

六、修改include/configs/fs2410.h头文件

(1)加入命令定义

/* Commandlineconfiguration. */

#include

#defineCONFIG_CMD_ASKENV

#defineCONFIG_CMD_CACHE

#defineCONFIG_CMD_DATE

#defineCONFIG_CMD_DHCP

#defineCONFIG_CMD_ELF

#defineCONFIG_CMD_PING

#defineCONFIG_CMD_NAND

#defineCONFIG_CMD_REGINFO

#defineCONFIG_CMD_USB

#defineCONFIG_CMD_FAT

(2)修改命令提示符

#defineCFG_PROMPT"SMDK2410#"

->#defineCFG_PROMPT"FS2410#"

(3)修改默认载入地址

#defineCFG_LOAD_ADDR0x33000000

->#defineCFG_LOAD_ADDR0x30008000

(4)加入Flash环境信息

#defineCFG_ENV_IS_IN_NAND1

#defineCFG_ENV_OFFSET0X30000

#defineCFG_NAND_LEGACY

//#define    CFG_ENV_IS_IN_FLASH    1

#defineCFG_ENV_SIZE        0x10000    /*TotalSizeofEnvironmentSector*/

(5)加入NandFlash设置(在文件结尾处)

/*NANDflashsettings */

#ifdefined(CONFIG_CMD_NAND)

#defineCFG_NAND_BASE0x4E000000/*NandFlash控制器在SFR区起始寄存器地址*/

#defineCFG_MAX_NAND_DEVICE1 /*支持的最在NandFlash数据*/

#defineSECTORSIZE512/*1页的大小*/

#defineNAND_SECTOR_SIZESECTORSIZE

#defineNAND_BLOCK_MASK511/*页掩码*/

#defineADDR_COLUMN1/*一个字节的Column地址*/

#defineADDR_PAGE3/*3字节的页块地址!

!

!

!

!

*/

#defineADDR_COLUMN_PAGE4/*总共4字节的页块地址!

!

!

!

!

*/

#defineNAND_ChipID_UNKNOWN0x00/*未知芯片的ID号*/

#defineNAND_MAX_FLOORS1

#defineNAND_MAX_CHIPS1

/*NandFlash命令层底层接口函数*/

#defineWRITE_NAND_ADDRESS(d,adr){rNFADDR=d;}

#defineWRITE_NAND(d,adr){rNFDATA=d;}

#defineREAD_NAND(adr)(rNFDATA)

#defineNAND_WAIT_READY(nand){while(!

(rNFSTAT&(1<<0)));}

#defineWRITE_NAND_COMMAND(d,adr){rNFCMD=d;}

#defineWRITE_NAND_COMMANDW(d,adr)    NF_CmdW(d)

#defineNAND_DISABLE_CE(nand){rNFCONF|=(1<<11);}

#defineNAND_ENABLE_CE(nand){rNFCONF&=~(1<<11);}

/*thefollowingfunctionsareNOP'sbecauseS3C24X0handlesthisinhardware*/

#defineNAND_CTL_CLRALE(nandptr)

#defineNAND_CTL_SETALE(nandptr)

#defineNAND_CTL_CLRCLE(nandptr)

#defineNAND_CTL_SETCLE(nandptr)

/*允许NandFlash写校验*/

#defineCONFIG_MTD_NAND_VERIFY_WRITE1

(6)加入NandFlash启动支持(在文件结尾处)

/*NandflashBoot*/

#defineSTACK_BASE0x33f00000

#defineSTACK_SIZE0x8000

/*NANDFlashController*/

#defineNAND_CTL_BASE0x4E000000

#definebINT_CTL(Nb)__REG(INT_CTL_BASE+(Nb))

/*Offset*/

#defineoNFCONF0x00

#defineCONFIG_S3C2410_NAND_BOOT1

/*Offset*/

#defineoNFCONF0x00

#defineoNFCMD0x04

#defineoNFADDR0x08

#defineoNFDATA0x0c

#defineoNFSTAT0x10

#defineoNFECC0x14

#definerNFCONF(*(volatileunsignedint*)0x4e000000)

#definerNFCMD(*(volatileunsignedchar*)0x4e000004)

#definerNFADDR(*(volatileunsignedchar*)0x4e000008)

#definerNFDATA(*(volatileunsignedchar*)0x4e00000c)

#definerNFSTAT(*(volatileunsignedint*)0x4e000010)

#definerNFECC(*(volatileunsignedint*)0x4e000014)

#definerNFECC0(*(volatileunsignedchar*)0x4e000014)

#definerNFECC1(*(volatileunsignedchar*)0x4e000015)

#definerNFECC2(*(volatileunsignedchar*)0x4e000016)

#endif

(7)加入jffs2的支持

/*JFFS2Support*/

#undefCONFIG_JFFS2_CMDLINE

#defineCONFIG_JFFS2_NAND1

#defineCONFIG_JFFS2_DEV"nand0"

#defineCONFIG_JFFS2_PART_SIZE0x4c0000

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

当前位置:首页 > 求职职场 > 自我管理与提升

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

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