Linux システムのプログラミング演習

システムプログラミングの練習

mfgtool プログラミング ツールとその動作原理は、Linux システム プログラミングの予備調査の記事で紹介されています. 以下では、I.MX6U-ALPHA EMMC 開発ボードをプラットフォームとして使用して、NXP 公式システムと自作システムをプログラミングする方法を紹介します.

1. NXP公式システムを焼く

NXP 公式システムを I.MX6U-ALPHA EMMC 開発ボード (512MB DDR3 + 8G EMMC) に書き込みます。具体的な手順は次のとおりです。

  • USBを接続し、コードスイッチをUSBダウンロードモードにダイヤルします
  • TF カードを取り出し、開発ボードのリセット ボタンを押します。
  • MobaXterm シリアル ポート アシスタント ターミナルを開く
  • mfgtool2-yocto-mx-evk-emmc.vbs をダブルクリックします。
  • [スタート] ボタンをクリックして、NXP 公式システムをプログラムします。

焼き方は以下の通り
ここに画像の説明を挿入

MobaXterm シリアル ポート アシスタント ターミナルに表示される書き込みプロセス

ここに画像の説明を挿入

プログラミングが完了したら、Stop ボタンをクリックしてプログラミングを停止し、Exit ボタンをクリックして終了します。

ここに画像の説明を挿入

USBケーブルを抜き、ディップスイッチをEMMC起動モードにすると、再起動後EMMCから起動します

ここに画像の説明を挿入

このとき、起動後のシステムはI.MX6ULL EVK開発ボード用のNXP製で、ユーザー名を入力する必要があり、ユーザー名は「root」で、パスワードはありません。

2.自家製システムを焼きます

自作システムを I.MX6U-ALPHA EMMC 開発ボード (512MB DDR3 + 8G EMMC) にプログラムします。自作のuboot、kernel、.dtb、rootfs(圧縮パッケージ)の4つのプログラミングファイルを用意し、リネーム

##根文件系统 rootfs 打包
cd rootfs/ 
tar -vcjf rootfs.tar.bz2 *

ここに画像の説明を挿入

⏩ 名前を変更した uboot、kernel、および .dtb ファイルをファームウェア ディレクトリにコピーし、元のファイルを置き換えます
⏩ 名前を変更した 4 つのファイルすべてをファイル ディレクトリにコピーします
⏩ mfgtool2-yocto-mx-evk-emmc.vbs ファイルをダブルクリックして開きます書き込みソフトウェア、[開始] ボタンをクリックして書き込みます
ここに画像の説明を挿入

プログラミングが完了したら、EMMC からシステムを起動します。下の図に示すように、自作システムが正常にプログラミングされていることがわかります。
ここに画像の説明を挿入

3.プログラミングツールの修正

3.1 Mfgtool の変換

上記はNXP公式システムを自作システムに置き換えてプログラミングを完成させるものですが、以下ではMfgToolツールを改造して独自開発ボードに対応させる方法を紹介します。主に次の3つの側面からMfgToolを変換します

⏩ システム ファイルの名前を決定する: さまざまな製品と互換性のあるシステム ファイルの名前を決定する
ここに画像の説明を挿入
⏩ 新しい .vbs ファイルを作成する: mfgtool2-yocto-mx-evk-emmc.vbs ファイルをコピーし、並べ替えます必要に応じて、mfgtool2-andyxi-emmc.vbs という名前を付けます。

⏩ OS ファームウェア フォルダー内の ucl2.xml ファイルを変更します。次のように変更します。

<!-- 修改后的 ucl2.xml 文件 -->
<UCL>
  <CFG>
    <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
    <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
    <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
  </CFG>
	
  <!-- 向 EMMC 烧写系统 -->
  <LIST name="eMMC" desc="Choose eMMC as media">
    <CMD state="BootStrap" type="boot" body="BootStrap" file
    ="firmware/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">Loading Uboot</CMD>
    <CMD state="BootStrap" type="load" file="firmware/zImage-andyxi-emmc" address="0x80800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" 
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
    <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD>
    <CMD state="BootStrap" type="load" file="firmware/imx6ull-andyxi-emmc.dtb" address="0x83000000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6ULL">Loading device tree.</CMD>
    <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

    <!-- create partition -->
    <CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>
    <CMD state="Updater" type="push" body="$ tar xf $FILE ">Partitioning...</CMD>
    <CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>

    <!-- burn uboot -->
    <CMD state="Updater" type="push" body="$ dd if=/dev/zero
    of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD>

    <!-- access boot partition -->
    <CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">
    access boot partition 1</CMD>
    <CMD state="Updater" type="push" body="send" file="files/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">
    Sending u-boot.bin</CMD>
    <CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">
    write U-Boot to sd card</CMD>
    <CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> 
    re-enable read-only access</CMD>
    <CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">
    enable boot partion 1 to boot</CMD>

    <!-- create fat partition -->
    <CMD state="Updater" type="push" body="$ while [ ! -e
    /dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD>
    <CMD state="Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">
    Formatting rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/>
    <CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>

    <!-- burn zImage -->
    <CMD state="Updater" type="push" body="send" file="files/zImage-andyxi-emmc">
    Sending kernel zImage</CMD>
    <CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">
    write kernel image to sd card</CMD>

    <!-- burn dtb -->
    <CMD state="Updater" type="push" body="send" file="files/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
    Sending Device Tree file</CMD>
    <CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
    write device tree to sd card</CMD>
    <CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">
    Unmounting vfat partition</CMD>

    <!-- burn rootfs -->
    <CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">
    Formatting rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/>
    <CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
    <CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk%mmc%p2" 
    file="files/rootfs-andyxi-emmc.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD>
    <CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
    <CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
  </LIST>
</UCL>

3.2 燃焼試験

MfgTool ツールを変更した後、プログラミング テストを実行できます.自作の uboot、linux カーネル、および .dtb ファイルをファームウェア ディレクトリにコピーし、元のファイルを置き換えます.4 つのファイルすべてを files ディレクトリにコピーします.

mfgtool2-andyxi-emmc.vbs ファイルをダブルクリックしてプログラミング ソフトウェアを開き、[開始] ボタンをクリックしてプログラミングします。プログラミングが完了したら、DIP スイッチを EMMC スタートアップに設定し、開発ボードを再起動すると、システムの起動情報は次のようになります。
ここに画像の説明を挿入

開発ボードは「Starting kernel ...」でスタックし、カーネルの起動に失敗します。カーネルの起動に失敗する問題を解決する方法を次に示します。

3.3 カーネルの起動エラーを解決する

uboot によって出力されるログ情報を注意深く観察すると、次の図に示すように 2 行の情報が見つかります。
ここに画像の説明を挿入

デバイスツリーファイルの読み込み時にエラーが発生したことがわかります。uboot を再起動し、コマンド ライン モードに入り、次のコマンドを入力して、EMMC のパーティション 1 にデバイス ツリー ファイルがあるかどうかを確認します。

mmc dev 1 	//切换到EMMC
ls mmc 1:1 	//输出EMMC1分区1中的所有文件

ここに画像の説明を挿入

この時点で EMMC のパーティション 1 にデバイス ツリー ファイルがあることがわかりますが、名前が異なるため、imx6ull-14x14-evk.dtb を読み取ると、間違いなくエラーになります。このエラーの原因は、uboot のデフォルトのデバイス ツリー名が imx6ull-14x14-evk.dtb であるためです。2 つの解決策があります。

⏩ bootcmd 環境変数の値をリセットします。uboot のコマンド ライン モードで、2 つの環境変数 bootcmd と bootargs の値をリセットします。

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000
			    imx6ull-andyxi-emmc.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv\

⏩ uboot ソース コードの修正: 上記のメソッドは、再プログラムされるたびに再度設定する必要があります. 次のメソッドは、一度だけ設定する必要があります. uboot ソース コードの include/configs/mx6ull_andyxi_emmc.h ファイルで、次の内容を見つけます.マクロ CONFIG_EXTRA_ENV_SETTINGS:

"findfdt="\
  "if test $fdt_file = undefined; then " \
    "if test $board_name = EVK && test $board_rev = 9X9; then " \
	"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
    "if test $board_name = EVK && test $board_rev = 14X14; then " \
	"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
    "if test $fdt_file = undefined; then " \
	"echo WARNING: Could not determine dtb to use; fi; " \
  "fi;\0" \

findfdt はデバイス ツリー ファイルの名前を決定するために使用される環境変数で、fdt_file 環境変数はデバイス ツリー ファイルの名前を保持します。上記のコードの 2 つのデバイス ツリーは、NXP の公式開発ボードで使用されています。そのため、findfdt の値を次のように変更します。

"findfdt="\
  "if test $fdt_file = undefined; then " \
    "setenv fdt_file imx6ull-andyxi-emmc.dtb; " \
  "fi;\0" \

変更後に uboot を再コンパイルし、新しい uboot を開発ボードに焼き付けてテストを再開すると、カーネルが正常に起動します。この時点で、自作システムのプログラミングが完了し、テストが成功し、ネットワークなしで開発ボードを正常に起動できます

公式アカウントをフォローして「mfgtool」を送るとmfgtool関連の情報をゲット

おすすめ

転載: blog.csdn.net/Chuangke_Andy/article/details/126831995