一、U-boot介绍
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。
常见的boot-loader有Redboot、ARMboot、U-Boot等,U-Boot,全称 Universal Boot Loader;
选择U-Boot的理由:
1、开放源码;
2、支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
3、支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
4、较高的可靠性和稳定性;
5、 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
6、 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
7、较为丰富的开发调试文档与强大的网络技术支持;
二、U-boot命令
启动开发板
U-Boot 2010.09-00000-ga6a1bb1-dirty (Mar 26 2018 - 10:39:02)
DRAM: 64 MiB
NAND: 256 MiB
*** Warning - bad CRC or NAND, using default environment
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
在U-boot延时时间结束前按任意键进入U-boot
[fl2440@lingyun]#
[fl2440@lingyun]#
输入help或者?帮助,可以列出所有命令
[fl2440@lingyun]# help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootelf - Boot from an ELF image in memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
date - get/set/reset date & time
dcache - enable or disable data cache
echo - echo args to console
editenv - edit environment variable
erase - erase FLASH memory
exit - exit script
false - do nothing, unsuccessfully
flinfo - print FLASH memory information
go - start application at address 'addr'
help - print command description/usage
icache - enable or disable instruction cache
iminfo - print header information for application image
imxtract- extract a part of a multi-image
itest - return true/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing address)
mtest - simple RAM read/write test
mw - memory write (fill)
nand - NAND sub-system
nboot - boot from NAND device
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
protect - enable or disable FLASH write protection
rarpboot- boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
showvar - print local hushshell variables
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true - do nothing, successfully
version - print monitor version
输入查看单个命令怎么用,help [命令] 或?[命令],只输入命令,如果命令格式不正确的话也会给你显示该命令用法。对于不需要参数的命令,使用help或者?查看,如reset单输入reset就会重启了
[fl2440@lingyun]# help reset
reset - Perform RESET of the CPU
Usage:
reset
[fl2440@lingyun]# ? reset
reset - Perform RESET of the CPU
Usage:
reset
输入printenv可以查看U-boot环境变量,U-boot也支持命令缩写,如printenv缩写成pri,在所有的命令中没有其他任何一个的命令是由pri开头的,只需要输入pri即可。
[fl2440@lingyun]# printenv
bootargs=console=tty0 console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs mem=64M noinitrd rw loglevel=7
bootcmd=nand read 30008000 100000 900000; bootm 30008000
bbl=tftp 30008000 u-boot-s3c2440.bin;nand erase 0 100000;nand write 30008000 0 60000
blx=tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000 F00000;nand write 30008000 100000 D00000
bubifs=tftp 30008000 rootfs-ubifs.bin;nand erase 1000000 2800000;nand write 30008000 1000000 $filesize
bjffs2=tftp 30008000 rootfs-jffs2.bin;nand erase 1000000 2800000;nand write 30008000 1000000 $filesize
bsys=run blx;run bubifs
args_initramfs=console=tty0 console=ttyS0,115200 mem=64M rw loglevel=7
args_ubifs=console=tty0 console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs mem=64M noinitrd rw loglevel=7
args_jffs2=console=tty0 console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd loglevel=7
tb=tftp 30008000 linuxrom-s3c2440.bin; bootm 30008000
bootdelay=2
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.2.168
serverip=192.168.2.8
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000
Environment size: 1133/131068 bytes
环境变量,bootcmd是U-boot自动启动后执行的命令,从硬盘中读linux加载到内存中去执行,bootdelay延时时间,可以设置它控制启动后有几秒钟能够进入U-boot不启动linux系统,还可以看到标准输入标准输出标准出错都是串口,ip地址服务器地址子网掩码等等...
可以使用set命令修改U-boot环境
set只是暂时修改,下次重启之后又会恢复原来的配置,如果想要永久保存修改,使用set命令之后需要使用save命令保存到配置中
内存/寄存器操作命令,内存比较cmp,内存复制cp,存储器显示md,存储器修改mm。
bootm引导内核启动...
因为U-boot常只是用来烧录系统而已,所以下面介绍U-boot烧录系统用到的命令
1、网线连接开发板和电脑,
2、pri查看U-boot环境变量
3、设置开发板与电脑在同一网段
set ipaddr [ip address]
ip address设置开发板的ip需要与电脑网线连接的网卡对应的ip相同的网段内
这里我设置成set ipaddr 192.168.137.3
set serverip [server ip]
server ip设置服务器ip,设置成电脑网线连接开发板的网卡对应的ip
这里我设置成set serverip 192.168.137.1
4、用ping命令用于测试u-boot与目标机之间的连通性
ping 192.168.137.1
host 192.168.137.1 is alive说明能够连通
5、tftp下载文件命令
[fl2440@lingyun]# ? tftp
tftpboot - boot image via network using TFTP protocol
Usage:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftp loadAddress加载到内存的地址 hostlPaddr不设置默认是从serverip处下载,然后就是下载的bootfilename文件名
6、下载的文件在内存中,掉电之后就丢失了,所以要写到硬盘中之后才能自动加载。需要使用nand命令
[fl2440@lingyun]# help nand
nand - NAND sub-system
Usage:
nand info - show available NAND devices
nand device [dev] - show or set current device
nand read - addr off|partition size
nand write - addr off|partition size
read/write 'size' bytes starting at offset 'off'
to/from memory address 'addr', skipping bad blocks.
nand erase [clean] [off size] - erase 'size' bytes from
offset 'off' (entire device if not specified)
nand bad - show bad blocks
nand dump[.oob] off - dump page
nand scrub - really clean NAND erasing bad blocks (UNSAFE)
nand markbad off [...] - mark bad block(s) at offset (UNSAFE)
nand biterr off - make a bit error at offset (UNSAFE)
先介绍一下Nandflash。Flash Memory中文名字叫闪存,是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器。按功能特性分为两种:一种是NOR型闪存,以编码应用为主,其功能多与运算相关;另一种为NAND型闪存,主要功能是存储资料,如数码相机中所用的记忆卡。
NandFlash和NorFlash的区别,NandFlash相对比较便宜但是存在坏块,所以每页都留有64Bytes的空间用于存放校验和用于检验是否是坏块,NorFlash相对较贵但是不存在坏块。
NandFlash和NorFlash的共性首先表现在向芯片中写数据必须先将芯片中对应的内容清空,然后再写入,也就是通常说的“先檫后写”。只不过NorFlash只用檫写一个字,而NandFlash需要擦写整个块。
使用的设备Fl2440开发板使用的是NandFlash。nand info显示可使用的 Nand Flash,nand bad列出Nand Flash中的所有坏块,nand mark [...]标记偏移处是坏块,nand scrub 彻底擦除整块 Nand Flash 中的数据到恢复出厂设置,会擦除掉用户标记的坏块处,而nand earse不会擦除用户标记的坏块处,nand erase NandFlash擦除命令一擦擦一块,nand write NandFlash写命令一写写一页,nand read NandFlash读命令。
nand earse擦除要写的NandFlash区域之后,nand write从内存中写入制作好的u-boot、Linux内核以及根文件系统到nandflash相应分区,就完成烧录了。
这里只是简单的介绍使用,有时间再做u-boot的移植好好深入了解U-boot,U-boot源码下载地址:ftp://ftp.denx.de/pub/u-boot/