web-dev-qa-db-ja.com

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

U-Bootを使用してLinuxカーネルをi.MX6ボード上のeMMCストレージのmmc hwpartitionに書き込みたい:

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-serverが実行中で、イメージをファイルuImage_txulとしてホストしていると想定しています)。

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

画像をハードウェアパーティションGP1に書き込むために必要なアドレス0xXXXX 0xYYYYを見つける方法は?

4
Achim

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の設定方法によって異なります。このコマンドは、1048576(0x800 * 512)バイトを$ {fileaddr}からアドレス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は0x8000である32768から始まります。これで、これらの数値がどこから来たかがわかります。

上記のコマンドで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書き込みコマンドでそれらを書き込む必要があります。最初のパーティションのイメージを作成するには、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 set rootpart_uuid 00ee66ee-02
save

お役に立てれば。

6
bob2