1. Boot 環境變量
Boot 環境變量是指Boot 運行時的環境變量和引導內核啟動的參數配置,通常會在
Flash 划分一塊區域來存儲Boot 環境變量,即bootargs 分區。
fastboot 啟動時會打印出bootargs 分區的位置和大小,如:
Boot Env on eMMC
Env Offset: 0x00100000
Env Size: 0x00010000
miniboot 啟動時會打印出bootargs 分區的位置和大小,如:
Env: Load Env from eMMC, start:0x100000, size:0x10000
1.1 Boot 網絡配置
配置目標板的MAC地址:
setenv ethaddr xx:xx:xx:xx:xx:xx
配置目標板的IP地址:
setenv ipaddr xxx.xxx.xxx.xxx
配置目標板的子網掩碼:
setenv netmask 255.255.xxx.0
配置目標板的網關:
setenv gatewayip xxx.xxx.xxx.xxx
配置目標板tftp 服務器的IP 地址:
setenv serverip xxx.xxx.xxx.xxx
配置完成后使用ping 命令測試目標板的網絡環境是否正確。
miniboot 不支持網絡,不需要配置。
1.2 bootargs 參數配置
bootargs 是Boot 傳給內核的啟動參數,其中包含了內存大小、串口、根文件系統和分
區表等配置。
Boot 啟動過程中讀取目標板的內存大小,選擇對應的bootargs 內存配置變量與booargs
變量組合成bootargs 傳遞給內核。
1.2.1 bootargs 內存配置變量
Boot 支持不同DDR 容量的內存配置,支持bootargs_512M、bootargs_1G、
bootargs_2G、bootargs_768M、bootargs_1536M 等,啟動時讀取目標板的DDR 容量選
擇對應的內存配置。如目標板DDR 容量為1G,則使用bootargs_1G。
bootargs 內存配置變量有如下配置選項:
mem —— 配置內核可用內存大小,一般配置為DDR 的實際容量,使用安全OS
時配置為DDR 的實際容量減65MB,保留出來的65MB 內存給安全OS 使用。
mmz —— 從內核可用內存中划分出一段物理上連續的內存,提供給需要使用連
續物理內存的模塊使用。
vmalloc —— 32 位內核時需要指定vmalloc 空間的大小。
bootargs 內存配置變量的配置方法可參考configs\芯片名稱\prebuilts\bootargs.txt。
1.2.2 bootargs 變量
bootargs 變量有如下配置選項:
console —— 配置內核的打印控制台,一般配置為ttyAMA0,115200,表示使用串
口0 作為控制台設備,波特率為115200。
root —— 指定根文件系統所在的設備。
− UBI 根文件系統時配置為root=ubi0:ubifs ubi.mtd=rootfs;
− mtdparts 分區表中的分區從0 開始編號,設備為/dev/mtdblockX,X 為根文件系
統的分區號;
− blkdevparts 分區表中的分區從1 開始編號,設備為/dev/mmcblk0pX,X 為根文
件系統的分區號。
rootfstype —— 指定根文件系統的類型,支持ext4、squashfs、cramfs、ubifs、
yaffs2、jffs2。
rootwait —— 表示等待根文件系統所在的設備就緒后再嘗試掛載根文件系統,只
有eMMC Flash 增加此選項。
Flash 分區表 —— 根據目標板的Flash 類型配置。
− SPI Flash 分區表格式:mtdparts=hi_sfc:size(name),size(name),...
− NAND Flash 分區表格式:mtdparts=hinand:size(name),size(name),...
− 同時使用 SPI Flash 和NAND Flash 的分區表格式:
mtdparts=hi_sfc:size(name),size(name),...;hinand:size(name),size(name),...
− eMMC Flash 分區表格式:blkdevparts=mmcblk0:size(name),size(name),…
其中:
size(name)表示一個分區,size 指定分區的大小,name 指定分區的名字
bootargs 變量的配置方法可參考configs\芯片名稱\prebuilts\bootargs.txt。
1.3 bootcmd 變量
bootcmd 變量用於引導內核,配置方法可參考configs\芯片名稱\prebuilts\bootargs.txt。
2 Boot 常用命令
2.1 printenv 命令
打印出所有的Boot 環境變量。
2.2 setenv 命令
設置或修改Boot 環境變量。
setenv 命令的格式:setenv 變量名 變量值
其中:
變量值中有空格時需要使用單引號將變量值包含起來;
變量值中有多個命令時使用分號分隔;
例:
setenv bootcmd 'mmc read 0 0x1FFFFC0 0x33000 0x10000;bootm 0x1FFFFC0'
2.3 saveenv 命令
將Boot 環境變量保存到bootargs 分區。
2.4 reset 命令
重啟Boot。
2.5 tftp 命令
fastboot 支持tftp 客戶端,可以從tftp 服務端下載文件到指定地址的DDR 區域,或者
將指定DDR 地址的內容上傳到服務端。
tftp 命令的用法:
tftp [loadAddress] [bootfilename] <upload_size>
其中:
loadAddress:DDR 地址
bootfilename:要下載或上傳的文件名
upload_size:可選項
− 如果不指定,即表示下載文件
− 如果指定了,即表示上傳指定大小的 DDR 內容到服務端
upload_size 的單位是Byte。
miniboot 不支持網絡,無法使用tftp 命令。
2.6 Flash 分區燒錄命令
為了便於說明在fastboot 命令行燒錄Flash 分區,以表3-1Flash 分區表為例:
表3-1 Flash 分區表
分區名稱 Flash 偏移 長度 大小
Boot 0x00000000 0x00080000 512KB
bootargs 0x00080000 0x00100000 512KB
kernel 0x00100000 0x00400000 3MB
rootfs 0x00500000 0x06000000 91MB
偏移是相對Flash 首地址的偏移。Flash 可以為SPI Flash/Nand/SPI Nand/eMMC,用戶需要根據目
標板的配置合理安排分區。
通常0x1000000 以下的DDR 空間預留給Boot 使用,因此,我們選擇0x1000000 以后
的空間用於鏡像下載。
2.6.1 nand 命令
NAND Flash 和SPI NAND 使用nand 命令燒錄。
fastboot# help nand
nand info - show available NAND devices
nand device [dev] - show or set current device
nand read - addr off|partition size
nand write[.yaffs] - 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 read 和nand write:分別是讀nand 分區和寫Nand 分區命令
addr:要讀和寫的DDR 緩存地址
off:nand 分區的起始位置
size:要讀或寫的大小,off 和size 都是以Bytes 為單位。
nand write.yaffs:將yaffs 文件系統寫入Nand 分區的命令,與nand write 的區別是
nand write.yaffs 會將yaffs OOB 數據寫入到Nand 的OOB 區域。
nand erase:擦除Nand 分區的命令,可以指定偏移off 和大小size 擦除,如果不輸
入從參數,則整片擦除,但是此命令會跳過壞塊。
nand dump:可以打印指定偏移off 處的Nand 頁面數據。
nand bad:命令可以顯示當前Nand 器件中的壞塊。
nand scrub:命令會擦除整片Nand,包括壞塊。
以下是用nand 命令燒錄表3-1 Flash 分區的示例:
步驟 1 燒錄Boot:
將fastboot-burn.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 fastboot-burn.bin
擦除flash 上0x0~0x80000 空間:
nand erase 0x0 0x80000
把DDR 0x1000000~0x180000 的內容(fastboot-burn.bin)寫入flash 0x0~0x80000 的空間:
nand write 0x1000000 0x0 0x80000
步驟 2 燒錄bootargs:
將bootargs.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 bootargs.bin
擦除flash 上0x80000~0x100000 空間:
nand erase 0x80000 0x80000
把DDR 0x1000000~0x180000 的內容(bootargs.bin)寫入flash 0x80000~0x100000 的空
間:
nand write 0x1000000 0x80000 0x80000
步驟 3 燒錄Kernel(Linux 內核):
將hi_kernel.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 hi_kernel.bin
擦除flash 上0x100000~0x500000 空間:
nand erase 0x100000 0x400000
把DDR 0x1000000~0x1400000 的內容(hi_kernel.bin)寫入flash 0x100000~0x500000 的空
間:
nand write 0x1000000 0x100000 0x400000
步驟 4 燒錄rootfs(使用yaffs):
將rootfs.yaffs 文件下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 rootfs.yaffs
擦除flash 上0x500000~0x6500000 空間:
nand erase 0x500000 0x6000000
把DDR 0x1000000~0x7000000 的內容(rootfs.yaffs)寫入flash
0x500000~(0x500000+$(filesize))的空間:
nand write.yaffs 0x1000000 0x500000 $(filesize)
此處用的是write.yaffs 命令,$(filesize)是tftp 命令設置的rootfs.yaffs 文件的大小。
NAND Flash 上也可以使用cramfs/squashfs/UBI 文件系統,如果要燒錄這三種文件系統,應該使
用nand write 命令。
----結束
2.6.2 sf 命令
SPI Flash 使用sf 命令燒錄。
fastboot# help sf
sf probe [bus:]cs [hz] [mode] - init flash device on given SPI bus
and chip select
sf read addr offset len - read `len' bytes starting at
`offset' to memory at `addr'
sf write addr offset len - write `len' bytes from memory
at `addr' to flash at `offset'
sf erase offset len - erase `len' bytes from `offset'
sf 命令與nand 命令類似,不同點在於SPI Flash 燒錄前需要執行一次sf probe 0,0 表示
SPI Flash 設備號,通常海思只支持一片SPI Flash,因此設備號為0。
以下是使用sf 命令燒錄表3-1 Flash 分區的示例:
步驟 1 探測一下是否存在SPI Flash
sf probe 0
每次重啟后,都需要執行此步驟才能繼續后續的操作。
步驟 2 燒錄Boot:
將fastboot-burn.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 fastboot-burn.bin
擦除flash 上0x0~0x80000 空間:
sf erase 0x0 0x80000
把DDR 0x1000000~0x180000 的內容(fastboot-burn.bin)寫入flash 0x0~0x80000 的空間:
sf write 0x1000000 0x0 0x80000
步驟 3 燒錄bootargs:
將bootargs.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 bootargs.bin
擦除flash 上0x80000~0x100000 空間:
sf erase 0x80000 0x80000
把DDR 0x1000000~0x180000 的內容(bootargs.bin)寫入flash 0x80000~0x100000 的空
間:
sf write 0x1000000 0x80000 0x80000
步驟 4 燒錄Kernel(Linux 內核):
將hi_kernel.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 hi_kernel.bin
擦除flash 上0x100000~0x500000 空間:
sf erase 0x100000 0x400000
把DDR 0x1000000~0x1400000 的內容(hi_kernel.bin)寫入flash 0x100000~0x500000 的空
間:
sf write 0x1000000 0x100000 0x400000
步驟 5 燒錄rootfs(使用jffs2):
將rootfs.jffs2 文件下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 rootfs.jffs2
擦除flash 上0x500000~0x6500000 空間:
nand erase 0x500000 0x6000000
把DDR 0x1000000~0x7000000 的內容(rootfs.jffs2)寫入flash
0x500000~(0x500000+$(filesize))的空間:
sf write 0x1000000 0x500000 $(filesize)
$(filesize)是tftp 命令設置的rootfs.jffs2 文件的大小。
SPI Flash 上可以使用jffs2/cramfs/squashfs,cramfs 和squashfs 也是使用sf write 命令燒錄。
----結束
2.6.3 mmc 命令
eMMC Flash 使用mmc 命令燒錄。
fastboot# help mmc
mmc read <device num> addr blk# cnt
mmc write <device num> addr blk# cnt
mmc erase <device num> blk# cnt
mmc write.ext4sp <device num> addr blk# cnt
mmc bootread <device num> addr blk# cnt
mmc bootwrite <device num> addr blk# cnt
mmc rescan <device num>
mmc list - lists available devices
mmc reg <device num>
eMMC Flash 讀寫操作的單位是塊,塊大小為512Bytes,與SPI Flash 和Nand Flash 不同,eMMC
在寫入之前不需要擦除。
其中:
mmc read 和mmc write:讀寫eMMC 分區的命令。
<device num>:eMMC 設備號,通常海思芯片只支持一片eMMC 器件,因此,設
備號為0。
addr:DDR 緩存的地址。
blk#和cnt:需要讀或寫的起始塊號和塊的數量,例如需要在1M~1.5M 之間寫入
512K 的數據,則blk#是0x800 (即1024*1024/512),cnt 是0x400(即
512*1024/512)。
mmc erase:eMMC 擦除命令,雖然eMMC 可以不用擦除就寫,但是eMMC 協議
還是提供了擦除的命令,用於可靠地將器件上的數據清除,但依賴於eMMC 器件
的實現。
mmc write.ext4sp:燒寫ext4 文件系統的命令。
mmc bootread 和mmc bootwrite:用於讀寫eMMC Boot 分區。
mmc rescan:可以用於重新掃描eMMC 總線上的器件,通常在eMMC 初始化失敗
時,用於嘗試再初始化eMMC,便於定位問題。
mmc list:用於查詢可用的eMMC 器件。
mmc reg:用於查詢eMMC 器件內部的OCR/CID/CSD/RCA/EXT_CSD 等寄存器。
mmc erase 命名能否將器件的數據徹底清除,依賴於器件本身,不同eMMC 廠家對
eMMC 擦除命令的處理方式不同,因此需要與eMMC 廠家確認。
以下是用mmc 命令燒錄表3-1 Flash 分區的示例:
步驟 1 燒錄Boot:
將fastboot-burn.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 fastboot-burn.bin
把DDR 0x1000000~0x180000 的內容(fastboot-burn.bin)寫入flash 0x0~0x80000 的空間:
mmc write 0x1000000 0x0 0x400
步驟 2 燒錄bootargs:
將bootargs.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 bootargs.bin
把DDR 0x1000000~0x180000 的內容(bootargs.bin)寫入flash 0x80000~0x100000 的空
間:
mmc write 0x1000000 0x400 0x400
步驟 3 燒錄Kernel(Linux 內核):
將hi_kernel.bin 下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 hi_kernel.bin
把DDR 0x1000000~0x1400000 的內容(hi_kernel.bin)寫入flash 0x100000~0x500000 的空
間:
mmc write 0x1000000 0x800 0x2000
步驟 4 燒錄rootfs(使用ext4):
將rootfs.ext4 文件下載到0x1000000 開始的DDR 緩存:
tftp 0x1000000 rootfs.ext4
把DDR 0x1000000~0x7000000 的內容(rootfs.ext4)寫入flash
0x500000~(0x500000+0x6500000)的空間:
mmc write.ext4sp 0x1000000 0x2800 0x80000
mmc write.ext4sp 最后一個參數是根據分區大小計算出來的eMMC 塊數。
eMMC Flash 上可以使用ext4/cramfs/squashfs,cramfs 和squashfs 使用mmc write 命令燒錄。
----結束