/******************************************************************************* * * * モジュール名称 :冗長SDRAMデータ取得 * * モジュールラベル :rap_cmm_getRdnSdram * * タスク区分 :冗長ライブラリ * * 機能 :冗長側のSDRAMからデータを取得する * * * * コーリングシーケンス:int rap_cmm_getRdnSdram( address, size, buff ) * * 引数 :unsigned int address :アドレス※ * * (0x08100000〜0x17FFFFFF) * * unsigned int size :データ取得サイズ※ * * (Max.1M バイト) * * unsigned char buff[] :データ格納領域 * * ※:2 バイト単位指定。 * * 戻り値 :処理結果 ( <0 :異常 , 0:正常) * * 0 :正常終了 * * -1 :アドレスが範囲外 * * -2 :size が範囲外 * * -2 :上記以外 * * 使用上の注意 :なし * * エラー処理 :なし * * Edited: 2017/11/23 by Y.Kasaba * *******************************************************************************/ #include "dpu_api.h" #include "dpu_api_proto.h" #include "rap_api.h" #include "rap_define.h" /* define定義 */ #include "rap_variable.h" /* グローバル変数宣言 */ #include "rap_func.h" /* 関数プロトタイプ宣言 */ #include "app_core.h" #define RCMD_SND_CNT 1 extern unsigned char Guc_rdn_MwHK [200]; // HK-DATA in RDN-DPU (non in DPU-HK) int rap_cmm_getRdnSdram( unsigned int address, unsigned int size, unsigned char buff[] ) { M_T_RDN_IF_STATUS t_rdnIfStatus; unsigned int ui_readAddr; unsigned int ui_readSize; int i_rdnResult; int i_ret = 0; /* 戻り値 */ int i; // --------------------- // --- BUSY-FLAG-ENA --- // --------------------- for (;;) { if ( Gi_shareBusy == 0 ) break; dpu_delay(10); } Gi_shareBusy = 3; // --------------------- // --- BUSY-FLAG-ENA --- // --------------------- // *** 処理開始 *** dpu_getRdnIFStatus ( &t_rdnIfStatus ); if ( t_rdnIfStatus.us_sendReq & 0x0001 ) i_ret = -4; // 送信中 else { // (1) dpu_clearRdnIFStatus()をコール: 冗長IFステータスクリア dpu_clearRdnIFStatus(); /* レジスタ読出し */ ui_readAddr = address; ui_readSize = size; // (2) dpu_sendRdnReadCommand()をコール i_rdnResult = dpu_sendRdnReadCommand( ui_readAddr, ui_readSize ); if( i_rdnResult != 0) i_ret = -1; // (4) 一定時間待ち ui_waitTime = (unsigned int)( (size * 8) / (RA_d_RDN_LINK_SPEED / 1000) ); /* APIによる1ms待ちを考慮 */ for (i=0; i<10; i++) { dpu_delay(10); dpu_getRdnIFStatus ( &t_rdnIfStatus ); /* Read Reply受信個数が期待値と一致 */ if ( (t_rdnIfStatus.us_readRplyCount & 0x00FF) == RCMD_SND_CNT ) break; } if (i>=10) {/* Read Reply受信個数が期待値と不一致 */ Guc_rdn_MwHK[35] |= 0x01; // rev. 2017/11/23DS_2BERR SDRAM 2bitエラー(2013.01.22) Guc_rdn_MwHK[32] ++; // rev. 2017/11/23 i_ret = -3; } else { // (5) dpu_getRdnIFStatus()をコール: データ取得 i_rdnResult = dpu_getRdnReadReply( buff, 0, size ); if( i_rdnResult != 0) i_ret = -2; } } // --------------------- // --- BUSY-FLAG-DIS --- // --------------------- Gi_shareBusy = 0; // --------------------- // --- BUSY-FLAG-DIS --- // --------------------- return i_ret; }