﻿<<<< HWLib Example Program >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

-- 情報 ----------------------------------------------------------------
ファイル名：		sample_mmu.c
作成日：			2014/03/03
更新日：			2014/04/21	"u-boot-spl.axf を v13.1 で生成したファイルに変更"
更新日：			2014/07/29	"SoC EDS 14.0 用に Makefile を修正"
更新日：			2014/08/18	"誤植訂正、操作説明の表示を追加"
更新日：			2015/06/25	"SoC EDS 15.0 用の HWLib に対応。文字コードを UTF-8 に変更 (Linux の日本語表示)。
						 		割込みログの実装を改善 (割込み利用の場合のみ)"
更新日：			2016/03/14	"デバッグコンフィギュレーション設定変更（レジスタ定義読み込み）"
更新日：			2016/03/29	"デバッグコンフィギュレーション設定変更（レジスタ定義読み込み） ファイルの修正"
更新日：			2016/07/08	"マルチボード対応（Helio/Atlas/Sodia/C5SoCDevKit）"
更新日：			2017/05/22	"Arria 10 Soc DevKit 対応, DS-5 レジスタビュー表示にも対応"
更新日：			2018/07/02	"All in One ベアメタル・アプリケーション v17.1 への対応を実施"
更新日：			2019/02/25	"All in One ベアメタル・アプリケーション v18.1 への対応を実施"

確認HWLibバージョン：	13.1 (SoC EDS 13.1)
確認HWLibバージョン：	14.0 (SoC EDS 14.0 patch0.02)
確認HWLibバージョン：	15.0 (SoC EDS Version: 15.0.1, Build: 60)
確認HWLibバージョン：	15.1 (SoC EDS Version: 15.1.1, Build: 60)
確認HWLibバージョン：	16.0 (SoC EDS Version: 16.0, Build: 211)
確認HWLibバージョン：	16.1 (SoC EDS Version: 16.1.0, Build: 196)
確認HWLibバージョン：	17.0 (SoC EDS Version: 17.0, Build: 595)
確認HWLibバージョン：	17.1 (SoC EDS Version: 17.1, Build: 585)
確認HWLibバージョン：	18.1 (SoC EDS Version: 18.1, Build: 625)

※ 本 HWLib Example を利用する場合には、プロジェクト 「ALT-HWLib-All-In-One_v18.1_r○」 をインポートし、
　 TOP ディレクトリーに本 HWLib Example ファイルをコピーしてコンパイル対象とすることで、
　 Makefile を修正すること無く各種評価ができるようになっています（FPGA のコンフィギュレーションデータ等を共有するため）。

※ SoC EDS v13.1 以前のツールを利用する場合には、本サンプルに含まれる Makefile に下記変更を加えて下さい。
　【変更前】CROSS_COMPILE := arm-altera-eabi-　　... SoC EDS v14.0 以降を利用の場合
　【変更後】CROSS_COMPILE := arm-none-eabi-　　..... SoC EDS v13.1 以前を利用の場合
　 リンカスクリプト（cycloneV-dk-ram-hosted.ld）内に記述されるラベル（2 カ所）にも変更が必要な場合があります。
　【変更前】__cs3_reset_cycloneV_dk_ram
　【変更後】__cs3_reset_generic
　 他、HWLib のバージョン違いにより一部の API でコンパイルエラーが発生する場合があります。
　 その場合は、適宜サンプルコードを変更してご利用下さい。

**************************************************************************************
* Copyright (C) 2013-2019 MACNICA,Inc. All Rights Reserved.                          *
*   This software is licensed "AS IS".                                               *
*   Please perform use of this software by a user's own responsibility and expense.  *
*   It cannot guarantee in the maker side about the damage which occurred by the ab- *
*   ility not to use or use this software, and all damage that occurred secondarily. *
**************************************************************************************

※ 本サンプルでは、DS-5 Intel SoC FPGA Edition (Altera Edition) のレジスタ・ビューには
　 標準では表示されない下記ペリフェラルのレジスタ表示に対応しています。
　  * DMA Controller（DMA-330）
　  * L2Cache Controller（L2C-310）
　  * Cortex-A9 MPCore 内蔵 SCU（Snoop Control Unit）
　  * Cortex-A9 MPCore 内蔵 Interrupt Controller（GIC: PL-390）
　  * Cortex-A9 MPCore 内蔵 Timer（Global Timer, Private Timer, Watchdog Timer）
　
　レジスタ・ビューのカスタマイズ方法は、マクニカオンラインサービスの技術情報をご参照ください。
　『DS-5 活用テクニック ～レジスタ・ビュー［2/3］レジスタ定義の自作』
　 https://service.macnica.co.jp/library/115085
　■マクニカオンラインサービス TOP ページ
　 https://service.macnica.co.jp/

※ config.mk ファイル内のシンボル定義を変更することで、ターゲットボードの選択が可能です。
　 下記から 1 行だけを選択します（その他の行は # でコメントアウトします）。
　#######################
　# Select Target Board #
　#######################
　#TARGET_BOARD := helio		← Mpression Helio SoC Evaluation Kit 
　#TARGET_BOARD := atlas		← Atlas-SoC / DE0-Nano-SoC
　#TARGET_BOARD := sodia		← Mpression Sodia Evaluation Board 
　#TARGET_BOARD := c5socdk		← Cyclone V SoC Development Kit 
　#TARGET_BOARD := a10socdk		← Arria 10 SoC Development Kit 
　TARGET_BOARD := de10nano		← DE10-Nano

※ 本サンプルでは、sample_app.c 内の main() 関数で cpu0_init() を呼び出さないようにするため、
　 config.mk ファイル内の USED_CPU0_INIT 定義を 0 に設定してビルドしてください
　（USED_CPU0_INIT := 1 の行は # でコメントアウトします）。
　#########################################
　# cpu0_init() call                      #
　#  0:Not Use - MMU Test, Cache Test     #
　#  1:Use - Other test                   #
　#########################################
　USED_CPU0_INIT := 0		
　#USED_CPU0_INIT := 1


※ 本サンプルでは、HPS 側の PUSH スイッチ 4 つと SLIDE スイッチ (DIPSW) 4 つを
　 操作することでソフトウェアの動作を切り替える仕組みを実装しております。
　
　但し、ターゲットボードに Atlas-SoC / DE0-Nano-SoC / DE10-Nano を選択した場合、
　HPS 側には前述のスイッチが不足する状態となるため、以下の対応でご利用頂く実装としています。
　 * PUSH SW #0 ... FPGA 側の PUSH BUTTON (KEY0, KEY1) を同時押し 
　 * PUSH SW #1 ... FPGA 側の PUSH BUTTON (KEY0) を単押し
　 * PUSH SW #2 ... FPGA 側の PUSH BUTTON (KEY1) を単押し
　 * PUSH SW #3 ... HPS 側の USER PUSH BUTTON (KEY2) を単押し
　 * SLIDE SW #0:3 ... FPGA 側の SLIDE スイッチ (SW0, SW1, SW2, SW3) 
　
　Arria 10 SoC Development Kit を選択した場合は、全てのスイッチ（PUSH × 4、
　SLIDE (DIPSW) × 4）を HPS 側ではなく FPGA 側をご利用頂く実装としています。
　
　FPGA 側のスイッチを利用するため当該スイッチ用の PIO を実装した .sof にて
　事前に FPGA のコンフィギュレーションを行って頂く必要があります。

※ FPGA のコンフィギュレーション用の.sof ファイルは、DS-5 ワークスペース以下
　 ALT-HWLib-All-In-One_v18.1_r○\target_board の中に格納してあります。
　（必要に応じて Quartus Programmer 等で書き込みしてください）


-- 概要 ----------------------------------------------------------------
HWLib にて、下記のカテゴリに分類されている API を一通り動作させます。
	MMU Management API
	 ＋　MMU Management
	 ＋　MMU Virtual Address Space Creation

プログラム実行開始後、初期設定や各種 API の実行テストが完了すると、
下記の表示とともにループ処理を開始します。
"==== Start While(1) loop process!!! (Exit PUSHSW0(SW8) becomes ON.) ===="

ループ中に HPS 用 PUSHSW の操作を検出した場合、それぞれ以下の処理を実行します。
	- HPS 用 DIPSW4 .... OFF 切替：MMU 無効化（Disable）、ON 切替：MMU 有効化（Enable）
	- HPS 用 DIPSW3 .... ON/OFF 切替：MMU 再初期化（Translation Table を再作成し MMU 有効化）
	- HPS 用 PUSHSW0 ... ループを抜けてプログラム終了します（uninit 処理を実行）
	- HPS 用 PUSHSW1 ... Translation Table のディスクリプタ書換え用 API を試行します。
	- HPS 用 PUSHSW2 ... TLB のメンテナンス操作用 API を試行します。
	- HPS 用 PUSHSW3 ... MMU 関連レジスタの現在値を表示します。

● 下記の物理アドレスに該当するメモリ領域には、ループ開始前に
　 テストデータとして物理アドレス値を書き込みます。
　 これにより、MMU 有効の状態で Break(F9) し、メモリビューを参照することで、
　 仮想アドレス (VA) に対する参照先の物理アドレス (PA) が確認できるようにしています。
　
		Setting TEST Data : 0x00000000~0x0000FFFF.
#if !(APP_LOAD_ADDR==0x00200000) // Program Load Address: 00200000
		Setting TEST Data : 0x00200000~0x0020FFFF.
		Setting TEST Data : 0x002F0000~0x002FFFFF.
		Setting TEST Data : 0x00300000~0x0030FFFF.
		Setting TEST Data : 0x003F0000~0x003FFFFF.
		Setting TEST Data : 0x00400000~0x0040FFFF.
		Setting TEST Data : 0x004F0000~0x004FFFFF.
		Setting TEST Data : 0x00500000~0x0050FFFF.
		Setting TEST Data : 0x005F0000~0x005FFFFF.
#endif
		Setting TEST Data : 0x00600000~0x0060FFFF.
		Setting TEST Data : 0x006F0000~0x006FFFFF.
		Setting TEST Data : 0x00700000~0x0070FFFF.
		Setting TEST Data : 0x007F0000~0x007FFFFF.
		Setting TEST Data : 0x00800000~0x0080FFFF.
		Setting TEST Data : 0x008F0000~0x008FFFFF.
		Setting TEST Data : 0x00900000~0x0090FFFF.
		Setting TEST Data : 0x009F0000~0x009FFFFF.
		Setting TEST Data : 0x00A00000~0x00A0FFFF.
		Setting TEST Data : 0x00AF0000~0x00AFFFFF.
		Setting TEST Data : 0x00B00000~0x00B0FFFF.
		Setting TEST Data : 0x00BF0000~0x00BFFFFF.
		Setting TEST Data : 0x02000000~0x0200FFFF.
		Setting TEST Data : 0x03000000~0x0300FFFF.
		Setting TEST Data : 0x03FF0000~0x03FFFFFF.
		Setting TEST Data : 0xFFFF0000~0xFFFFFFFF.

● 本サンプルでは、標準で下記のメモリ配置となるように MMU を構成してます。

#if APP_LOAD_ADDR==0x00200000 // Program Load Address: 00200000
		[0] SDRAM ....... PA:0x00000000~0x001FFFFF <--> VA:0x00000000~0x001FFFFF (PA＝VA)
		[1] SDRAMx .......PA:0x00200000~0x005FFFFF <--> VA:0x00200000~0x005FFFFF (PA＝VA)
		[2] SDRAM2 .......PA:0x00800000~0x00BFFFFF <--> VA:0x00600000~0x009FFFFF (PA≠VA)
#else	// APP_LOAD_ADDR!=0x00200000
		[0] SDRAM ....... PA:0x00000000~0x003FFFFF <--> VA:0x00000000~0x003FFFFF (PA＝VA)
		[1] SDRAM2 ...... PA:0x00800000~0x00BFFFFF <--> VA:0x00400000~0x007FFFFF (PA≠VA)
#endif	// APP_LOAD_ADDR==0x00200000
		[2] SDRAM3 ...... PA:0x02000000~0x3FFFFFFF <--> VA:0x02000000~0x3FFFFFFF (PA＝VA)
		[3] HPS2FPGA .... PA:0xC0000000~0xFBFFFFFF <--> VA:0xC0000000~0xFBFFFFFF (PA＝VA)
		[4] LW_HPS2FPGA . PA:0xFF200000~0xFF3FFFFF <--> VA:0xFF200000~0xFF3FFFFF (PA＝VA)
		[5] PERIPHRALS .. PA:0xFF400000~0xFFEFFFFF <--> VA:0xFF400000~0xFFEFFFFF (PA＝VA)
		[6] BOOTROM ..... PA:0xFFFD0000~0xFFFDFFFF <--> VA:0xFFFD0000~0xFFFDFFFF (PA＝VA)
		[7] MPUSCU ...... PA:0xFFFEC000~0xFFFEDFFF <--> VA:0xFFFEC000~0xFFFEDFFF (PA＝VA)
		[8] MPUL2 ....... PA:0xFFFEF000~0xFFFEFFFF <--> VA:0xFFFEF000~0xFFFEFFFF (PA＝VA)
		[9] ONCHIPRAM ... PA:0xFFFF0000~0xFFFFFFFF <--> VA:0xFFFF0000~0xFFFFFFFF (PA＝VA)
		
		下記の変数を書き換えることで、別のメモリ配置を試すことができます（最大 16 個の Memory Region まで）。
		int	ValidMemoryRegion = 10;		← Memory Region 数を設定します。
		ALT_MMU_MEM_REGION_t MemoryRegion[MAX_MEMORY_REGION_NUM]; ← 先頭から Valid Memory Region の要素数分のテーブルを設定します。


● HPS 用 PUSHSW1 を契機に、Translation Table を書き換えます。
　 書き換えの結果、前述のメモリ配置から下記の部分が変更されます。

	[3] SDRAM3（最後の1MBを 0x04000000~ に配置変更）
	  <Original>
		PA:0x02000000~0x03FFFFFF <--> VA:0x02000000~0x03FFFFFF
	  <After customization>
		PA:0x02000000~0x03EFFFFF <--> VA:0x02000000~0x03EFFFFF
		PA:0x03000000~0x03FFFFFF <--> VA:0x04000000~0x04FFFFFF
		VA:0x03000000~0x03FFFFFF is not allocated.

	[9] ONCHIPRAM (全領域(64KB)を 0xFFF00000~ に配置変更)
	  <Original>
		PA:0xFFFF0000~0xFFFFFFFF <--> VA:0xFFFF0000~0xFFFFFFFF
	  <After customization>
		PA:0xFFFF0000~0xFFFFFFFF <--> VA:0xFFF00000~0xFFF0FFFF
		VA:0xFFFF0000~0xFFFFFFFF is not allocated. 

● 基本的に、Running(F8) した状態で、PUSHSW／DIPSW を操作して MMU の設定を変更します。
　 Break(F9) してメモリビューを参照することで MMU の動作を確認します。


-- 使い方 --------------------------------------------------------------

　　①．アーカイブを SoC EDS (DS-5) へインポートします。
　　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	１．SoC EDS（DS-5）のメニューから「ファイル(F) -> インポート(I)...」を実行します。
	　　※ 注意：SoC EDS (DS-5) は Embedded_Command_Shell から起動してください。
		↓
	２．インポートダイアログ上のインポート・ソースの選択(S)： として
	　　「一般 -> 既存プロジェクトをワークスペースへ」を選択して［次へ(N)>］を実行します。
		↓
	３．アーカイブ・ファイルの選択(A) のチェックを有効にして、
	　　［参照(R)...］ボタンから起動されるファイル選択ダイアログにて
	　　「ALT-HWLib-All-In-One_v18.1_r○.tar.gz」を選択します。
		↓
	４．「終了(F)」を実行してインポートを完了します。
		↓
	５．ALT-HWLib-All-In-One_v18.1_r○\examples の中に格納してある
	　　sample_mmu.c を ALT-HWLib-All-In-One_v18.1_r○ の TOP ディレクトリにコピーして、
	　　sample_app.c の main() 関数内から sample_mmu.c の sample_mmu_test_cmd() 関数を
	　　呼び出すように記述します。

　　②．ALT-HWLib-All-In-One_v18.1_r○ プロジェクトをビルドします。
　　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	１．ALT-HWLib-All-In-One_v18.1_r○ プロジェクトの config.mk を必要に応じて修正します。
		↓
	２．プロジェクト・エクスプローラ上で ALT-HWLib-All-In-One_v18.1_r○
	　　の右クリックメニューから「プロジェクトのビルド(B)」を実行します。

　　③．デバッグを実行します。
　　~~~~~~~~~~~~~~~~~~~~~~~~
	１．SoC EDS（DS-5）のメニューから「実行(R) -> デバッグの構成(B)...」を実行します。
		↓
	２．デバッグの構成ダイアログ上で、左側のツリー上で
	　　「DS-5デバッガ -> ALT-HWLib-All-In-One_v18.1_r○」が選択された状態にします。
		↓
	３．接続タブの［参照...］ボタンからデバッグハードウェアの選択ダイアログを起動して、
	　　適切な Connection を選択します。
	　　（例えば、Helio ボードと USB-Blaster II 接続なら「Helio on localhost[USB-1]:Helio USB-1」）
		↓
	４．［デバッグ(D)］を実行すると、プログラムがロードされた後に sample_app.c 内の main() でブレイクします。
	　　以降、デバッガで動作をご確認下さい。　


-- 詳細（sample_mmu_test_cmd() 以降） -----------------------------------

◎ sample_mmu_test_cmd() 関数内の下記の記述にて、サンプルコードを呼び出しています。
　　// Printing Current PLL Setting. And Set Global Timer for Time Measurement.
　　util_time_init();
　　
　　//// Sample Function Call!!! |---->
　　printf(">>>> Execute sample_mmu_test_init(); !!! <<<<\r\n");
　　sample_mmu_test_init();
　　
　　printf(">>>> Execute sample_mmu_test_main(); !!! <<<<\r\n");
　　sample_mmu_test_main();
　　
　　printf(">>>> Execute sample_mmu_test_uninit(); !!! <<<<\r\n");
　　sample_mmu_test_uninit();
　　//// Sample Function Call!!! <----|
　　
　　// Printing All Results of Time Measurement. And Uninit Global Timer.
　　util_time_uninit();


◎ 各サンプル関数の概要を示します。

util_time_init();
	→ 処理時間計測処理の初期化を行います。下記の処理を行います。
	 - 処理時間測定用に Global Timer の設定を行います（測定を行う場合に必要。現状、測定処理の呼び出しは未実装です）。
	 - Clock Manager の設定および設定情報の表示を行います（各種 Clock 周波数など、動作環境のパラメータ確認用）。

sample_mmu_test_init();
	→ 下記の処理を行います。
	 - ターゲット・ボード用の GPIO 設定を行います（HPS 用 PUSHSW、DIPSW の設定）。
	 - ACP ID Mapper の現在設定値を表示します（API 未実装のため現状は動作しません）。
	 - MMU 初期化用 API を実行します（alt_mmu_init）。
	 - MMU 関連レジスタの Read/Write 用 API を試行します（alt_mmu_XXXX_set, alt_mmu_XXXX_get）。
	 - Translation Table に必要となるメモリサイズ導出用 API を試行します（alt_mmu_va_space_storage_required）。

sample_mmu_test_main();
	→ テストプログラムを実行します。
	　無限ループ内で「概要」欄に記載したスイッチ検出処理を実行します。
	　ループ実行中に Break(F9) してメモリビューを参照することで、MMU の設定確認を行います。

sample_mmu_test_uninit();
	 - 1st Translation Table の初期化用 API を試行します（alt_mmu_ttb1_init）。
	 - MMU 初期化解除用 API を実行します（alt_mmu_uninit）。

util_time_uninit();
	→ 処理時間計測処理の事後処理を行います。
	 - 計測結果のコンソール表示を行います。


◎ プログラム起動（sample_app.c 内の main() 関数の先頭で break）の後、続行(F8) を行うと、
　 コンソール上にテストプログラムの実行結果が表示されます。
　 しばらく継続実行し、無限ループが開始した後に HPS 用 PUSHSW、DIPSW を操作することで、
　 特定の API の動作が確認可能になっています。

------------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 以上 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
