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