Uboot移植文档v20.docx

上传人:b****8 文档编号:10709414 上传时间:2023-02-22 格式:DOCX 页数:31 大小:160.87KB
下载 相关 举报
Uboot移植文档v20.docx_第1页
第1页 / 共31页
Uboot移植文档v20.docx_第2页
第2页 / 共31页
Uboot移植文档v20.docx_第3页
第3页 / 共31页
Uboot移植文档v20.docx_第4页
第4页 / 共31页
Uboot移植文档v20.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

Uboot移植文档v20.docx

《Uboot移植文档v20.docx》由会员分享,可在线阅读,更多相关《Uboot移植文档v20.docx(31页珍藏版)》请在冰豆网上搜索。

Uboot移植文档v20.docx

Uboot移植文档v20

本文档采用了Uboot1.1.6中的nandflash的新驱动,没有用nand_legacy,同时添加了yaffs文件系统烧写的功能,并且对网上一些移植文档的不妥,缺少之处进行补充。

如有不妥之处,欢迎指正。

联系方式:

edaworld@

零、移植前说明:

1.工作环境:

      Fedora7,内核2.6.21

   交叉编译器:

      Arm-linux-gcc3.3.2

   目标板:

   优龙FS2410,NANDFlash:

64MK9F1208,NORFlash:

2MSST39VF1601(本次移植不包含NORFlash 支持),RAM64M,CS8900Q3

2.下载源码,建立工作目录

   u-boot的源码可以从以下网址下载:

   

   建立工作目录:

   mkdir/bootloader

   cd/bootloader

   把下载的源码拷贝到该目录,解压;

   tarjxvfu-boot-1.1.6.tar.bz2 

注意使用交叉编译器为3.3.2版本

一、移植步骤如下:

(1)、建立自己fs2410开发板的配置

 cd/u-boot-1.1.6

   1)#cp–rboard/smdk2410board/fs2410   

   2)#cpinclude/configs/smdk2410.hinclude/configs/fs2410.h

  

fs2410.h是开发板的配置文件,他包括开发板的CPU、系统时钟、RAM、FLASH系统及其他相关的配置信息,由于u-boot已经支持三星的SMDK2410开发板,所以移植的时候直接拷贝SMDK2410的配置文件,做相应的修改即可。

由于Uboot对SMDK2410板的NANDFlash初始化部分没有写,即lib_arm/board.c中的start_armboot函数中有这么一句:

#if(CONFIG_COMMANDS&CFG_CMD_NAND)

puts("NAND:

");

nand_init();/*goinittheNAND*/

#endif

但是在board/smdk2410目录下源文件中都没有定义nand_init这个函数。

所以需要我们补充这个函数以及这个函数涉及的底层操作,NANDFlash的读写操作相对复杂,将在u-boot-1.1.6移植的后面部分介绍。

 

(2).修改顶层Makefile

 

cd/u-boot-1.1.6

geditMakefile

找到:

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)。

(3). 修改include/configs/fs2410.h:

   

      修改:

      #define  CFG_PROMPT    “SMDK2410#”

      为:

      #define  CFG_PROMPT    “[Neusoft2410]#” 

   这是u-boot的命令行提示符。

此处是bootloader启动后的提示符定义。

(4)修改board/fs2410/Makefile

   

将:

   COBJS   :

=smdk2410.oflash.o

   改为:

   COBJS    :

=fs2410.oflash.o

   当然,fs2410下的smdk2410.c要改成fs2410.c;

(5)依照你自己开发板的内存地址分配情况修改board/fs2410/lowlevel_init.S文件

    这里我参考了FS2410开发板自带S3C2410_BIOS,代码如下:

#include

#include

/*someparametersfortheboard*/

/*

 *

 *Takenfromlinux/arch/arm/boot/compressed/head-s3c2410.S

 *

 *Copyright(C)2002SamsungElectronicsSW.LEE 

 *

 */

#defineBWSCON   0x48000000

/*BWSCON*/

#defineDW8          (0x0)

#defineDW16          (0x1)

#defineDW32          (0x2)

#defineWAIT          (0x1<<2)

#defineUBLB          (0x1<<3)

#defineB1_BWSCON       (DW16)

#defineB2_BWSCON       (DW16)

#defineB3_BWSCON       (DW16+WAIT+UBLB)

#defineB4_BWSCON       (DW16)

#defineB5_BWSCON       (DW16)

#defineB6_BWSCON       (DW32)

#defineB7_BWSCON       (DW32)

/*BANK0CON*/

#defineB0_Tacs          0x3   /* 0clk*/

#defineB0_Tcos          0x3   /* 0clk*/

#defineB0_Tacc          0x7   /*14clk*/

#defineB0_Tcoh          0x3   /* 0clk*/

#defineB0_Tah          0x3   /* 0clk*/

#defineB0_Tacp          0x1

#defineB0_PMC          0x0   /*normal*/

/*BANK1CON*/

#defineB1_Tacs          0x3   /* 0clk*/

#defineB1_Tcos          0x3   /* 0clk*/

#defineB1_Tacc          0x7   /*14clk*/

#defineB1_Tcoh          0x3   /* 0clk*/

#defineB1_Tah          0x3   /* 0clk*/

#defineB1_Tacp          0x3

#defineB1_PMC          0x0

#defineB2_Tacs          0x0

#defineB2_Tcos          0x0

#defineB2_Tacc          0x7

#defineB2_Tcoh          0x0

#defineB2_Tah          0x0

#defineB2_Tacp          0x0

#defineB2_PMC          0x0

#defineB3_Tacs          0x0   /* 0clk*/

#defineB3_Tcos          0x3   /* 4clk*/

#defineB3_Tacc          0x7   /*14clk*/

#defineB3_Tcoh          0x1   /* 1clk*/

#defineB3_Tah          0x0   /* 0clk*/

#defineB3_Tacp          0x3    /* 6clk*/

#defineB3_PMC          0x0   /*normal*/

#defineB4_Tacs          0x1   /* 0clk*/

#defineB4_Tcos          0x1   /* 0clk*/

#defineB4_Tacc          0x6   /*14clk*/

#defineB4_Tcoh          0x1   /* 0clk*/

#defineB4_Tah          0x1   /* 0clk*/

#defineB4_Tacp          0x0

#defineB4_PMC          0x0   /*normal*/

#defineB5_Tacs          0x1   /* 0clk*/

#defineB5_Tcos          0x1   /* 0clk*/

#defineB5_Tacc          0x6   /*14clk*/

#defineB5_Tcoh          0x1   /* 0clk*/

#defineB5_Tah          0x1   /* 0clk*/

#defineB5_Tacp          0x0

#defineB5_PMC          0x0   /*normal*/

#defineB6_MT          0x3   /*SDRAM*/

#defineB6_Trcd           0x1

#defineB6_SCAN          0x1   /*9bit*/

#defineB7_MT          0x3   /*SDRAM*/

#defineB7_Trcd          0x1   /*3clk*/

#defineB7_SCAN          0x1   /*9bit*/

/*REFRESHparameter*/

#defineREFEN          0x1   /*Refreshenable*/

#defineTREFMD          0x0   /*CBR(CASbeforeRAS)/Autorefresh*/

#defineTrp          0x0   /*2clk*/

#defineTrc          0x3   /*7clk*/

#defineTchr          0x2   /*3clk*/

#defineREFCNT          1113   /*period=15.6us,HCLK=60Mhz,(2048+1-15.6*60)*/

/**************************************/

_TEXT_BASE:

   .word   TEXT_BASE

.globllowlevel_init

lowlevel_init:

   /*memorycontrolconfiguration*/

   /*maker0relativethecurrentlocationsothatit*/

   /*readsSMRDATAoutofFLASHratherthanmemory!

*/

   ldr    r0,=SMRDATA

   ldr   r1,_TEXT_BASE

   sub   r0,r0,r1

   ldr   r1,=BWSCON   /*BusWidthStatusController*/

   add    r2,r0,#13*4

0:

   ldr    r3,[r0],#4

   str    r3,[r1],#4

   cmp    r2,r0

   bne    0b

   /*everythingisfinenow*/

   mov   pc,lr

   .ltorg

/*theliteralpoolsorigin*/

SMRDATA:

   .word(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

   .word((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))

   .word((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))

   .word((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

   .word((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

   .word((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))

   .word((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

   .word((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

   .word((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

   .word((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

   .word0x32

   .word0x30

   .word0x30

(6)测试编译能否成功:

执行

   makefs2410_config

   make

   如果没有问题,在u-boot-1.1.6目录下就生成u-boot.bin,因为到这一步只是做了点小改动,并未涉及敏感问题,测试一下可增加点信心,烧到扳子看到如图1所示。

当然也有make不成功的时候,如按照上述步骤编译u-boot-1.1.5的时候,出现“没有规则创建'all'需要的目标'hello_world.srec'”,如图1所示,解决方法:

   把example文件夹下的Makefile中的

   第147行 

   %.srec:

%改成:

%.srec:

%.o 

   第150行

    %.bin:

%改成:

%.bin:

%.o

网上还有一种改法,我没试过,不作说明。

(7)在board/fs2410加入NANDFlash读函数,建立nand_read.c,加入如下内容(copyfromvivi):

#include

#include"linux/mtd/mtd.h"

#include"linux/mtd/nand.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(!

(NFSTAT&BUSY))

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

}

#defineNAND_SECTOR_SIZE512

#defineNAND_BLOCK_MASK(NAND_SECTOR_SIZE-1)

/*lowlevelnandreadfunction*/

int

nand_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;

}

(8)接着修改board/fs2410/Makefile

COBJS:

=fs2410.oflash.onand_read.o

(9)修改cpu/arm920t/start.S文件

2410的启动代码可以在外部的NANDFLASH上执行,启动时,NANDFLASH的前4KB(地址为0x00000000,OM[1:

0]=0)将被装载到SDRAM中被称为Setppingstone的地址中,然后开始执行这段代码。

启动以后,这4KB的空间可以做其他用途,在start.S加入搬运代码如下:

...........

...........

copy_loop:

ldmiar0!

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

stmiar1!

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

cmpr0,r2/*untilsourceendaddreee[r2]*/

blecopy_loop

下面红色是要添加的内容,添加到蓝色的部分中间,蓝色是已经有的代码

/********************************************************/

#ifdefCONFIG_S3C2410_NAND_BOOT/*这个一定要放在堆栈设置之前*/

blcopy_myself

#endif/*CONFIG_S3C2410_NAND_BOOT*/

/********************************************************/

#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/

/*Setupthestack*/

stack_setup:

..................

…………..

/**************************************************************************

*

*copyu-boottoram放在start.S靠后的位置

*

*************************************************************************

*/

#ifdefCONFIG_S3C2410_NAND_BOOT

/*

@copy_myself:

copyu-boottoram

*/

copy_myself:

movr10,lr

@resetNAND

movr1,#NAND_CTL_BASE

ldrr2,=0xf830@initialvalue

strr2,[r1,#oNFCONF]

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

当前位置:首页 > 解决方案 > 学习计划

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

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