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
お役に立てば幸いです。