/******************************************************************************* * * * モジュール名称 :冗長非定期コマンド送信 * * モジュールラベル :rap_dr_sendRdnSingleCmd * * タスク区分 :冗長ライブラリ * * 機能 :冗長側ミッション機器へ非定期コマンドを送信する * * * * コーリングシーケンス:int rap_dr_sendRdnSingleCmd( channel, buff * * size, replyAddr) * * 引数 :unsigned char channel :ミッションI/Fチャンネル * * unsigned char buff[] :パケット格納領域 * * unsigned int size :パケット格納領域サイズ * * (Max.256byte) * * unsigned int replyAddr :リプライパケット格納アドレス* * (0x08100000〜0x17FF FFFF、16 バイト単位指定)* * 戻り値 :処理結果 ( <0 :異常 , 0:正常) * * 0 :正常終了 * * -1 :channel が範囲外 * * -2 :size が範囲外 * * -3 :replyAddrが範囲外 * * -4 :replyAddrが16の倍数でない * * -5 :上記以外 * * 使用上の注意 :なし * * エラー処理 :なし * * * *******************************************************************************/ #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 WCMD_SND_CNT 3 int rap_dr_sendRdnSingleCmd( unsigned char channel, unsigned char buff[], unsigned int size, unsigned int replyAddr ) { M_T_RDN_IF_STATUS t_rdnIfStatus; unsigned int ui_writeAddr; unsigned short us_writeData[2]; int i_rdnResult; int i_ret = 0; /* 戻り値 */ int i; // --------------------- // --- BUSY-FLAG-ENA --- // --------------------- for (;;) { if ( Gi_shareBusy == 0 ) break; dpu_delay(10); } Gi_shareBusy = 6; // --------------------- // --- BUSY-FLAG-ENA --- // --------------------- // *** 引数チェック *** if ( channel >= RA_d_MISSION_NUM ) i_ret = -1; // channelが範囲外 else if ( size > RA_d_SGLCMD_MAX_SIZE ) i_ret = -2; // size が範囲外 else if ( replyAddr < RA_d_SDRAM_SADDR && replyAddr > RA_d_SDRAM_EADDR ) i_ret = -3; // replyAddrが範囲外 else if ((replyAddr % 16) != 0 ) i_ret = -4; // replyAddrが16byteバウンダリでない else { dpu_getRdnIFStatus ( &t_rdnIfStatus ); if( (t_rdnIfStatus.us_sendReq & 0x0001) == 0 ) { if( t_rdnIfStatus.us_sendReq & 0x0001 ) i_ret = -5; // 送信中 else { /* 冗長IFステータスクリア */ dpu_clearRdnIFStatus(); /* RMAP Command転送 */ ui_writeAddr = RA_Gui_msMemStartAddr[channel] + RA_d_MSMEM_SGLCMDBUFF; while (1) { i_rdnResult = dpu_sendRdnWriteCommand( buff, ui_writeAddr, size ); if( i_rdnResult != 0) { i_ret = -5; } if ( i_rdnResult > -4 ) { break; } } /* DMA転送先アドレス (SDRAM先頭からの相対アドレス) */ us_writeData[0] = (unsigned short)(((replyAddr - RA_d_MSIF_BASE_ADDR) & 0xFFFF0000) >> 16 ); us_writeData[1] = (unsigned short)(((replyAddr - RA_d_MSIF_BASE_ADDR) & 0x0000FFFF) ); ui_writeAddr = RA_Gui_msRegStartAddr[channel] + RA_d_MSREG_RR1ADDR_L; while (1) { i_rdnResult = dpu_sendRdnWriteCommand( (unsigned char *)us_writeData, ui_writeAddr, RA_d_SHORT * 2 ); if( i_rdnResult != 0) { i_ret = -5; } if ( i_rdnResult > -4 ) { break; } } /* 非定期コマンド発行(エラークリア,送信開始) */ us_writeData[0] = 0xFFFF; ui_writeAddr = RA_Gui_msRegStartAddr[channel] + RA_d_MSREG_SGLSDCTL; while (1) { i_rdnResult = dpu_sendRdnWriteCommand( (unsigned char *)us_writeData, ui_writeAddr, RA_d_SHORT ); if( i_rdnResult != 0) { i_ret = -5; } if ( i_rdnResult > -4 ) { break; } } /* 冗長IFステータスチェック */ for (i=0; i<10; i++) { dpu_delay(10); dpu_getRdnIFStatus ( &t_rdnIfStatus ); if ( (t_rdnIfStatus.us_writeRplyCount & 0x00FF) == WCMD_SND_CNT ) break; // Write Reply受信個数が期待値と一致 } if (i>=10) {/* Read Reply受信個数が期待値と不一致 */ i_ret = -5; } } } } // --------------------- // --- BUSY-FLAG-DIS --- // --------------------- Gi_shareBusy = 0; // --------------------- // --- BUSY-FLAG-DIS --- // --------------------- return i_ret; }