JZ2440在U-boot中通過網路方式燒錄映象的幾種方法

韋東山發表於2020-10-29

進入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下載並燒錄映象

前提條件

1.開發板可和PC之間能ping通,配置參考:http://wiki.100ask.org/VMwareAndUbuntuNetworkSetupGuide
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

百問網技術論壇:
http://bbs.100ask.net/

線上教學網站:
https://www.100ask.net/index

百問網開發板:
https://weidongshan.tmall.com/

技術交流群(鴻蒙開發/Linux/嵌入式/驅動/資料下載)
QQ群:869222007

微控制器-嵌入式Linux交流群:
QQ群:536785813
百問科技

百問科技公眾號

在這裡插入圖片描述

百問科技服務號

在這裡插入圖片描述

韋東山嵌入式Linux隨身課堂

相關文章