jz2440在u-boot中通过网络方式烧录镜像的几种方法

jz2440如何在u-boot中通过网络方式烧录镜像

进入uboot

u-boot相当于我们PC机的BIOS,,在PC上厂商为我们做好了图形界面,操作起来非常便利。虽然在2440u-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下载并烧录镜像

前提条件

1.      开发板可和PC之间能ping通,配置参考:http://wiki.100ask.org/VMwareAndUbuntuNetworkSetupGuide
2.      开发板中有可运行的 uboot
3.      PC端有可执行的tftp32.exe 程序

 通过tftp烧写uImagenand Flash步骤:

打开 tftpd32.exe软件, uImage 拷贝至工作目录

在串口终端中依次输入:

tftp 0x30008000 uImage_4.3
nand erase kernel
nand write 0x30008000 kernel

 

烧写YAFFSNandFlash

打开 tftpd32.exe软件, fs_mini.yaffs2 拷贝至工作目录

在串口终端中依次输入:

tftp 0x30008000 fs_mini.yaffs2
nand erase root 
nand write.yaffs 0x30008000 root $(filesize)    # $(filesize)  fs_mini.yaffs2 的大小

烧写JFFSNandFlash

打开 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

操作步骤

开发板网络配置

假设ubuntuIP地址为 192.168.0.20

开发板ubootip地址、网关、子网掩码的配置信息如下:

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

烧写yaffsNandFlash

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

烧写JFFSNandFlash

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
参考文章说明了如何配置UbuntuNFS服务,开发板的参数设置,最后成功启动根文件系统。

 

如果我们的内核和根文件系统也想通过nfs的方式启动改怎么做呢?

其实在上文中已经给出了方法:我们下载好内核后再 bootm 从下载的位置启动就可以了,所以我们只需要配置一下uboot的启动参数。

假设ubuntuIP地址为 192.168.0.20,开发板的ip 192.168.0.17uboot的启动参数设置如下:

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


0 条评论&回复

请先 登录 后评论
百问网-周老师
百问网-周老师

100ask_fae

18 篇文章

作家榜 »

  1. 百问网-周老师 18 文章
  2. st_ashang 14 文章
  3. 渐进 12 文章
  4. zxq 11 文章
  5. helloworld 8 文章
  6. 谢工 5 文章
  7. Litchi_Zheng 5 文章
  8. 星星之火 5 文章