0、ZYNQ外部開始条件
1.電力要件:
ステージ0 BootROMでは、PSとPLの両方をセーフモードでオンにする必要があります。図に示すよう
に、非セキュアモードのPSをオンにする必要があります。ステージ1 FSBLでは、PSとPLの両方をオンにする必要があります。 PLはこの段階で構成され、PSが構成プロセスを担当するため、電源がオンになります。
2.クロック要件:クロックが満たされている必要があります。
3.リセット要件:BootROMの実行に影響を与える外部リセットソースは主に2つあります。(パワーリセット信号、システムリセット信号)
4.起動ピン設定:プラットフォームを正しく起動するようにピンを構成する必要があります。
1、ステージ0:BootROM
1.電源投入後のリセット後、PS側が構成を開始します。JTAGを使用しない場合、ARMはオンチップBootROMでコードの実行を開始します。
2. BootROMのコードは、NAND、NOR、Quad-SPI、SD、およびPCAPの基本的なペリフェラルコントローラーを初期化して、ARMコアがこれらのペリフェラルにアクセスして使用できるようにします。
3.ステージ1のブートイメージ(ビンファイル:fsblアプリケーション、ビットファイル、およびアプリケーションを含む)をOCMにロードします。
4. PLの構成はBootROMで完了しておらず、BootROMはPLを構成する準備ができているだけであることに注意してください。
DDRなどの他の周辺機器は、フェーズ1以降で初期化されます。
PSのブートソースは、外部モードピンの高レベルと低レベルによって選択されます。つまり、BootROMは、外部構成ピンの設定に従って、さまざまな外部ストレージからステージ1のブートイメージをロードします。
非PORまたはPORの後、Zynqは次のように完了します
。1次の図に示すように、構成ピンをラッチします。2PLL
を初期化します(リセット時のラッチに従って初期化するかどうかを選択します)
3 APUを初期化します(2つのARMによる) CPU)構成)
4ROM CRCチェック
5ブート用のピン(Q-spi、NOR、SD、NANDなど)を初期化し、前の手順でラッチされた構成ピンに従って選択します。
6 PLパーツの電源がオンになっている場合は、PLを起動して、初期化が完了するのを待ちます。この時点でPLの電源がオンになっていない場合は、この手順をスキップ
してBootROMヘッダーの検索を開始します。有効なヘッダーが見つかった場合、FSBLはこのヘッダー(暗号化または非暗号化)に基づいて
ロードされます。8ロードされたFSBLはXIP(暗号化または非暗号化)である可能性があります。インプレースで実行するか、メモリ内で直接実行するか、DDRにロードします。ロードが完了すると、BootROMはタスクを完了し、制御をFSBLに転送します。
2、ステージ1:FSBL
1. FSBLは、BootROMの後に起動するブートプログラムです。BootROMからOCMにロードするか、リニアフラッシュで直接実行します。FSBLは、主に次のタスクを実行します。
1)XPS(またはvivado)の構成に従って、PS側の初期化を完了します。(MIO、時計、DDR)
2)ビットストリームファイルを使用してPLを構成します。
3)第2段階のブートプログラム(SSBL)またはベア実行プログラム(オペレーティングシステムがない場合)をDDRにロードします。
4)DDRにジャンプして、SSBLまたはベア実行プログラムを実行します。
注:FSBLは、SSBLにジャンプする前、またはプログラムを実行する前にMMUを有効にしません。これは、Linuxなどの多くのオペレーティングシステムが、起動時にMMUが無効になっていると想定しているためです。FSBL起動プロセス:
もう1つの注意点は、(fsbl.elf、PLビットストリームファイル、SSBL、またはベア実行アプリケーション)などをすべてビンミラーに編成する必要があることです。FSBLは、パーティションヘッダーテーブルをトラバースして、ビットストリームファイル、SSBL、またはベア実行プログラムの場所を見つけ、DDRをロードするか構成します。
3.ステージ1:SSBL(オペレーティングシステムがない場合は不要)
1.SSBLのブートプログラムはBootLoaderと呼ばれます。Zynqプラットフォームに組み込まれているLinuxはU-Bootであり、FSBLはU-Bootをメモリに導くのに役立ちます。
2. U-Bootには非常に強力な機能があり、多くのユーザーコマンド、メモリの読み取りと書き込み、フラッシュ、およびUSBデバイスを提供します。U-Bootは、シリアルポート、DDRコントローラーなど、Linuxカーネルが起動する前に必要なハードウェアの初期化を完了するのに役立ちます。
4. Linuxブートプロセス:
組み込みLinuxは、ソフトウェアの観点から、
BootLoader、
Linuxカーネル、
ファイルシステム、および
アプリケーションの4つの部分に分けることができます。
U-Bootは、Linuxカーネルのメモリと必要な周辺機器を初期化し、起動パラメータを設定します。zynqプラットフォームでは、デバイスツリーを使用してドライバー部分のパラメーターを転送するため、U-Bootはデバイスツリーイメージファイルもカーネルのメモリにコピーします。U-Bootからカーネルに渡される起動パラメータには、通常、デバイスツリーのアドレス、ファイルシステムのタイプとアドレスなどの情報が含まれています。次に、U-Bootはシステム制御をLinuxカーネルに転送します。
Linuxカーネルがシステムを制御した後、最初にシステムが初期化されます。カーネルのオペレーティング環境を開始することをお勧めします。Linuxカーネルが仮想アドレスから物理アドレスへのマッピングを完了した後、ドライブデバイスの初期化とマウントも行われます。zynqプラットフォームでは、デバイスドライバー情報はデバイスツリーによって送信されます。PLのIPコア用にドライバーが記述されている場合は、モジュラー方式も使用でき、Linuxの起動後にデバイスをマウントできます。
Linuxカーネルは、U-Bootから渡されたパラメーター情報に従って、マウントされたファイルシステムのフォーマットとマウントポイントを選択します。最後に、Linuxカーネルはinit関数を実行します。これは、カーネルブートの終了であり、システム内のすべてのプロセスの開始点です。アプリケーションはファイルシステムに配置されます。
元のリンク:https://www.sohu.com/a/343257597_467791
- - - - - - - - - - - - - - - - - - -分割線 - - - - - - -------------------------------------------------- -----------------------------
FSBLタイムテスト:
ソフトリスタートが始まります:
ステータスの終わりまで= ps7_init(); ----------------約107ms
DDRInitCheckの終わりまで------約1ms
PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); ----------約0ms
HandoffAddress = LoadBootImage();に終了----------約676ms
FsblHandoff(HandoffAddress);関数に入った後、FsblHandoffExit(FsblStartAddr);を実行してfsblメインプログラムを直接終了します-----約2ms
上記の手順の最後からアプリケーションに入るまで------約721ms(FSBLがアプリケーションをOCMにロードする時間になるはずです)
∴アプリケーションの最初までソフトリスタート:1.507秒かかります。
fsbl.h:
#define EFUSE_STATUS_REG (0xF800D010) /**< Efuse Status Register */
#define EFUSE_STATUS_RSA_ENABLE_MASK (0x400) /**< Status of RSA enable */
eFuse書き込み保護(2ビット)=ビット[8:9]
OCM ROM 128KBCRCイネーブル=ビット[10]
RSA Authenticaiton Enable = Bit [11]
DFTJTAG無効=ビット[12]
DFTモード無効=ビット[13]
ビット値:0 =プログラムされていません。1 =プログラム済み