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

-- 情報 ----------------------------------------------------------------
ファイル名：		sample_ecc.c
作成日：			2014/08/20
更新日：			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 への対応を実施"
更新日：			2021/04/23	"SoC EDS v20.1 / Arm DS 2020.1 への対応を実施、Helio は更新対象外(v18.1 用を使用)"
更新日：			2025/07/29	"SoC EDS v20.1 / Arm DS 2024.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 バージョン：	github.com/altera-opensource - tag: rel_socfpga_v2020.10_21.03.01_pr
　　　　　　　　　　　　　Download: [ https://github.com/altera-fpga/u-boot-socfpga/releases/tag/rel_socfpga_v2020.10_21.03.01_pr ]
確認 HWLib バージョン：	github.com/altera-opensource - tag: rel_socfpga_v2024.01_24.11.03_pr
　　　　　　　　　　　　　Download: [ https://github.com/altera-fpga/u-boot-socfpga/releases/tag/rel_socfpga_v2024.01_24.11.03_pr ]

※ 本 HWLib Example を利用する場合には、プロジェクト 「ALT-HWLib-All-In-One_vXX.X_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-2025 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 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）
　
　レジスタ・ビューのカスタマイズ方法は、マクニカサイトの技術情報をご参照ください。
　『Arm DS 活用テクニック ～レジスタ・ビュー［2/3］レジスタ定義の自作』
　 https://www.macnica.co.jp/business/semiconductor/articles/intel/115085 

※ config.mk ファイル内のシンボル定義を変更することで、ターゲットボードの選択が可能です。
　 下記から 1 行だけを選択します（その他の行は # でコメントアウトします）。
　#######################
　# Select Target Board #
　#######################
　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

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

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


-- 概要 ----------------------------------------------------------------
HWLib にて、下記のカテゴリに分類されている API を一通り動作させます。
	Error Correcting Code (ECC) Management

On-Chip RAM の ECC を利用して以下の動作を確認します。
　・ ECC エラー・インジェクション
　・ ECC 割り込みの発生
　・ ECC エラー時の読み出しデータ（メモリ・チェック）
　・ Cache 有効/無効による ECC 動作の違い

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

ループ中に HPS 用 PUSHSW の操作を検出した場合、それぞれ以下の処理を実行します。
-----------------------------------------
スイッチ       実行する処理
-----------------------------------------
PUSHSW0 ... ループを抜けてプログラム終了
PUSHSW1 ... キャッシュクリーン を行った上でテスト領域へのリードアクセスを行います（ECC 割り込みの発生確認）
PUSHSW2 ... キャッシュパージ（クリーンと無効化）を行った上でテスト領域へのリードアクセスを行います（ECC 割り込みの発生確認）
PUSHSW3 ... DIPSW0、DIPSW1 の設定に応じて ECC エラーのインジェクションおよびメモリーチェックを行います

HPS 用 DIPSW は以下の動作選択に利用します。
-----------------------------------------
スイッチ       動作選択
-----------------------------------------
DIPSW0 .... ECC Double Bit Error (uncorredtable) インジェクション設定 {OFF:無効／ON:有効}
DIPSW1 .... ECC Single Bit Error (correctable) インジェクション設定 {OFF:無効／ON:有効}
DIPSW2 .... L2C-310 Debug Mode 設定 {OFF:無効／ON:有効}（ON: 有効にするとキャッシュが 「強制ライトスルー」 かつ 「ラインフィル無効」 で動作するモードに入ります）
DIPSW3 .... L1 / L2 キャッシュ設定 {OFF:無効／ON:有効}
-----------------------------------------

● DIPSW0、 DIPSW1 のいずれかを ON にした状態で、PUSHSW3 を押すとメモリーチェックの書き込みアクセス時に ECC エラーがインジェクションされます。
　 メモリーチェック NG を検出する毎に、NG の番地／期待値／読み出し結果を表示します。
　 On-Chip RAM の先頭から 128byte（0x80）をテスト領域として利用します。
　 Cache 有効 （DIPSW3 = ON） の場合、書き込みアクセスの設定を Write-Back にしているので On-Chip RAM への書き込みが動作せず、エラー・インジェクションが機能しません。
　 DIPSW2 を ON にすることで、強制的に Write-Through で動作するモードに入るため Cache 有効でもエラー・インジェクションが動作する状態に設定できます。

● PUSHSW1、 PUSHSW2 のいずれかを押すと、メモリーチェックした領域に対して Read アクセスを行います。
　 メモリーチェック時にエラー・インジェクションした後に、本操作を行うことで ECC エラーの検出動作が確認できます。ECC 割り込みを検出する毎にメッセージを表示します。
　 Cache 有効（DIPSW3 = ON）の場合は、事前にキャッシュ・メンテナンス処理を行います。
　 （PUSHSW1 はキャッシュ Clean、 PUSHSW2 はキャッシュ Purge (Clean & Invalidate) を実行）

● メモリーチェックおよび Read アクセスは、動作検証のために様々なアクセス方法で実行するようになっています。
　 - On-Chip RAM アクセス用の番地： 0x00000000～ / 0xFFFF0000～
　 - ビット幅： 8bit / 16bit / 32bit / 64bit


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

　　①．アーカイブを SoC EDS (DS) へインポートします。
　　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	１．SoC EDS（DS）のメニューから「ファイル(F) -> インポート(I)...」を実行します。
	　　※ 注意：SoC EDS (DS) は Embedded_Command_Shell から起動してください。
		↓
	２．インポートダイアログ上のインポート・ソースの選択(S)： として
	　　「一般 -> 既存プロジェクトをワークスペースへ」を選択して［次へ(N)>］を実行します。
		↓
	３．アーカイブ・ファイルの選択(A) のチェックを有効にして、
	　　［参照(R)...］ボタンから起動されるファイル選択ダイアログにて
	　　「ALT-HWLib-All-In-One_vXX.X_r○.tar.gz」を選択します。
		↓
	４．「終了(F)」を実行してインポートを完了します。
		↓
	５．ALT-HWLib-All-In-One_vXX.X_r○ の中に格納してある
	　　config.mk ファイル内の ENABLE_EXAMPLE_ECC の定義を "1" に設定してプロジェクトをビルドすると、
	　　ターゲットボードの DIP スイッチを 「Command モード」 に設定してコンソールから "ecc" コマンドを入力することにより、
	　　util/cmd.c 内から sample_ecc.c の sample_ecc_test_cmd() 関数が呼び出されます。

　# ENABLE_EXAMPLE_ECC     : sample_ecc.c  
　ENABLE_EXAMPLE_ECC       := 1


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

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


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

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


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

util_time_init();
	→ 処理時間計測処理の初期化を行います。
	 - ターゲット・ボードの HPS 用 DIPSW, PUSHSW のための GPIO 設定を行います（テストプログラム操作用）。
	 - 処理時間測定用に Global Timer の設定を行います（測定を行う場合に必要。現状、測定処理の呼び出しは未実装）。
	 - Clock Manager の設定および設定情報の表示を行います（各種 Clock 周波数など、動作環境のパラメータ確認用）。

sample_ecc_test_init();
	→ 下記の処理を行います。
	 - remap レジスタの設定を行います（先頭番地 0x00000000 から On-Chip RAM へのアクセスが可能となるように設定）。
	 - ターゲット・ボード用の GPIO 設定を行います（HPS 用 PUSHSW、DIPSW の設定）。
	 - On-Chip RAM の ECC 設定および有効化を行います（ECC 有効化および割り込み許可設定）。
	 - MMU 設定および有効化を行います（On-Chip RAM 領域は、L1/L2 Cache 共に Write-Back に設定）。

sample_ecc_test_main();
	→ テストプログラムを実行します。
	 - 無限ループ内で「概要」欄に記載したスイッチ検出処理を実行します。

sample_ecc_test_uninit();
	→ 本サンプルでは何もしません。

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


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

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