03UBOOT编译使用及修改实验.docx
《03UBOOT编译使用及修改实验.docx》由会员分享,可在线阅读,更多相关《03UBOOT编译使用及修改实验.docx(28页珍藏版)》请在冰豆网上搜索。
![03UBOOT编译使用及修改实验.docx](https://file1.bdocx.com/fileroot1/2023-4/24/30e4fdfb-25a3-4f3e-b46c-9f042a9c3575/30e4fdfb-25a3-4f3e-b46c-9f042a9c35751.gif)
03UBOOT编译使用及修改实验
班级:
软件工程姓名:
学号:
成绩:
实验名称:
UBOOT编译使用及修改
1.实验目的:
了解UBOOT的基本功能、掌握UBOOT在不同开发板上的编译配置方法,掌握UBOOT常用命令的使用方法,使用这些命令配置正确参数启动系统,并通过添加自己的命令了解UBOOT的基本源码结构。
2.实验内容:
编译环境搭建
UBOOT配置编译
UBOOT烧写
UBOOT命令使用
UBOOT烧写内核与根文件系统
UBOOT自定义命令添加
3.实验方法:
编译UBOOT烧写到OK6410开发板上执行,通过串口执行各UBOOT常用命令,通过USB口下载内核和根文件系统,修改UBOOT源码添加自定义命令并执行。
4.实验过程
(一)编译环境搭建
1)使用mkdir命令建立个人实验文件夹保存实验资料
#mkdirxxxxx(xxxxx为你的名字全拼)
实验资料有:
⏹Uboot源码包:
uboot1.1.6-2012-09-25.tar.gz
⏹交叉编译器:
arm-linux-gcc-4.3.2.tgz
2)安装交叉编译器
进入实验文件夹在终端命令行中输入下面的命令安装交叉编译器:
#tarxvzfarm-linux-gcc-4.3.2.tgz-C/编译器解压到/usr/local/arm
3)修改环境变量
把交叉编译器路径添加到系统PATH环境变量中,这样以后就可以直接在终端窗口中输入arm-linx-gcc命令来编译程序。
用文本编辑器打开/etc/profile添加以下四行到该文件中:
exportPATH=/usr/local/arm/4.3.2/bin/:
$PATH
exportTOOLCHAIN=/usr/local/arm/4.3.2
exportTB_CC_PREFIX=arm-linux
exportPKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi
4)测试编译器
重新启动系统,在终端里面执行arm-linux-gcc-v回车,若有输出编译器的版本信息说明交叉编译器已工作正常;若提示找不到命令,说明环境变量修改有误,请仔细检查修正。
若报其他错,请查看错误提示,依据出错信息进行修改。
(二)UBOOT配置编译
1)进入实验文件夹,解压UBOOT源码包
#tarxvzfuboot1.1.6-2012-09-25.tar.gz
查看UBOOT源码目录,熟悉每个目录的文件组织和功能作用。
略读README文件内容,对UBOOT项目熟悉了解
2)为自己的开发板配置编译项
UBOOT支持的开发板很多,每块开发板都有自己不同参数,利用UBOOT已支持的开发板来为自己的板子配置合适的编译项是编译UBOOT的第一步,配置项参数详细含义请阅读UBOOT的README文档以及各编译脚本源码,此处不做深度解析说明。
OK6410开发板是根据三星SMDK6410开发板改造而来的,所以可以以SMDK6410板为基础来编译,具体方法如下:
用文本编辑器在Makefile中开发板对应的编译项1778行:
xxxxx_ok6410_config:
unconfig
@$(MKCONFIG)smdk6410arms3c64xxsmdk6410samsungs3c6410NANDram256
(其中xxxxx替换为你自己的名字全拼)
cdu-boot
geditMakefile
用文本编辑器在Makefile中开发板对应的编译项1950行:
mini6410_nand_config-ram256:
unconfig
@$(MKCONFIG)mini6410arms3c64xxmini6410samsungs3c6410NANDram256
改为如下:
xxxxx_nand_config-ram256:
unconfig
@$(MKCONFIG)mini6410arms3c64xxmini6410samsungs3c6410NANDram256
(其中xxxxx替换为你自己的名字全拼)
3)添加个人标识
这一步并不是编译UBOOT需要的,只是为了跟官方编译出的uboot有所区别,我们修改一点点UBOOT的源代码,让它的输出有我们个人的标记。
用文本编辑器打开common/main.c文件,将445行的打印输出改成包含自己名字的标记:
tony_nand_config-ram256:
unconfig///////
打开main.c命令如下:
geditcommon/main.c
例如改成:
printf("######################QSTUBOOTMENU#####################\n");
geditcommon/main.c
第1414行
#defineRELEASE_MARK"2011-10"
修改为
#defineRELEASE_MARK"2018-03"
用文本编辑器打开common/main.c文件,将1444行的打印输出改成包含自己名字的标记:
打开main.c命令如下:
geditcommon/main.c
原文如下:
printf("#####FriendlyARMU-Boot("RELEASE_MARK","BOOT_MEDIA")for6410#####\n");
修改为如下内容
printf("#####xxxxxxU-Boot("RELEASE_MARK","BOOT_MEDIA")for6410#####\n");
此处请在字串中包含自己的名字(全拼),后面截图保存结果。
4)用上一步添加的编译项来编译UBOOT
进入UBOOT源码目录,执行下以编译命令
#makexxxxx_ok6410_config(xxxxx为你的名字全拼)
#make
配置命令
makexxxxx_nand_config-ram256
编译
make
编译完成后会得到u-boot.bin
注:
UBOOT编译的配置方法随着版本的升级形式有所不同,但原理相同,都是为自己的开发板配置恰当的体系结构、CPU芯片型号、内存大小、FLASH类型等各硬件参数等,重点是要理解UBOOT对众多不同开发板的支持配置方式,请浏览分析UBOOT的Makefile文件。
(三)UBOOT烧写
UBOOT烧写的方式有很多种,无论使用哪种方式,都是利用工具把编译好的uboot.bin文件烧写到NANDFLASH最开头的位置上。
OK6410官方使用的是SD卡烧写的方式,这里我们也采用这种方式。
1)制作烧写UBOOT用的SD卡
步骤1:
将SD卡格式化为FAT32格式
将SD卡接入SD读卡器中,把SD读卡器插在PC机的USB口中。
等到PC机能够正常识别出SD卡,把SD卡格式化为FAT32格式。
步骤2.通过SD_Writer.exe将mmc.bin烧写到SD卡中。
打开SD_Writer.exe,下图是xp系统中SD_Writer.exe界面截图
注意:
BoardModel选择6410。
OSType选择Linux||Android选项。
下图是WIN7系统中SD_Writer.exe界面截图。
注意Window7系统上运行烧写软件时需要以管理员身份运行,如图:
步骤3.点击”Scan”,这个步骤是自动搜寻SD卡所在盘符。
如果"Scan"没有正确设置SD卡所在盘符,就需要手动调整SDVolume,把盘
符号调整为SD卡所在盘符(比如说,PC的USB口接了两个或者两个以上的U盘或者SD卡,就有可能错误到扫描SD卡盘符)。
步骤4.将”SDType”更改为auto。
这个步骤是为了让SD_Writer自动识别SD卡类型。
如果你的PC系统是WIN7,您还需要点击”Format”来格式化SD卡。
XP用户看不到”Formart”,也不需要”Format”。
这一点,是XP和WIN7用户操作中唯一的区别。
步骤5.将”OSType”更改为Linux。
这个步骤是选择要烧写的系统类型。
步骤6.点击”SelectBoot”,选择实验资料中的mmc.bin
步骤7.点击”Program”,出现”It’sOK”表示操作成功。
成功后如下图。
步骤8.点击”确定”,然后点击”Quite”。
退出SD_Writer.exe。
步骤9.将自己在“UBOOT配置编译”环节编译出来的u-boot.bin拷贝到SD卡中。
至此用来烧写UBOOT的SD卡已制作好,接下来进行具体烧写。
2)烧写UBOOT到开发板的NandFlash中
步骤1.将制作好的SD卡插入开发板SD的插槽。
如图:
步骤2.接好5V直流电源(飞凌提供此电源,请使用飞凌提供的电源)。
开发板电源连接如图:
步骤3.拨码开关设置为SD卡启动。
拨码开关设置SD卡启动如图所示:
步骤4.将飞凌提供的串口延长线连接开发板的COM0和PC机的串口
步骤5.打开飞凌提供的DNW软件,设置好DNW的串口(附录:
dnw软件的使用简便教程)
步骤6.拨动电源开关,给开发板上电。
会出现如下的串口信息,因为信息较多,贴出结束时图片
注意:
烧写完成后会有找不到zImage的信息,这是因为飞凌开发板的烧写会自动把uBoot和zImage还有rootfs三个一起烧写,我们这里只烧写uboot,找不到zImage是正常的,zImage和rootfs我们后面用其他的方法烧写。
步骤7.拨动电源开关,开发板断电,将拨码开关设置为nandflash启动。
设置
拨码开关设置NandFlash启动如图所示:
步骤8.重新开启电源,启动同时在DNW串口界面上按空格键,使UBOOT命令行界面,此时显示是包含有你名字的菜单,这说明这时系统里运行的是我们自己编译的UBOOT,如图:
更详细的烧写内容请参考《OK6410-A开发板LINUX3.0.1-2013-01用户手册》
(四)UBOOT命令使用
UBOOT运行有两种模式,一种是加载系统模式,一种是命令行模式,开发板上电时马上按空格键则UBOOT进入命令行模式,如果没有按空格UBOOT则执行加载操作系统的模式。
当前我们要进入命令行模式,所以请执行以下步骤:
步骤1:
先用串口线连接好开发板COM0与PC机的串口,打开并设置DNW软件(附录:
dnw软件的使用简便教程)。
步骤2.然后给开发板上电,等到出现延时1秒启动系统时,在DNW软件中按PC键盘的空格键使开发板停留在uboot状态。
因为停留时间只有1秒,所以需要很快的按下空格键。
步骤3.进入uboot命令行界面
按空格键进入的菜单界面是飞凌开发板为了方便用户添加的菜单,原始的UBOOT并没有这个菜单,要进入UBOOT原始的菜单命令行,请按菜单选择[6]即可。
在命令行模式中可以执行UBOOT的命令,利用这些命令可以完成许多功能,比如内核下载、FLASH烧写擦除、系统加载等。
请在UBOOT命令行中依次学习使用以下命令:
1)help
help:
打印帮助信息
如果不带任何参数将打印当前支持的所有命令,如果将某一命令名字作为其参数,将得到该命令的更加详细的信息。
如:
SMDK2410#help
SMDK2410#helpflinfo
2)nandinfo
显示flash的信息:
#nandinfo
显示NAND32MiB3,3V8-bit,sectorsize16KiB
3)nandread
nandread命令用来从NandFlash芯片上读取数据到内存
格式为:
nandreadaddroffsize
addr都是ram的地址,off指的是nandflash的地址,size:
指要读取nandflash的数据大小,
例如:
#nandread0xc00080000x2000000x500000
#NANDread:
device0offset0x200000,size0x500000
5242880bytesread:
OK
4)nanderase[clean][offsize]
nanderase用来擦处nandflash芯片的相应区域
nanderase[offsize]off指从什么位置开发擦除,size指要擦处的空间大小
例如:
#nanderase0x2000000x500000
NANDerase:
device0offset0x200000,size0x500000
Erasingat0x200000--10
Erasingat0x300000--30
Erasingat0x400000--50
Erasingat0x480000--60
Erasingat0x500000--70at0x580000--80plete.
Erasingat0x600000--90plete.
Erasingat0x680000--100
5)nandwrite-addroffsize
nandwrite用来将内存的数据写进nandflash芯片,这个命令在烧写内核和根文件系统时很有用。
这个命令和nandread一样,只是方向是反的,是把ram的值写到nandflash中,但是在使用nandwirte之前必须将要写的flash区域先用nanderase擦除。
格式:
nandwriteaddroffsize
例如:
#nandwrite0xc00080000x2000000x500000
NANDwrite:
device0offset0x200000,size0x500000
5242880byteswritten:
OK
6)printenv打印环境变量
在UBOOT中有很多参数需要设置,如内核启动参数、UBOOT中的IP地址、内核位置及大小、根文件系统所在位置及大小等,这些参数都是以环境变量的形式保存在FLASH芯片中特殊位置,需要相应的命令来读出显示,
Printenv就是显当前UBOOT中设置的环境变量的命令
格式:
printenv
−printvaluesofallenvironmentvariables
printenvname...
−printvalueofenvironmentvariable'name'
该命令打印一个、几个或者所有的u-boot环境变量。
如下命令将打印所有的环境变量和它们的值,再加上一些统计数据,如:
存储环境变量的大小。
例如:
#printenv
bootargs=root=/dev/mtdblock2rootfstype=yaffs2init=/linuxrcconsole=ttySAC0,115200
bootcmd=nandread0xc00080000x2000000x500000;bootm0xc0008000
bootdelay=1
baudrate=115200
ethaddr=00:
40:
5c:
26:
0a:
5b
ipaddr=192.168.2.111
serverip=192.168.2.100
gatewayip=192.168.2.1
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
Environmentsize:
331/524284bytes
7)setenv设置环境变量
上面printenv命令打印出的环境变量的值有时候是需要修改的,修改这些值的命令是setenv
格式:
setenvnamevalue
name是修改的环境变量的名字,value是要给变量设置的新值,如果name是当前环境变量没有的,则此新添加这个环境变量。
如果不加value的值,则是删除此环境变量setenvname
示例:
#setenvgatewayip192.168.1.2
#printenvgatewayip
gatewayip=192.168.1.2
8)saveenv保存环境变量到非易失性存储介质
使用setenv修改的变量值仅仅在RAM中有效,一旦系统重新启动,这些改变将丢失。
如果想这些改变永久保存,用户必须使用saveenv命令将环境变量的设置保存到非易失性介质中。
格式:
saveenv
示例:
先使用setenv修改gatewayip的值,修改完后重启开发板进入UBOOT命令,查看gatewayip的值有没有修改成功
再使用setenv修改gatewayip的值,改完后执行saveenv命令,执行完再重启开发板入UBOOT命令行,但看gatewayip的值没有修改成功。
UBOOT还有很多功能强大的命令,在此不能一一实验,其他UBOOT常用命令详细列表及使用方法请参考uboot源码中README文件课后深入研究。
(五)UBOOT烧写内核与根文件系统
利用UBOOT的命令可以实现很多有用的功能,下面我们利用UBOOT命令从USB口下载KERNEL和根文件系统,
1)准备好要烧写的内核zImage和根文件系统rootfs.yaffs2
2)先用串口线连接好开发板COM0与PC机的串口,打开并设置DNW软件(附录:
dnw软件的使用简便教程)。
3)使用USB线连接开发板与,mini头一端连接开发板,另一端连接PC主机。
4)然后给开发板上电,等到出现延时1秒启动系统时,在DNW软件中按PC键盘的空格键使开发板停留在uboot状态。
因为停留时间只有1秒,所以需要很快的按下空格键。
5)在菜单选择栏中选择6进入UBOOT命令行界面:
6)敲入dnw0xC0008000命令
此命令的含义是从USB口下载一个文件到内存0xC0008000的位置
7)安装USB下载驱动
如果第一次使用,此时PC机会提示安装USB下载驱动,按以下步骤安装驱动,
特殊说明:
USB下载驱动专用于DNWUSB下载功能。
开发板运行U-boot命令行状态下,下载安装Uboot命令时,方可安装USB下载驱动,其他情况都不可以安装或使用下载功能。
步骤1.第一次使用USB下载文件时,电脑会提示找到新硬件,并弹出“找到硬件向导”窗口。
步骤2.这里我们选择从“列表或指定位置安装”点击下一步
步骤3.选中“在搜索中包括这个位置”,点击浏览按钮指定驱动所在位置;驱动位于用户基础资料光盘的“实用工具\USB驱动\DNW下载驱动”文件夹中。
点击‘下一步’,在弹出的窗口中选择‘oemX.inf’(X的值不定),然后继续点击‘下一步’开始安装驱动程序:
步骤4.安装完成后在DNW标题栏上会显示[USB:
0K],DNW窗口中会打印如下图所示信息
注:
如果系统是WIN7操作界面可能不同,但思路相同,都是到指定目录搜索驱动文件。
8)从USB口下载kernel到内存
从DNW的usbport->Transmit->Transmit发送你要生成的内核bin文件,设置好后DNW会自动下载。
9)烧写kernel到NANDFLASH
USB口下载完毕后,此时内核已经存在于内存的0x50008000位置,但重启后无法保存,我们要将内核烧写到NANDFLASH的0x200000的位置,使用以下命令:
在DNW窗口中输入:
nanderase0x2000000x500000擦除nandflash
Erasingat0x200000--10x300000--3080000--40lete.
Erasingat0x480000--6080mplete.
Erasingat0x600000--90te.
OK
在DNW窗口中输入:
nandwrite0x500080000x2000000x500000
将内存地址50008000中的数据写到nandflash的0x200000空间中。
NANDwrite:
device0offset0x200000,size0x500000
5242880byteswritten:
OK
10)从USB口下载rootfs并烧定
下载rootfs与下载kernel用法完全相同,只是rootfs写入NANDFLASH的地址是0x700000,大小是0x7F900000,请参照上面步骤完成下载rootfs并写入NANDFLASH
dnw0x50008000
nanderase0x7000000x7F90000
nandwrite.yaffs20x500080000x7000000x7bc0000(这里的0x7bc0000是rootfs下载到内存时看到的实际大小,请根据实际大小添写,此处仅为示例)
11)重启开发板,看Linux系统能否正常启动。
(六)UBOOT自定义命令添加
上一环节中我们使用了UBOOT自带的命令,如果我们想要对UBOOT进行改造实现自已的特殊操作,也可以添加新的U-Boot命令
U-Boot的每一个命令都是通过U_BOOT_CMD宏定义的。
这个宏在头文件中定义
#ifdef CFG_LONGHELP
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t__u_boot_cmd_##nameStruct_Section = {#name, maxargs, rep, cmd, usage, help}
#else
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t__u_boot_cmd_##nameStruct_Section = {#name, maxargs, rep, cmd, usage}
#endif
每一个命令定义一个cmd_tbl_t结构体,而cmd_tbl_t真实结构如下所示:
typedef struct cmd_tbl_scmd_tbl_t;
struct cmd_tbl_s {
char *name;
int maxargs;
int repeatable;
int (*cmd)(struct cmd_tbl_s *, int, int, char *[])