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