uboot は mmc パーティションにカーネルを書き込みます。

uboot は mmc パーティションにカーネルを書き込みます。

i.MX6ボード上のeMMCストレージのmmc hwパーティションにU-Bootを含むLinuxカーネルを作成したいと思います。

TX6UL U-Boot > mmc info
Device: FSL_SDHC
Manufacturer ID: 11
OEM: 100
Name: 004G6 
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 8 MiB
Bus Width: 4-bit
Erase Group Size: 4 MiB
HC WP Group Size: 4 MiB
User Capacity: 8 MiB WRREL
Boot Capacity: 2 MiB ENH
RPMB Capacity: 512 KiB ENH
GP1 Capacity: 8 MiB WRREL
GP2 Capacity: 1.8 GiB ENH WRREL

通常のhwpartition GP1はカーネルで使用するように設計されています。通常、次のコマンドを使用してイメージを作成します(tftpサーバーが実行されており、イメージがuImage_txulファイルでホストされていると仮定)。

TX6UL U-Boot > tftp ${loadaddr} uImage_txul
TX6UL U-Boot > mmc write ${loadaddr} 0xXXXX 0xYYYY

hwpartition GP1に画像を書き込むために必要なアドレス0xXXXX 0xYYYYを見つける方法は?

答え1

mmcのフラッシュu-bootへの短い答えはおそらく

tftp ${loadaddr} u-boot.bin
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fileaddr} 0 800
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0

しかし、mmcをどのように設定するかによって異なります。このコマンドは、$ {fileaddr}の1048576(0x800 * 512)バイトをアドレス0から始めてmmcに書き込みます。

mmcを書くためのより長く完全な答えです。製造元が推奨する方法でMMCを設定するとします。

| u-boot[0] | DT[0x680] | Kernel[0x800] | FS[0x8000] |

必要なファイルがすでにあるとします。そうでない場合は、Yoctoを使用してそのファイルをビルドできます。必要に応じて詳細をお知らせします。

u-boot.bin, imx6ul-txul-0011.dtb, uImage, rootfs.tar.bz2, modules.tgz

また、少なくともu-bootをサイドロードしたと仮定すると、何とか実行しているようです。

まずmmcを分割する必要があります。 u-bootではこれを行うことができないため、ネットワークブートを設定する必要があります。ファイルを含むtftpサーバーがすでに存在しているようです。また、nfsサーバーを設定し、そこからrootfsを抽出する必要があります。 / nfsrootにnfsサーバーファイルシステムを設定したとします。ネットワークブートを有効にするには、次の変数を設定します。

env default -a
env set bootdelay 3
env set serverip 192.168.1.99
env set nfs_server 192.168.1.99
env set ipaddr 192.168.1.90
env set netmask 255.255.255.0
env set bootfile uImage
env set nfsroot /nfsroot
env set boot_mode net
env set default_bootargs setenv bootargs init=/bin/sh console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save

Linuxプロンプトで起動し、そこで実行してください。

fdisk /dev/mmcblk0

パーティションを次のように設定します

Partition   Start Cyl   End Cyl     Start Sector    End Sector  Type
1           33          512         2048            32767       0x0c
2           513         -           32768           -           0x83

u-bootに戻すと、パーティションを見ることができます。

> mmc part

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

Part    Start Sector    Num Sectors     UUID            Type
  1     2048            30720           00ee66ee-01     0c
  2     32768           7700480         00ee66ee-02     83

パーティション1はセクター2048(0x800)から始まります。パーティション2は32768(0x8000)から始まります。今、この数字がどこから来たのかを知る必要があります。

上記のコマンドを使用してu-boot.binを更新しましたが、デバイステーブル(DT)も上書きされますのでご注意ください。したがって、DTを更新するには、次のようにします。

tftp ${fdtaddr} imx6ul-txul-0011.dtb
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fdtaddr} 0x680 80
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0

これらのコマンドを使用して環境変数を設定することもできます。${fdtsave}、その場合は使用できます

run fdtsave

パーティションを更新するには、Linuxシステムでディスクイメージを作成してからTX6ULにtftpし、mmc writeコマンドを使用して焼く必要があります。最初のパーティションをイメージするには、Linuxシステムで次のコマンドを使用できます。

dd if=/dev/zero of=part1.image bs=15728640 count=0 seek=1
/sbin/mkfs -t vfat part1.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part1.image /mnt/mkpart
cp uImage /mnt/mkpart/uImage
sudo umount /mnt/mkpart

その後、u-bootで

tftp ${loadaddr} part1.image
mmc write ${fileaddr} 800 7800

u-bootを使ってパーティションの内容を見ることができます

> fatls mmc 0:1

  3676512   uimage 

1 file(s), 0 dir(s)

同様に、2番目のパーティションの場合は、Linuxボックスで次のようなものを使用します。

dd if=/dev/zero of=part2.image bs=64M count=0 seek=1
/sbin/mkfs -t ext3 part2.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part2.image /mnt/mkpart
sudo tar -C /mnt/mkpart -xjf rootfs.tar.bz2
sudo tar -C /mnt/mkpart -xzf modules.tgz
ln -s sbin/init /mnt/mkpart/linuxrc
sudo umount /mnt/mkpart

その後、u-bootで

tftp ${loadaddr} part2.image
setexpr fs ${filesize} + 1ff
setexpr fs ${fs} / 200
mmc write ${fileaddr} 8000 ${fs}

u-bootで2番目のパーティションの内容を表示するには

> ext2ls mmc 0:2

新しいパーティションから起動するには、起動パラメータでinitを再び一般に設定します。

env set default_bootargs setenv bootargs init=/linuxrc console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save

そして、新しいファイルシステムを指すようにパーティションIDまたはenv変数を変更することを忘れないでください。この場合

env set rootpart_uuid 00ee66ee-02
save

お役に立てば幸いです。

関連情報