教程使用的是韦东山百问网的jz2440开发板。
进入uboot
u-boot相当于我们PC机的BIOS,,在PC上厂商为我们做好了图形界面,操作起来非常便利。虽然在2440中u-boot并没有界面,但是百问网制作好的uboot中有目录菜单,比较常用的操作都列了出来,开发板上电后,在倒计时结束之前按下任意键进入uboot后就可以看到下面的菜单及说明:
##### 100ask Bootloader for OpenJTAG #####
[n] Download u-boot to Nand Flash
[c] Re-scan Nor Flash
[u] Copy bootloader from nand to nor
[v] Copy bootloader from nor to nand
[k] Download Linux kernel uImage
[j] Download root_jffs2 image
[y] Download root_yaffs image
[d] Download to SDRAM & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the Nand Flash
[s] Set the boot parameters
[b] Boot the system
[r] Reboot u-boot
[q] Quit from menu
Enter your selection:
获取帮助信息
在菜单中输入对应的字符就可以进行相应的操作的,这些是帮我们整合好的简单操作指令,如果要使用高级的命令,就需要输入 q退出菜单后,输入对应的指令对其进行操作,那么我们该怎么指导输入哪些指令呢?常见简单,在使用uboot时,我们输入 help就可获得所有的帮助信息:
Enter your selection: q
OpenJTAG> help
? - alias for 'help'
autoscr - run script from memory
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
chpart - change active partition
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
erase - erase FLASH memory
flinfo - print FLASH memory information
fsinfo - print information about filesystems
fsload - load binary file from a filesystem image
go - start application at address 'addr'
help - print online help
icache - enable or disable instruction cache
iminfo - print header information for application image
imls - list all images found in flash
itest - return true/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodemmode)
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
menu - display a menu, to select the items to do something
mm - memory modify (auto-incrementing)
mtdparts- define flash/nand partitions
mtest - simple RAM 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
sleep - delay execution for some time
suspend - suspend the board
tftpboot- boot image via network using TFTP protocol
usbslave - get file from host(PC)
version - print monitor version
OpenJTAG>
上面列出了很多命令,但是我们还需要指导每个命令的具体用法,如参数选项才能进行操作呀!所有我们需要更深入一步了解每个命令的用法才能操作,非常简单,输入 help <命令> 就可以了,比如我想要知道 nand 的用法有哪些,示例操作:
OpenJTAG> help nand
nand info - show available NAND devices
nand device [dev] - show or set current device
nand read[.jffs2] - addr off|partition size
nand write[.jffs2] - addr off|partiton size - read/write `size' bytes starting
at offset `off' to/from memory address `addr'
nand read.yaffs addr off size - read the `size' byte yaffs image starting
at offset `off' to memory address `addr'
nand write.yaffs addr off size - write the `size' byte yaffs image starting
at offset `off' from memory address `addr'
nand read.raw addr off size - read the `size' bytes starting
at offset `off' to memory address `addr',without oob and ecc
nand write.raw addr off size - write the `size' bytes starting
at offset `off' from memory address `addr',without oob and ecc
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 at offset (UNSAFE)
nand biterr off - make a bit error at offset (UNSAFE)
nand lock [tight] [status] - bring nand to lock state or display locked pages
nand unlock [offset] [size] - unlock section
OpenJTAG>
查看并设置uboot环境变量信息
知道怎么在uboot中获取帮助后我们就可以进行操作了,如在我们想通过tftp方式下载并烧录镜像文件或者启动镜像文件,配置nfs方式启动也都可以了。
磨刀不误砍柴工,在配置之前我们第一步就是配置环境变量,目的是对接好我们PC,使用 print命令查看当前 uboot 的环境信息:
OpenJTAG> print
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
bootdelay=2
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.0.17
serverip=192.168.0.11
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
partition=nand0,0
mtddevnum=0
mtddevname=bootloader
Environment size: 450/131068 bytes
OpenJTAG>
要进行tftp的方式下载镜像文件,我们最关心的就是,ip地址、服务器的ip地址、网关、子网掩码,那么用哪个命令进行修改呢?刚刚获取到的帮助信息当中有 setenv命令,我们 help setenv 获取它的帮助信息了解一下:
OpenJTAG> help setenv
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'
OpenJTAG>
非常简单,我们说明按照格式进行修改就可以了,因此修改它们的方式如下
setenv ipaddr 192.168.0.17 #设置开发板IP
setenv serverip 192.168.0.11 #设置服务器ip(Windows)
setenv gatewayip 192.168.0.1 #设置网关-
setenv netmask 255.255.255.0 #设置子网掩码
saveenv
修改完之后还需要执行 saveenv 保存我们刚才的修改,否则下次启动就会保持未修改之前的状态。
saveenv - save environment variables to persistent storage
清除某个变量
要清除uboot中的某个环境变量非常简单,只要我们写入空的参数就可以了,示例操作:
setenv ipaddr
setenv serverip
这样 ipaddr 和 serverip 的参数就为空了。
操作示例-使用tftp下载并烧录镜像
前提条件
开发板可和PC之间能ping通,配置参考:
- 开发板&PC&虚拟机之间的网络配置 - 百问网嵌入式Linux wiki
- 开发板中有可运行的 uboot
- PC端有可执行的tftp32.exe 程序
通过tftp烧写uImage到nand Flash步骤:
打开 tftpd32.exe软件, 将 uImage 拷贝至工作目录
在串口终端中依次输入:
tftp 0x30008000 uImage_4.3
nand erase kernel
nand write 0x30008000 kernel
烧写YAFFS至NandFlash
打开 tftpd32.exe软件, 将 fs_mini.yaffs2 拷贝至工作目录
在串口终端中依次输入:
tftp 0x30008000 fs_mini.yaffs2
nand erase root
nand write.yaffs 0x30008000 root $(filesize) # $(filesize) 是 fs_mini.yaffs2 的大小
烧写JFFS至NandFlash
打开** tftpd32.exe** 软件,将 fs_mini.jffs2 拷贝至工作目录
在串口终端中依次输入:
tftp 0x30008000 fs_mini.jffs2
nand erase root
nand write.jffs2 0x30008000 root $(filesize) #$(filesieze) 是 fs_mini.yaffs2 的大小
使用 jffs2 文件系统启动时记得修改 bootargs 添加 rootfstype=jffs2
Yaffs2:
setenv bootargs console=ttySAC0,115200 root=/dev/mtdblock3
Jffs2:
setenv bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
最后执行保存更改、重启开发板就可进入新烧录的系统了
saveenv reset
操作示例-使用NFS下载并烧录启动镜像
前提条件
- 开发板可和Ubuntu之间能ping通,配置参考:http://wiki.100ask.org/VMwareAndUbuntuNetworkSetupGuide
- Ubuntu搭建好NFS服务,配置并开启了NFS服务,配置参考:https://zhuanlan.zhihu.com/p/28556875
- 开发板中有可运行的 uboot
操作步骤
开发板网络配置
假设ubuntu的IP地址为 192.168.0.20
开发板uboot的ip地址、网关、子网掩码的配置信息如下:
setenv ipaddr 192.168.0.17 #设置开发板IP
setenv gatewayip 192.168.0.1 #设置网关-
setenv netmask 255.255.255.0 #设置子网掩码
saveenv
修改完之后还需要执行 saveenv保存我们刚才的修改,否则下次启动就会保持未修改之前的状态。
saveenv - save environment variables to persistent storage
通过nfs下载镜像文件并烧录
下载u-boot:
nfs 0x30008000 192.168.0.20:/work/nfs_root/u-boot.bin #将uboot.bin 下载到sdram 0x30008000
烧录u-boot:
nand erase bootloader #擦除bootloader区域
nand write 0x30008000 bootloader #将0x30008000的内容烧写到bootloader
下载uImage:
nfs 0x30008000 192.168.0.20:/work/nfs_root/uImage #将uImage下载到sdram 0x30008000
烧录uImage:
nand erase kernel #擦除kernel区域
nand write 0x30008000 kernel #将0x30008000的内容烧写到bootloader
下载YAFFS文件系统
nfs 0x30008000 192.168.0.20:/work/nfs_root/fs_mini.yaffs2 #将根文件系统下载到sdram 0x30008000
烧写yaffs至NandFlash
nand erase root #擦除root区域
nand write.yaffs 0x30008000 root $(filesize) #将从0x30008000开始的内容烧写到root,文件大小是$(filesize)
下载JFFS文件系统
nfs 0x30008000 192.168.0.20:/work/nfs_root/fs_mini.jffs2 #将根文件系统下载到sdram 0x30008000
烧写JFFS至NandFlash
nand erase root #擦除root区域
nand write.jffs2 0x30008000 root $(filesize) #将从0x30008000开始的内容烧写到root,文件大小是$(filesize)
下载内核后不烧录到开发板直接启动
我们通过网络下载内核到 SDRAM 中后,不想烧录到开发板,只想像nfs启动那样可以吗?
当然可以,在上面的操作中,我们将内核下载到了 0x30008000 的位置上了,只要我们使用 bootm 命令就可以从那个地址开始启动内核了。
bootm 0x30008000
NFS挂载方式启动内核、根文件系统
参考:https://zhuanlan.zhihu.com/p/28556875
参考文章说明了如何配置Ubuntu的NFS服务,开发板的参数设置,最后成功启动根文件系统。
如果我们的内核和根文件系统也想通过nfs的方式启动改怎么做呢?
其实在上文中已经给出了方法:我们下载好内核后再 bootm 从下载的位置启动就可以了,所以我们只需要配置一下uboot的启动参数。
假设 Ubuntu 的 IP 地址为 192.168.0.20 ,开发板的 IP 为 192.168.0.17 ,uboot的启动参数设置如下:
setenv bootcmd 'nfs 30000000 192.168.0.20:/work/nfs_root/uImage_alsa; bootm 30000000' #由于是两条指令,因此需要用''引起来
setenv bootargs noinitrd
root=/dev/nfs rw nfsroot=192.168.0.20:/home/book/nfs_rootfs ip=192.168.0.17:192.168.0.20:10.0.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
saveenv
reset