实验18uboot实验0801.docx
- 文档编号:1264046
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:19
- 大小:76.42KB
实验18uboot实验0801.docx
《实验18uboot实验0801.docx》由会员分享,可在线阅读,更多相关《实验18uboot实验0801.docx(19页珍藏版)》请在冰点文库上搜索。
实验18uboot实验0801
一u-boot实验指导
1安装交叉编译器
在实验之前,需要安装后交叉编译器。
把arm-linux-gcc-3.4.6-glibc-2.3.6.tar.bz2拷贝到linux下/gdut2410文件夹,执行
[root@BCgdut2410]#tar-jxvfarm-linux-gcc-3.4.6-glibc-2.3.6.tar.bz2-C/
这样就把arm-linux-gcc-3.4.6-glibc-2.3.6安装到了/目录下,接着修改环境变量
[root@BCgdut2410]#vi/etc/profile
找到exportPATH=/usr/local/arm/2.95.3/bin:
$PATH然后屏蔽掉,增加gcc-3.4.6-glibc-2.3.6的路径如下面所示,如果exportPATH=/usr/local/arm/2.95.3/bin:
$PATH不存在,则只需增加gcc-3.4.6-glibc-2.3.6
#exportPATH=/usr/local/arm/2.95.3/bin:
$PATH
exportPATH=/gcc-3.4.6-glibc-2.3.6/arm-linux/bin:
$PATH
使新设置的环境变量生效
[root@BCgdut2410]#source/etc/profile
打开新的窗口查看环境变量设置是否生效就,或者注销再登录。
[root@BCgdut2410]#arm-linux-gcc–v
显示如下信息则说明交叉编译器安装成功
图1-1查看交叉编译器版本信息
如果未生效,查看/root/.bashrc是否也设置了了exportPATH=/usr/local/arm/2.95.3/bin:
$PATH,如果有则把其删除
[root@BCgdut2410]#vi/root/.bashrc
2获得u-boot源码
提供了直接从u-boot的官方网站下载的源代码,版本是1.3.2.,放在gdut2410目录下。
将u-boot-1.3.2.tar.bz2拷贝到linux里面的/gdut2410/u-boot目录下,解压源码包:
[root@BCu-boot]#pwd
/gdut2410/u-boot
[root@BCu-boot]#cp/mnt/hgfs/e/u-boot-1.3.2.tar.bz2./
[root@BCu-boot]#tarjxvfu-boot-1.3.2.tar.bz2
[root@BCu-boot]#cdu-boot.1.3.2
3建立板级支持包
在board目录下,每一块开发板都有一个对应的目录,因此需要为的开发板建立一个目录,名字叫做gdut2410,并创建相应的文件:
[root@BCu-boot-1.3.2]#cdboard/
[root@BCboard]#mkdirgdut2410
[root@BCboard]#cpsmdk2410/*gdut2410
[root@BCboard]#cd../
上面的步骤中,把smdk2410目录下的所有文件都拷贝到了的gdut2410目录下,因为wtk2410实验箱和smdk2410开发板的配置差不多。
每个开发板都有一个自己的配置文件,如smdk2410开发板的配置文件为include/configs/smdk2410.h,也需要为的开发板建立自己的配置文件。
可以直接从smdk2410开发板的配置文件中修改而来。
因此先把smdk2410的配置文件复制到开发板的配置文件当中:
[root@BCu-boot-1.3.2]#cpinclude/configs/smdk2410.hinclude/configs/gdut2410.h
然后,修改Makefile,使得可以配置的开发板:
[root@BCu-boot-1.3.2]#viMakefile
在Makefile中找到下面两行:
smdk2400_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2400NULLs3c24x0
紧接这这两行添加如下两行:
gdut2410_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tgdut2410NULLs3c24x0
注意第二行开始部分的空白是按TAB键获得的!
这样,自己的板级支持包就建好了。
在132行ifndefCROSS_COMPILE前增加
CROSS_COMPILE:
=/gcc-3.4.6-glibc-2.3.6/arm-linux/bin/arm-linux-
指定交叉编译器。
4添加代码,支持从NandFlash启动
因为u-boot默认不支持从NandFlash启动,所以需要自己添加代码来实现从NandFlash启动。
4.1修改start.S文件
位于cpu/arm920t/目录下的start.S文件是开发板上电后运行的第一段代码,需要在这个文件中添加内容,以支持从NandFlash启动。
[root@BCu-boot-1.3.2]#vicpu/arm920t/start.S
首先,删掉start.S中的第181行和201行的这两条语句,两条语句间的内容不要删除:
#ifdefCONFIG_AT91RM9200
...............................................................
#endif
如果有这两句,这两句之间的内容将不会被编译。
而开发板需要执行这些内容。
然后,找到这一行:
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
在紧接这这行的下面添加下面几行:
#ifdefCONFIG_S3C2410_NAND_BOOT
blcopy_myself
#else
再找到
blecopy_loop
在它的下面添加一行:
#endif
做这些工作就是要完成一个简单的功能:
如果定义了CONFIG_S3C2410_NAND_BOOT这个宏,那么就执行copy_myself这个子程序,否则就执行#else下面的程序。
copy_myself这个子程序的功能就是把u-boot自身的代码从NandFlash拷贝到SDRAM中,需要自己实现,u-boot自身并没有为实现。
把copy_myself也添加在start.S文件中。
找到下面的一行:
_start_armboot:
.wordstart_armboot
在这一行的下面添加如下的内容:
/*
*************************************************************************
*
*copyu-boottoram
*
*************************************************************************
*/
#ifdefCONFIG_S3C2410_NAND_BOOT
copy_myself:
movr10,lr@savereturnaddresstor10
ldrsp,DW_STACK_START
movfp,#0
blNF_Init
ldrr0,=UBOOT_RAM_BASE
movr1,#0x0
movr2,#0x30000
blnand_read_whole
tstr0,#0x0
beqok_nand_read
1:
b1b
ok_nand_read:
movr0,#0x00000000
ldrr1,=UBOOT_RAM_BASE
movr2,#0x400
go_next:
ldrr3,[r0],#4
ldrr4,[r1],#4
teqr3,r4
bnenotmatch
subsr2,r2,#4
beqdone_nand_read
bnego_next
notmatch:
1:
b1b
done_nand_read:
movpc,r10
#endif
DW_STACK_START:
.wordSTACK_BASE+STACK_SIZE-4
上面是copy_myself的实现代码,添加完成以后,u-boot启动时就会执行的这段代码,将
u-boot的内容从Flash中拷贝到SDRAM中。
这样,start.S这个文件就修改完成了,保存刚才的修改。
4.2添加nand.c文件
在copy_mysel这段程序中,调用了nand_read_whole子程序。
这个程序是用C程序实现
的,新建一个文件,board/gdut2410/nand.c,在这个文件中实现它:
#include
#include
#include
#defineTACLS0
#defineTWRPH03
#defineTWRPH10
#defineU32unsignedint
externunsignedlongnand_probe(unsignedlongphysadr);
staticvoidNF_Reset(void)
{
inti;
NF_nFCE_L();
NF_CMD(0xFF);
for(i=0;i<10;i++);
NF_WAITRB();
NF_nFCE_H();
}
voidNF_Init(void)
{
rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);
NF_Reset();
}
intnand_read_whole(unsignedchar*buf,unsignedlongstart_addr,intsize)
{
inti,j;
if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK))
return1;
NF_nFCE_L();
for(i=0;i<10;i++);
i=start_addr;
while(i rNFCMD=0; rNFADDR=i&0xff; rNFADDR=(i>>9)&0xff; rNFADDR=(i>>17)&0xff; rNFADDR=(i>>25)&0xff; NF_WAITRB(); for(j=0;j *buf=(rNFDATA&0xff); buf++; } } NF_nFCE_H(); return0; } 上面就是nand.c文件的全部内容。 为了使编译的时候能把这个文件编译进去,需要修改相应的Makefile: [root@BCu-boot-1.3.2]#viboard/gdut2410/Makefile 找到这一行: COBJS: =smdk2410.oflash.o 把这行的内容改为下面这行: COBJS: =smdk2410.oflash.onand.o 即在行尾加上了nand.o,这样,编译的时候就会把nand.c编译进去,并进行链接。 4.3修改gdut2410.h 前面提到,gdut2410.h是开发板的配置文件。 关于nand.c中用到的一些宏或者其他需要定义的,都放在gdut2410.h中。 注意,这里只介绍和从Nand启动相关的配置,因为gdut2410.h中还有很多其他配置,将在后面介绍! [root@BCu-boot-1.3.2]#viinclude/configs/gdut2410.h 光标移动到文件的末尾,在文件的最后一个#endif的前面添加如下内容: #defineCONFIG_S3C2410_NAND_BOOT1 #defineSTACK_BASE0x33f00000 #defineSTACK_SIZE0x8000 #defineUBOOT_RAM_BASE0x33f80000 #defineCFG_NAND_BASE0x4E000000 #defineCFG_MAX_NAND_DEVICE1 #defineSECTORSIZE512 #defineNAND_SECTOR_SIZESECTORSIZE #defineNAND_BLOCK_MASK(NAND_SECTOR_SIZE-1) #defineADDR_COLUMN1 #defineADDR_PAGE2 #defineADDR_COLUMN_PAGE3 #defineNAND_ChipID_UNKNOWN0x00 #defineNAND_MAX_FLOORS1 #defineNAND_MAX_CHIPS1 #defineWRITE_NAND_COMMAND(d,adr)do{rNFCMD=d;}while(0) #defineWRITE_NAND_ADDRESS(d,adr)do{rNFADDR=d;}while(0) #defineWRITE_NAND(d,adr)do{rNFDATA=d;}while(0) #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);} #defineNAND_CTL_CLRALE(nandptr) #defineNAND_CTL_SETALE(nandptr) #defineNAND_CTL_CLRCLE(nandptr) #defineNAND_CTL_SETCLE(nandptr) #defineCONFIG_MTD_NAND_VERIFY_WRITE1 #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) #defineNF_CMD(cmd){rNFCMD=cmd;} #defineNF_ADDR(addr){rNFADDR=addr;} #defineNF_nFCE_L(){rNFCONF&=~(1<<11);} #defineNF_nFCE_H(){rNFCONF|=(1<<11);} #defineNF_RSTECC(){rNFCONF|=(1<<12);} #defineNF_RDDATA()(rNFDATA) #defineNF_WRDATA(data){rNFDATA=data;} #defineNF_WAITRB(){while(! (rNFSTAT&(1<<0)));} 这样,关于从Nand启动的修改就做完了。 保存文件。 5开发板的配置 前面已经提到,gdut2410.h是的开发板的配置文件,许多重要的内容都需要在这个文件中进行配置。 5.1添加命令 u-boot中提供了丰富的命令,smdk2410开发板配置了一部分命令,为的开发板增加一些命令。 找到下面的几行: #defineCONFIG_CMD_CACHE #defineCONFIG_CMD_DATE #defineCONFIG_CMD_ELF 在其下面添加下面几行: #defineCONFIG_CMD_REGINFO #defineCONFIG_CMD_NAND #defineCONFIG_CMD_PING #defineCONFIG_CMD_DLF #defineCONFIG_CMD_ENV #defineCONFIG_CMD_NET 这样就添加了一些需要的命令。 5.2修改环境变量 环境变量是u-boot运行时或者传递给内核的重要参数,需要正确设置。 找到下面的一行: #defineCONFIG_BOOTDELAY3 /*#defineCONFIG_BOOTARGS"root=ramfsdevfs=mountconsole=ttySA0,9600"*/ /*#defineCONFIG_ETHADDR08: 00: 3e: 26: 0a: 5b*/ #defineCONFIG_NETMASK255.255.255.0 #defineCONFIG_IPADDR10.0.0.110 #defineCONFIG_SERVERIP10.0.0.1 /*#defineCONFIG_BOOTFILE"elinos-lart"*/ /*#defineCONFIG_BOOTCOMMAND"tftp;bootm"*/ #ifdefined(CONFIG_CMD_KGDB) 注意上面的#ifdefined(CONFIG_CMD_KGDB)处,需要做的修改都在这之前进行修改。 修改后的代码如下: #defineCONFIG_BOOTDELAY3 #defineCONFIG_BOOTARGS"root=/dev/mtdblock2init=/linuxrcconsole=ttySAC0,115200" #defineCONFIG_BOOTCOMMAND"nandread3000800080000200000;bootm" #defineCONFIG_IPADDR192.168.1.10 #defineCONFIG_SERVERIP192.168.1.16 #defineCONFIG_NETMASK255.255.255.0 #defineCONFIG_ETHADDR08: 00: 3e: 26: 0a: 5b #defineCFG_LOAD_ADDR0x30008000/*defaultloadaddress*/ #defineCONFIG_LOAD_BOOT_FILE_NAME"uImage" #defineCONFIG_CMDLINE_TAG1 #defineCONFIG_SETUP_MEMORY_TAGS1 #defineCONFIG_INITRD_TAG1 #ifdefined(CONFIG_CMD_KGDB) 上面添加的环境变量在u-boot启动时作为u-boot的默认环境变量,如果不执行saveenv命令,则这些变量只存在于SDRAM中;执行saveenv命令后,这些便量会保存到Flash中,下次上电,在从Flash中把它读出来,作为环境变量使用。 5.3修改命令提示符 找到下面一行: #defineCFG_PROMPT"SMDK2410#"/*MonitorCommandPrompt*/ 修改为: #defineCFG_PROMPT"[GDUT2410#]" 这样,u-boot的命令提示符就是[GDUT2410#]。 5.4修改默认下载地址 找到下面的一行: #defineCFG_LOAD_ADDR0x33000000/*defaultloadaddress*/ 这个变量定义的是在使用串口或者网卡下载文件到SDRAM时,如果不指定下载地址,则下载到这个宏指定的默认地址。 用下面的两行来替代: #defineCFG_LOAD_ADDR0x30008000 #defineCFG_TFTP_LOAD_ADDR0x30008000 5.5修改环境变量在Flash中的存储地址 找到下面的两行: #defineCFG_ENV_IS_IN_FLASH1 #defineCFG_ENV_SIZE0x10000/*TotalSizeofEnvironmentSector*/ 上面的定义说明环境变量是存在Flash中。 的板子上只有NandFlash,因此环境变量只能存在NandFlash中。 因此,注释掉上面的两行,用下面的几行代替: #defineCFG_ENV_IS_IN_NAND1 #defineCFG_ENV_SIZE0x4000 #defineCFG_ENV_OFFSET(0x80000-0x4000) 表示环境变量存储在NandFlash中,大小为16KB,起始地址是0.5M往下的16KB地址处。 这样的话,u-boot占用的Flash地址是前0.5M,对u-boot来说,已经足够了。 到这里,配置文件的修改就完成了。 6编译u-boot 首先运行如下命令配置u-boot: [root@BCu-boot-1.3.2]#makegdut2410_config Configuringforgdut2410board... [root@BCu-boot-1.3.2]# 然后运行make命令编译: [root@BCu-boot-1.3.2]#make 编译完成后,会在u-boot的源代码目录下生成u-boot.bin文件。 这个文件就是需要的二进制文件。 7烧写u-boot 把编译好的u-boot放置到所提供的down_uboot文件夹里。 图7-1down_uboot文件夹 右键u-boot.bin,查看u-boot.bin的大小 图7-2查看u-boot
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 18 uboot 0801