• 検索結果がありません。

ダウンローダの動作フロー

ドキュメント内 RZ/A1Hグループ (ページ 33-36)

5. ソフトウェア説明

5.10 ダウンローダの動作フロー

ダウンローダは、eMMCブート用のローダプログラムおよびアプリケーションプログラムをeMMCデバイ スに対して書き込むためのプログラムです。この章では、ダウンローダの動作フローについて説明します。

5.10.1

ダウンローダ(全体)の動作フロー

図5.11にダウンローダ(全体)の動作フローを示します。DS-5にて、GENMAIボードとULINK2とのエミュ レータ接続が確立された後、ダウンローダの起動用のDS-5スクリプト(RZ_A1H_emmc_loader_armcc.ds、ま たは、RZ_A1H_emmc_sample_armcc.ds)を実行した場合、RZ/A1Hの大容量内蔵RAM上にダウンローダのプ ログラムが転送され、ダウンローダのエントリポイントであるH’2002_0000番地より実行され、ダウンロー ダの処理が開始します。

ダウンローダ開始

終了

ローダプログラムの書き込みメイン処理 FMTOOL_LoaderMain関数

・デバイスへのダウンロードが完了すると、prg_complete関数がコールされます。

事前にprg_complete関数にブレイクポイントを設定しているため、prg_complete関数 のコール時にブレイクされ、ダウンローダ処理の終了を検出します。

書き込み対象のプログラム種別?

ローダプログラムの場合

アプリケーションプログラムの場合 スタックポインタの設定

CP15システム制御レジスタの設定 周波数制御レジスタ(FRQCR)変更

アプリケーションプログラムの書き込みメイン処理 FMTOOL_AppMain関数

ダウンローダ処理完了 prg_complete関数

・ダウンローダのエントリポイントである H’2002_0000番地より、処理を開始します。

・EXTALから13.33[MHz]が入力される前提で下記のクロック設定を行います。

Iφ = 400[MHz]、Gφ = 266.67MHz]、Bφ = 133.33[MHz]、P1φ = 66.67[MHz]  

  P0φ = 33.33[MHz]、CKIO = 66.67[MHz]

・スーパバイザ(SVC)モードのスタックポインタを設定します。

・Iキャッシュを無効に設定

・Dキャッシュを無効に設定

・MMUを無効に設定

・書き込み対象がローダプログラムかアプリケーションプログラムかを判断します。

ローダプログラムの場合、FMTOOL_LoaderMain関数をコールし、

アプリケーションプログラムの場合、FMTOOL_AppMain関数がコールされます。

ローダプログラムの書き込み FMTOOL_LoaderMain関数 eMMCデバイスのアクセス終了

close_emmc関数 ダウンローダの初期化

FMTOOL_Init関数

・set_mmc_boot_bus_width関数をコールして、Boot Operation時のデータバス幅を4ビットに設定します。

 また、set_mmc_boot_partition関数をコールして、Boot Operation時のBoot Partitionを設定します。

 最後に、MMCドライバのce_unmount関数とce_finalize関数をコールして、

 MMCドライバの処理を終了します。

・open_emmc関数とget_mmc_csd_register関数をコールして、

ダウンローダの初期化を行います。

図5.11 ダウンローダ(全体)の動作フロー

R01AN1978JJ0081 Rev.0.81 Page 34 of 46 2016.09.16

5.10.2

ローダプログラムの書き込みフロー

図5.12にローダプログラムの書き込み時のダウンローダ動作フローを示します。

ローダプログラム書き込み処理の開始

(FMTOOL_LoaderMain関数)

終了 全てのローダプログラムの

書き込み完了?

Yes No

ライトするローダプログラムの個数 ← 4 ファイルのオープン

(fopen関数)

ファイルのクローズ

(fclose関数)

チェックサムブロック(512バイト)の生成

(MakeChecksumBlock関数)

eMMCデバイスに対して チェックサムブロック(512バイト)および ローダプログラム(28Kバイト)の書き込み

(WriteLoader関数)

チェックサムブロック(512バイト)のベリファイ

(VerifyChecksumBlock関数)

・引数argv[]より、fopen関数に使用するファイルパス名を生成します。

・ホストPC上に存在する書き込み対象のバイナリファイルをオープンします。

予備領域にも ローダプログラムを

書き込む?

Yes

ライトするローダプログラムの個数 ← 1 No

・ローダプログラムのファイルサイズを取得します。

・ローダプログラム専用バッファ(g_LoaderProgram_Buffer[]のデータ を使用し、

ローダプログラムのチェックサムブロック(512バイト)のデータを生成し、

チェックサムブロック専用バッファ(g_CheckSum_Block[])に格納します。

 

プログラムデータ領域のベリファイ

(VerifyData関数)

次の書き込み先のセクタ番号を計算

(セクタ番号 ← セクタ番号 +57)

書き込み先セクタ番号の設定

(セクタ番号 ← 0)

ファイルパスの連結 (strcat関数)

ローダプログラムの読み出し

(ReadFileData関数)

・ホストPC上に存在するローダプログラムのバイナリファイルから  データをリードして、ローダプログラムを専用バッファ

(g_LoaderProgram_Buffer[])に格納します。

ローダプログラムのファイルサイズの取得

(GetFileSize関数)

・書き込み対象のバイナリファイルをクローズします。

書き込み先のパーティション番号の取得

(パーティション番号 ← argv[5])

・チェックサムブロック専用バッファ(g_CheckSum_Block[])、ローダプログラム専用  バッファ(g_LoaderProram_Buffer[])の先頭アドレス、セクタ番号をWriteLoader関数  に渡し、eMMCデバイスにデータを格納します。

・eMMCデバイスに格納されているチェックサムブロックを読み出し、

チェックサムブロック専用バッファ(g_CheckSum_Block[])とベリファイを行います。

・eMMCデバイスに格納されているローダプログラムを読み出し、

ローダプログラム専用バッファ(g_LoaderProgram_Buffer[])とベリファイを行います。

・スクリプトより指定(argv[5])された書き込み先のパーティション番号 を取得します。(サンプルコードでは1(Boot partition 1)を指定しています。)

・ローダプログラムの書き込み先のセクタ番号は固定のため、

セクタ番号を0に設定。

(引数argv[6]で指定したセクタ番号は無視)

・チェックサムブロック1セクタ(512バイト)分、ローダプログラム56セクタ(28Kバイト)

分のセクタ番号を加算し、次の書き込み先のセクタ番号を計算します。

パーティションの選択

(set_mmc_partition_access関数)

・ローダプログラムを書き込むパーティションを選択します。

・ローダプログラムを予備領域(#1, #2, #3)に書き込む場合、書き込み回数を4にし、

 予備領域に書き込まない場合(#0のみ)、書き込み回数を1回に設定します。

ライトするローダプログラムの個数 ← ライトするローダプログラムの個数 - 1

図5.12 ローダプログラムの書き込み時のダウンローダ動作フロー

5.10.3

アプリケーションプログラムの書き込みフロー

図5.13にアプリケーションプログラム書き込み時のダウンローダ動作フローを示します。

アプリケーションプログラム書き込み処理の開始

(FMTOOL_AppMain関数)

終了 全ての書き込み完了?

Yes No

ファイルのオープン

(fopen関数)

ファイルのクローズ

(fclose関数)

アプリケーションプログラムのデータ読み込み

( ReadFileData関数 )

・ホストPC上にあるアプリケーションプログラムのバイナリファイルから 32セクタ(16Kバイト)分のデータをリードし、アプリケーション  プログラム専用バッファに格納します。

アプリケーションプログラムの書き込み

(Write_App関数)

次にライトするセクタ番号を計算

(セクタ番号 ← セクタ番号 + 32)

アプリケーションプログラム書き込み先のセクタ番号の取得

(セクタ番号 ← argv[6] ) ファイルパスの連結

(strcat関数)

アプリケーションプログラム書き込み先の パーティション番号の取得

(パーティション番号 ←argv[5])

パーティションの選択

(set_mmc_partition_access関数)

ファイルサイズの取得

(GetFileSize関数)

アプリケーションプログラムデータのベリファイ

(VerifyData関数)

・eMMCデバイスに対して、バッファに格納されたアプリケーションプログラムの データを書き込みセクタ数分書き込みを行います。

・書き込み対象のバイナリファイルをオープンします。

・アプリケーションプログラムのファイルサイズを取得します。

・書き込み対象のバイナリファイルをクローズします。

・eMMCデバイスに格納されているアプリケーションプログラムを読み出し、

アプリケーションプログラム専用バッファのデータとベリファイします。

・アプリケーションプログラムの書き込み先パーティションを選択します。

・スクリプトにより指定(argv[5])された書き込み先のパーティション番号 を取得します。(サンプルコードでは2(Boot partition 2)を指定しています。)

・スクリプトにより指定(argv[6])された書き込み先書き込み先のセクタ番号 を取得します。(サンプルコードでは228を指定しています。)

ファイルサイズ ← ファイルサイズ – (書き込みセクタ×512) ・書き込み完了を判別するため、ファイルサイズから書き込みが完了した  バイト数を減算します。

ファイルサイズの大きさは 32セクタ(16Kバイト)以上?

書き込みセクタ数 ← 残りのファイルサイズ分のセクタ数 Yes

No

書き込みセクタ数 ← 32

・ファイルサイズが32セクタ(16Kバイト)以上の場合、書き込みセクタ数を32とします。

 ファイルサイズが32セクタ未満の場合、残りファイルサイズの書き込みに必要な  セクタ数を書き込みセクタ数に設定します。

・引数argv[]より、fopen関数に使用するファイルパス名を生成します。

図5.13 アプリケーションプログラム書き込み時のダウンローダ動作フロー

R01AN1978JJ0081 Rev.0.81 Page 36 of 46 2016.09.16

ドキュメント内 RZ/A1Hグループ (ページ 33-36)

関連したドキュメント