Linux

如何使用 Uboot 從 EMMC 的通用分區或引導分區載入文件

  • August 22, 2019

UBoot 是否能夠從 EMMC 的通用分區或引導分區通過 fatload/ext4load 引導?我能夠顯示來自使用者區域的文件,而不是作為硬體分區創建的分區。可以使用 UBoot 的“mmc hwpartition”命令創建這些分區。奇怪的是,UBoot 可以創建這些分區,但似乎無法使用它們。我正在使用Xilinx 的 UBoot的最新版本(2016.4) ,它基於UBoot

使用 UBoot 的“mmc info”命令,UBoot 肯定可以看到 Boot Partition 和 General Purpose Partitions (GP 1/2/3/4):

zynq-uboot> mmc info
Device: sdhci@e0100000
Manufacturer ID: fe
OEM: 14e
Name: MMC04
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.4.1
High Capacity: Yes
Capacity: 2.7 GiB
Bus Width: 4-bit
Erase Group Size: 4 MiB
HC WP Group Size: 4 MiB
User Capacity: 2.7 GiB
Boot Capacity: 16 MiB ENH
RPMB Capacity: 128 KiB ENH
GP1 Capacity: 128 MiB
GP2 Capacity: 64 MiB
GP3 Capacity: 128 MiB
GP4 Capacity: 512 MiB

通常,我可以使用 UBoot 命令:fatload/fatls 或 ext4load/ext4ls 來根據文件系統類型顯示給定分區的內容。

fatls 命令的工作範例 - 請注意,這顯示了使用者區域的內容(上面的大小為 2.7GB)。

zynq-uboot> fatls mmc 0:1
   17488   devicetree.dtb
  962589   fpga.bit
      54   uenv.txt
 6709360   uimage
 1555344   boot.bin
      33   image.chk
83493724   image.tgz

7 file(s), 0 dir(s)

GP 分區,當掛載在 linux 中時,包含我的根文件系統、核心映像等。我希望能夠通過 fatload/ext4load 命令從 GP 分區啟動,並將使用者區域用於儲存我的啟動文件的其他目的。

我找到了關於這個主題的其他文章,但是,他們似乎還沒有得到回答:https ://lists.denx.de/pipermail/u-boot/2014-July/184731.html

任何幫助,將不勝感激!

是的,您可以從 uboot 訪問 GP 分區。

如此處所述http://u-boot.10912.n7.nabble.com/How-to-access-GP-partitions-from-uboot-2015-04-td212394.html您可以使用“mmc partconf”命令的最後一個參數告訴 eMMC 帶出不同的部分(例如 GP 而不是使用者區)。執行該命令並執行“mmc read”命令後,您會注意到您正在從不同的區域讀取。

不過要小心。至少在我的 u-boot 版本(2017)中,u-boot 不知道必須重新讀取分區表,並且出於優化目的,它不會。我不得不在 blk_get_device_by_str 中的 part.c 中做一個小更新檔來強制 part_init 每次都執行。然後,當您執行“mmc 部分”時,您應該也會看到 GP 分區表,並且可以像往常一樣進行任何文件操作。不要忘記執行“mmc rescan”或任何 eMMC 重置都會失去 GP 狀態,您必須再次切換回 GP 才能讀取它。

我們已經設法從 U-Boot 訪問 GP 分區。由於不支持 MMC 5.1 版,U-boot 2017 無法辨識我們的 GP 分區(最後支持 5.0,因此出於某種原因回退到 4.0 版)在我們的 U-Boot 程式碼中啟用 5.1 版後,它被辨識:

=> mmc info
Device: OMAP SD/MMC
Manufacturer ID: 11
OEM: 100
Name: 008G3 
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.1
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 4 MiB
HC WP Group Size: 4 MiB
User Capacity: 7.3 GiB
Boot Capacity: 8 MiB ENH
RPMB Capacity: 4 MiB ENH
GP1 Capacity: 4 MiB ENH WRREL
GP2 Capacity: 4 MiB ENH WRREL

現在從 U-Boot(環境或控制台)中,您可以執行以下操作:(注意;我們的 eMMC 連接為 mmc 設備 0

mmc dev 0 #select device 0
mmc partconf-partenable 0; #store the active bootpartition
mmc partconf 0 1 7 4; #configure device 0 (first parameter) to use User partiton (the 7) to GP1 (first GP) (4)
mmc partconf 0 1 7 5; #configure device 0 (first) to use userpartition second (GP2) (parameter 5)
#Now display partition (which won't work, explained below)
=> mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors UUID        Type
bad MBR sector signature 0x0000
=>
#now load a file with filename from the ext4 filesystem (see below)
=> ext4load mmc 0:0 0x80000000 FILE_NAME.txt
15 bytes read in 2 ms (6.8 KiB/s)
#restore active partition
=> mmc partconf 0 1 ${boot_part_enabled} 1 #restore the boot_partition (this parameter boot_part_enabled is set from 'mmc partconf-partenable 0' at the beginning)

為了做到這一點,我們已經預先格式化並從 linux 創建了一次 GP 分區:

mkfs.ext4 /dev/mmcblk1gp1
mount /dev/mmcblk1gp1 /media/gp1
echo "SOMELINEOFTEXT" > /media/gp1/FILE_NAME.txt
reboot

現在你可以從 u-boot 讀取它了

引用自:https://unix.stackexchange.com/questions/354157