2440|jz2440在u-boot中通过网络方式更新启动挂载镜像的几种方法

教程使用的是韦东山百问网的jz2440开发板

image

进入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通,配置参考:

  1. 开发板&PC&虚拟机之间的网络配置 - 百问网嵌入式Linux wiki
  2. 开发板中有可运行的 uboot
  3. 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下载并烧录启动镜像

前提条件

  1. 开发板可和Ubuntu之间能ping通,配置参考:http://wiki.100ask.org/VMwareAndUbuntuNetworkSetupGuide
  2. Ubuntu搭建好NFS服务,配置并开启了NFS服务,配置参考:https://zhuanlan.zhihu.com/p/28556875
  3. 开发板中有可运行的 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