嵌入式BootLoader移植实验三Word文件下载.doc
《嵌入式BootLoader移植实验三Word文件下载.doc》由会员分享,可在线阅读,更多相关《嵌入式BootLoader移植实验三Word文件下载.doc(17页珍藏版)》请在冰点文库上搜索。
S3C2440
SDRAM:
64M1
NorFlash:
2M
NandFlash:
256M
网卡:
DM9000EP
四、实验过程
1、建立Micro2440配置
(1)按下图所示命令解压u-boot-2011.03-micro2440.tar压缩包
(2)输入命令:
geditboards.cfg打开boards.cfg文件。
在boards.cfg中添加一行:
micro2440armarm920t-samsungs3c24x0语句。
(3)创建板级支持文件
输入命令:
cp-rboard/samsung/smdk2410board/samsung/micro2440
cdboard/samsung/micro2440/
mvsmdk2410.cmicro2440.c
geditMakefile
将COBJS:
=smdk2410.oflash.o改为COBJS:
=micro2440.oflash.o
cd../../..
cpinclude/configs/smdk2410.hinclude/configs/micro2440.h
geditinclude/configs/micro2440.h
修改内容一:
#defineCONFIG_SYS_PROMPT"
[Micro2440]#"
/*MonitorCommandPrompt*/
修改内容二:
#defineCONFIG_SYS_SDRAM_BASEPHYS_SDRAM_1
#defineCONFIG_SYS_INIT_SP_ADDR(CONFIG_SYS_SDRAM_BASE+0x1000-GENERATED_GBL_DATA_SIZE)
(4)测试编译环境
输入命令:
makemicro2440_config
出现:
Configuringformicro2440board...
输入命令:
make
Generatinginclude/autoconf.mk
Generatinginclude/autoconf.mk.dep
......
arm-linux-objcopy-Osrecu-bootu-boot.srec
arm-linux-objcopy--gap-fill=0xff-Obinaryu-bootu-boot.bin
2、在RAM中运行
(1)在根目录下进入include/configs文件夹
输入命令:
geditmicro2440.h,打开micro2440.h文件。
(2)在micro2440.h中
删除:
#defineCONFIG_S3C24101/*specificallyaSAMSUNGS3C2410SoC*/
#defineCONFIG_SMDK24101/*onaSAMSUNGSMDK2410Board*/
添加:
#defineCONFIG_S3C24401/*specificallyaSAMSUNGS3C2440SoC*/
#defineCONFIG_MICRO2440
#defineCONFIG_SKIP_LOWLEVEL_INIT
(3)在根目录下进入arch/arm/cpu/arm920t文件夹
geditstart.S
按下图所示进行修改部分内容:
(4)在根目录board/samsung/micro2440下中输入geditmicro2440.c命令
(5)测试
在根目录下输入命令:
make
编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处,u-boot已经能在RAM中运行。
3、支持DM900
(1)在根目录下打开include/configs文件夹,执行geditmicro2440.h命令
删除:
#defineCONFIG_CS8900/*wehaveaCS8900on-board*/
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR10.0.0.110
#defineCONFIG_SERVERIP10.0.0.1
#defineCONFIG_CMD_NET
#defineCONFIG_DRIVER_DM90001
#defineCONFIG_DM9000_NO_SROM1
#defineCONFIG_DM9000_BASE0x20000300
#defineDM9000_IOCONFIG_DM9000_BASE
#defineDM9000_DATA(CONFIG_DM9000_BASE+4)
#defineCONFIG_CMD_PING
#defineCONFIG_ETHADDR08:
00:
3e:
26:
0a:
5b//开发板MAC地址
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR192.168.10.126//开发板IP地址
#defineCONFIG_SERVERIP192.168.10.124//主机IP地址
(2)在根目录下进入board/samsung/micro2440文件夹执行geditmicro2440.c命令
(3)在根目录下进入arch/arm/lib文件夹执行gediteabi_compat.c命令
(4)在根目录下进入drivers/net文件夹执行geditdm9000x.c命令
在修改staticintdm9000_init(structeth_device*dev,bd_t*bd)函数中内容,如下图所示:
(5)测试
在根目录下输入命令:
编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处,u-boot已经能在RAM中运行。
测试结果如下图所示:
4、支持内核启动
(1)在根目录下进入include/configs文件夹执行geditmicro2440.h命令
#defineCONFIG_SETUP_MEMORY_TAGS1//如果没有定义这个参数,则uboot参数必须加入men=内存大小
(2)在根目录下进入arch/arm/lib文件夹执行geditbootm.c命令
在staticvoidannounce_and_cleanup(void)函数中添加:
#ifndefCONFIG_MICRO2440
cleanup_before_linux();
#endif
(3)自动启动内核
如果要自动启动内核,需要include/conskfigs/micro2440.h定义CONFIG_BOOTCOMMAND,类似如下内容:
#defineCONFIG_BOOTCOMMAND"
nandread0x300080000x600000x300000;
bootm0x30008000"
(4)测试
编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处,u-boot已经能在RAM中运行。
5、支持NandFlash
(1)添加s3c2440_nand.c文件
在根目录下输入touchdrivers/mtd/nand/s3c2440_nand.c指令进行文件的创建,
在根目录下输入geditdrivers/mtd/nand/s3c2440_nand.c命令打开文件。
在DEBUGN("
board_nand_init()/n"
);
下面修改如图所示的三句内容:
(2)在根目录下进入drivers/mtd/nand文件夹中执行geditMakefile命令
#COBJS-$(CONFIG_NAND_S3C2440)+=s3c2440_nand.o如下图所示:
(3)在根目录下进入include/conskfigs文件夹打开micro2440.h文件
#defineCONFIG_MTD_DEVICE
#defineCONFIG_NAND_S3C2440
#defineCONFIG_CMD_NAND
#ifdefined(CONFIG_CMD_NAND)
#defineCONFIG_SYS_NAND_BASE0x4E000000//Nand配置寄存器基地址
#defineCONFIG_SYS_MAX_NAND_DEVICE1
#defineCONFIG_MTD_NAND_VERIFY_WRITE1
#endif
#defineCONFIG_ENV_IS_IN_NAND1
#defineCONFIG_ENV_OFFSET0x40000//将环境变量保存到nand中的0x40000位置
#defineCONFIG_ENV_SIZE0x10000/*TotalSizeofEnvironmentSector*/
6、支持yaffs下载
(1)在根目录下进入include/conskfigs文件夹执行geditmicro2440.h命令
#defineCONFIG_CMD_NAND_YAFFS
(2)在根目录下进入drivers/mtd/nand文件夹打开nand_util.c文件
修改部分内容:
if(!
need_skip&
&
!
withoob){……}
ops.mode=MTD_OOB_RAW
rval=nand->
write_oob(nand,offset,&
ops);
if(rval)
break;
(3)下载yaffs镜像
下载yaffs镜像的时候要注意分区的第一块不能写,比如友善之臂的默认分区如下:
Numberofpartitions:
4
name:
offsetsizeflag
------------------------------------------------------------
vivi:
0x000000000x000400000
param:
0x000400000x000200000
kernel:
0x000600000x005000000
root:
0x005600000x3fa800000
也就是说yaffs镜像所在分区的起始地址在0x560000,因此使用nandwrite.yaffs命令下载yaffs时要写的地址为
0x560000+0x20000(NandFlash每块的大小)=0x580000,即下载命令类似如下:
tftp0x30008000uImage
nandwrite.yaffs0x300080000x5800000x300000
7、支持NandFlash启动
(1)创建nand_read.c
在根目录下执行touchboard/samsung/micro2440/nand_read.c命令,
在根目录下执行geditboard/samsung/micro2440/nand_read.c命令,
将下列内容复制到nand_read.c文件中
#definerNFCONF(*(volatileunsigned*)0x4E000000)
#definerNFCONT(*(volatileunsigned*)0x4E000004)
#definerNFCMD(*(volatileunsigned*)0x4E000008)
#definerNFADDR(*(volatileunsigned*)0x4E00000C)
#definerNFDATA8(*(volatileunsignedchar*)0x4E000010)
#definerNFSTAT(*(volatileunsigned*)0x4E000020)
#defineCMD_READ10x00/*页读命令周期1*/
#defineCMD_READ20x30/*页读命令周期2*/
#defineCMD_RESET0xFF/*复位*/
#defineNF_CMD(cmd){rNFCMD=(cmd);
}/*写命令*/
#defineNF_ADDR(addr){rNFADDR=(addr);
}/*写地址*/
#defineNF_RDDATA8()(rNFDATA8)/*读8位数据*/
#defineNF_nFCE_L(){rNFCONT&
=~(1<
<
1);
}/*片选使能*/
#defineNF_nFCE_H(){rNFCONT|=(1<
}/*片选禁用*/
#defineNF_WAITRB(){while(!
(rNFSTAT&
(1<
1)));
}/*等待就绪*/
#defineNF_CLEAR_RB(){rNFSTAT|=(1<
2);
}/*清除就绪/忙位*/
#defineNF_DETECT_RB(){while(!
2)));
#defineTACLS1
#defineTWRPH02
#defineTWRPH11
voiddelay(inti)
{
while(i-->
0);
}
voidNand_Init(void)
rNFCONF=(TACLS<
12)|(TWRPH0<
8)|(TWRPH1<
4)|(0<
rNFCONT=(1<
4)|(1<
1)|(1<
staticvoidNand_Reset(void)
NF_nFCE_L();
/*片选使能*/
NF_CLEAR_RB();
/*清除就绪/忙位*/
NF_CMD(CMD_RESET);
/*写复位命令*/
NF_DETECT_RB();
/*等待就绪*/
NF_nFCE_H();
/*片选禁用*/
unsignedcharNand_ReadPage(constintpage,unsignedchar*constbuffer)
inti;
Nand_Reset();
NF_CMD(CMD_READ1);
NF_ADDR(0x0);
NF_ADDR(page&
0xff);
NF_ADDR((page>
>
8)&
16)&
NF_CMD(CMD_READ2);
for(i=0;
i<
2048;
i++)
buffer[i]=NF_RDDATA8();
intnand_read(intstart_page,intread_pages,unsignedchar*buffer)
Nand_Init();
for(i=0;
i<
read_pages;
Nand_ReadPage(start_page,buffer+2048*i);
start_page++;
return0;
(2)在根目录下进入board/samsung/micro2440文件夹执行geditMakefile命令
修改COBJS:
=micro2440.oflash.onand_read.o
(3)在根目录下执行geditarch/arm/cpu/arm920t/u-boot.lds命令
修改:
.text:
{
arch/arm/cpu/arm920t/start.o(.text)
board/samsung/micro2440/libmicro2440.o(.text)
*(.text)
}
(4)在根目录下执行geditarch/arm/cpu/arm920t/start.S命令
添加下面蓝色字体的内容,黑色字体用于定位
#ifndefCONFIG_SKIP_LOWLEVEL_INIT
blcpu_init_crit
#endif
#ifdefCONFIG_S3C2440_NAND_BOOT
ldrsp,=0x30008000
ldrr0,=0x0;
ldrr1,_end_ofs
movr1,r1,LSR#11
addr1,r1,#1
ldrr2,=(CONFIG_SYS_TEXT_BASE)
blnand_read
ldrpc,=relocations
......
copy_loop:
ldmiar0!
{r9-r10}/*copyfromsourceaddress[r0]*/
stmiar1!
{r9-r10}/*copytotargetaddress[r1]*/
cmpr0,r2/*untilsourceendaddress[r2]*/
blocopy_loop
relocations:
ldrr6,=CONFIG_SYS_TEXT_BASE
#ifndefCONFIG_PRELOADER
/*
*fix.rel.dynrelocations
*/
clbss_l:
strr2,[r0]/*clearloop...*/
addr0,r0,#4
cmpr0,r1
bneclbss_l
blcoloured_LED_init
blred_LED_on
#endif
#ifdefCONFIG_S3C2440_NAND