基于s3c2410的uboot120的分析以及移植下篇.docx

上传人:b****5 文档编号:8522786 上传时间:2023-01-31 格式:DOCX 页数:12 大小:21.40KB
下载 相关 举报
基于s3c2410的uboot120的分析以及移植下篇.docx_第1页
第1页 / 共12页
基于s3c2410的uboot120的分析以及移植下篇.docx_第2页
第2页 / 共12页
基于s3c2410的uboot120的分析以及移植下篇.docx_第3页
第3页 / 共12页
基于s3c2410的uboot120的分析以及移植下篇.docx_第4页
第4页 / 共12页
基于s3c2410的uboot120的分析以及移植下篇.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于s3c2410的uboot120的分析以及移植下篇.docx

《基于s3c2410的uboot120的分析以及移植下篇.docx》由会员分享,可在线阅读,更多相关《基于s3c2410的uboot120的分析以及移植下篇.docx(12页珍藏版)》请在冰豆网上搜索。

基于s3c2410的uboot120的分析以及移植下篇.docx

基于s3c2410的uboot120的分析以及移植下篇

8分析到此告一段落,下面进入uboot的具体移植

(1)创建自己的工作目录。

在board目录下创建自己的工作目录,将smdk2410目录下的内容全部拷贝到tc2410目录下。

cdboard

mkdirtc2410

cp-frboard/smdk2410board/tc2410

cpinclude/configs/smdk2410.hinclude/configs/tc2410.h

修改tc2410目录下相关的文件名以及makefile,。

在这个目录下需要添加nand_read.c文件,可以从vivi里面拷贝过来,nand_read.c文件主要实现了start.S文件中的nand_read_ll读写函数,用来将uboot拷贝到内存里去。

需要修改的地方:

mvsmdk2410.ctc2410.cCOBJS:

=tc2410.oflash.onand_read.o

修改顶层makefile,添加自己的信息:

tc2410_config   :

   unconfig

       @$(MKCONFIG)$(@:

_config=)armarm920ttc2410nulls3c24x0

(2)修改start.S

禁止中断部分也要修改

#ifdefined(CONFIG_S3C2410)

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

                      //vivi也是0x7ff,不知为什么U-Boot一直没改过来。

   ldr   r0,=INTSUBMSK

   str   r1,[r0]

#endif

将以下U-Boot的重定向语句替换:

这段relocate代码只对从norflash中启动的设备有效,因此可以去掉

#ifndefCONFIG_SKIP_RELOCATE_UBOOT

relocate:

            /*relocateU-BoottoRAM      */

   adr   r0,_start      /*r0<-currentpositionofcode  */

   ldr   r1,_TEXT_BASE      /*testifwerunfromflashorRAM*/

   cmp    r0,r1                /*don'trelocduringdebug        */

   beq    stack_setup

   ldr   r2,_armboot_start

   ldr   r3,_bss_start

   sub   r2,r3,r2      /*r2<-sizeofarmboot           */

   add   r2,r0,r2      /*r2<-sourceendaddress        */

copy_loop:

   ldmia   r0!

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

   stmia   r1!

{r3-r10}      /*copyto  targetaddress[r1]   */

   cmp   r0,r2         /*untilsourceendaddreee[r2]   */

   ble   copy_loop

#endif   /*CONFIG_SKIP_RELOCATE_UBOOT*/

替换成:

#ifdefCONFIG_S3C2410_NAND_BOOT  

@resetNAND

 movr1,#NAND_CTL_BASE

 ldr  r2,=0xf830          @initialvalue

 str  r2,[r1,#oNFCONF]

 ldr  r2,[r1,#oNFCONF]

 bic r2,r2,#0x800             @enablechip

 str  r2,[r1,#oNFCONF]

 movr2,#0xff        @RESETcommand

 strbr2,[r1,#oNFCMD]

 movr3,#0                  @wait

nand1:

 

 add r3,r3,#0x1

 cmpr3,#0xa

 blt  nand1

nand2:

 ldr  r2,[r1,#oNFSTAT]     @waitready

 tst   r2,#0x1

 beq nand2

 ldr  r2,[r1,#oNFCONF]

 orr r2,r2,#0x800             @disablechip

 str  r2,[r1,#oNFCONF]

@getreadtocallCfunctions(fornand_read())

 ldr  sp,DW_STACK_START      @setupstackpointer

 movfp,#0                   @nopreviousframe,sofp=0

@copyU-BoottoRAM

 ldr  r0,=TEXT_BASE

 mov    r1,#0x0

 movr2,#0x20000

 bl   nand_read_ll这个函数在nand_read.c中实现

 tst   r0,#0x0

 beq ok_nand_read

bad_nand_read:

loop2:

   b    loop2         @infiniteloop

ok_nand_read:

@verify

 movr0,#0

 ldr  r1,=TEXT_BASE

 movr2,#0x400    @4bytes*1024=4K-bytes,这句话的意思在start.S中已注释。

go_next:

 ldr  r3,[r0],#4

 ldr  r4,[r1],#4

 teq  r3,r4

 bne notmatch

 subsr2,r2,#4

 beq stack_setup

 bne go_next

notmatch:

loop3:

    b    loop3        @infiniteloop

#endif@CONFIG_S3C2410_NAND_BOOT 

在“ _start_armboot:

   .wordstart_armboot ”后加入:

  .align    2

DW_STACK_START:

 .word STACK_BASE+STACK_SIZE-4

start.S文件修改到此结束。

 

(3)在include/configs/tc2410.h头文件中添加nandflash的初始化信息,这个文件与板子密切相关,需要修改的地方也很多。

具体添加信息/*//添加的内容

//#defineCFG_ENV_IS_IN_FLASH1

#defineCFG_ENV_IS_IN_NAND1

#defineCFG_ENV_OFFSET0x020000

#defineCFG_NAND_BASE0x4E000000

#defineCMD_SAVEENV

#defineCFG_NAND_LEGACY

#defineCFG_ENV_SIZE0x10000/*TotalSizeofEnvironmentSector*/

#defineCFG_MONITOR_BASEPHYS_SDRAM_1

#if(CONFIG_COMMANDS&CFG_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_COMMAND(d,adr){rNFCMD=d;}

#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)));}

#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

//添加的内容

/*

*NandflashBoot

*/

#defineCONFIG_S3C2410_NAND_BOOT1

#defineSTACK_BASE0x33f00000

#defineSTACK_SIZE0x8000

#defineUBOOT_RAM_BASE0x33f80000

/*NANDFlashController*/

#defineNAND_CTL_BASE0x4E000000

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

/*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/*CONFIG_COMMANDS&CFG_CMD_NAND*/

#endif/*__CONFIG_H*/

(4)我使用的是勤研开发板,在vivi里面并没有找到关于内存区配置的信息。

lowlevel.init文件不知道如何修改。

看见网上很多人说根据开发板的内存区情况配置,我找了半天没找到,郁闷至极。

不过没有影响我成功移植,:

-)

(5)在include/linux/mtd/nand_ids.h的结构体nand_flash_ids加入nandflash的具体信息。

staticstructnand_flash_devnand_flash_ids[]={

......

   {"SamsungKM29N16000",NAND_MFR_SAMSUNG,0x64,21,1,2,0x1000,0},

   {"SamsungK9F1208U0B", NAND_MFR_SAMSUNG,0x76,26,0,3,0x4000,0},

   {"Samsungunknown4Mb",NAND_MFR_SAMSUNG,0x6b,22,0,2,0x2000,0},

......

{NULL,}

};

(6)修改/lib_arm中的board.c。

staticintdisplay_banner(void)

{

   printf("\n\n%s\n\n",version_string);

   debug("U-Bootcode:

%08lX->%08lX BSS:

->%08lX\n",

         _armboot_start,_bss_start,_bss_end);

   printf("U-Bootcode:

%08lX->%08lX BSS:

->%08lX\n",输出_armboot_start地址信息   

      _armboot_start,_bss_start,_bss_end);    

#ifdefCONFIG_MODEM_SUPPORT

   debug("ModemSupportenabled\n");

#endif

#ifdefCONFIG_USE_IRQ

   debug("IRQStack:

%08lx\n",IRQ_STACK_START);

   debug("FIQStack:

%08lx\n",FIQ_STACK_START);

#endif

   return(0);

}

(7)修改common/env_nand.c,具体nandflash的擦写需要使用nand_legacy_erase等函数实现,而不是nand-erase()函数

......

#ifdefCONFIG_INFERNO

#errorCONFIG_INFERNOnotsupportedyet

#endif

intnand_legacy_rw(structnand_chip*nand,intcmd,

      size_tstart,size_tlen,

      size_t*retlen,u_char*buf);

externstructnand_chipnand_dev_desc[CFG_MAX_NAND_DEVICE];

externintnand_legacy_erase(structnand_chip*nand,size_tofs,size_tlen,intclean);

/*infoforNANDchips,definedindrivers/nand/nand.c*/

externnand_info_tnand_info[CFG_MAX_NAND_DEVICE];

......

#else/*!

CFG_ENV_OFFSET_REDUND*/

intsaveenv(void)

{

   ulongtotal;

   intret=0;

   puts("ErasingNand...");

   //if(nand_erase(&nand_info[0],CFG_ENV_OFFSET,CFG_ENV_SIZE))

if(nand_legacy_erase(nand_dev_desc+0,CFG_ENV_OFFSET,CFG_ENV_SIZE,0))

      return1;

   puts("WritingtoNand...");

   total=CFG_ENV_SIZE;

   //ret=nand_write(&nand_info[0],CFG_ENV_OFFSET,&total,(u_char*)env_ptr);

ret=nand_legacy_rw(nand_dev_desc+0,

0x00|0x02,CFG_ENV_OFFSET,CFG_ENV_SIZE,

&total,(u_char*)env_ptr);

   if(ret||total!

=CFG_ENV_SIZE)

      return1;

   puts("done\n");

   returnret;

......

#else/*!

CFG_ENV_OFFSET_REDUND*/

/*

 *ThelegacyNANDcodesavedtheenvironmentinthefirstNANDdevicei.e.,

 *nand_dev_desc+0.ThisisalsothebehaviourusingthenewNANDcode.

 */

voidenv_relocate_spec(void)

{

#if!

defined(ENV_IS_EMBEDDED)

   ulongtotal;

   intret;

   total=CFG_ENV_SIZE;

   //ret=nand_read(&nand_info[0],CFG_ENV_OFFSET,&total,(u_char*)env_ptr);

   ret=nand_legacy_rw(nand_dev_desc+0,0x01|0x02,CFG_ENV_OFFSET,CFG_ENV_SIZE,&total,(u_char*)env_ptr);

(8)在/board/tc2410/tc2410.c文件的末尾添加对NandFlash的初始化函数(在后面NandFlash的操作都要用到)

u-boot运行至第二阶段进入start_armboot()函数。

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

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

其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用drivers/nnd/nand.c中的nand_init();否则调用board/smdk2410/smdk2410.c中的nand_init()函数。

这里我选择第二种方式。

#if(CONFIG_COMMANDS&CFG_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_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_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_

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

当前位置:首页 > 人文社科 > 法律资料

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

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