xref: /OK3568_Linux_fs/external/rockit/mpi/example/mod/test_mpi_sys.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* Copyright 2020 Rockchip Electronics Co. LTD
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
4*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
5*4882a593Smuzhiyun  * You may obtain a copy of the License at
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
10*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
11*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
13*4882a593Smuzhiyun  * limitations under the License.
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #undef DBG_MOD_ID
17*4882a593Smuzhiyun #define DBG_MOD_ID       RK_ID_SYS
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include <stdio.h>
20*4882a593Smuzhiyun #include <unistd.h>
21*4882a593Smuzhiyun #include <cstring>
22*4882a593Smuzhiyun #include <cstdlib>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include "rk_debug.h"
25*4882a593Smuzhiyun #include "rk_mpi_sys.h"
26*4882a593Smuzhiyun #include "rk_mpi_ao.h"
27*4882a593Smuzhiyun #include "rk_mpi_adec.h"
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include "test_comm_argparse.h"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun typedef struct _rkTestSysCtx {
32*4882a593Smuzhiyun     RK_S32      s32LoopCount;
33*4882a593Smuzhiyun     RK_S32      s32DevId;
34*4882a593Smuzhiyun     RK_S32      s32SrcChnId;
35*4882a593Smuzhiyun     RK_S32      s32DstChnNum;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun     ADEC_CHN_ATTR_S *pstADecChnAttr;
38*4882a593Smuzhiyun } TEST_SYS_CTX_S;
39*4882a593Smuzhiyun 
test_ao_dev_init(TEST_SYS_CTX_S * pstCtx)40*4882a593Smuzhiyun RK_S32 test_ao_dev_init(TEST_SYS_CTX_S *pstCtx) {
41*4882a593Smuzhiyun     AUDIO_DEV aoDevId = (AUDIO_DEV)pstCtx->s32DevId;
42*4882a593Smuzhiyun     AIO_ATTR_S aoAttr;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun     memset(&aoAttr, 0, sizeof(AIO_ATTR_S));
45*4882a593Smuzhiyun     aoAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
46*4882a593Smuzhiyun     aoAttr.enSamplerate = AUDIO_SAMPLE_RATE_44100;
47*4882a593Smuzhiyun     aoAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
48*4882a593Smuzhiyun     aoAttr.u32FrmNum = 512;
49*4882a593Smuzhiyun     aoAttr.u32PtNumPerFrm = 1024;
50*4882a593Smuzhiyun     aoAttr.u32EXFlag = 0;
51*4882a593Smuzhiyun     aoAttr.u32ChnCnt = 2;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun     RK_MPI_AO_SetPubAttr(aoDevId, &aoAttr);
54*4882a593Smuzhiyun     RK_MPI_AO_Enable(aoDevId);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun     return RK_SUCCESS;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun 
test_ao_dev_deinit(TEST_SYS_CTX_S * pstCtx)59*4882a593Smuzhiyun RK_S32 test_ao_dev_deinit(TEST_SYS_CTX_S *pstCtx) {
60*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun     s32Ret =  RK_MPI_AO_Disable(pstCtx->s32DevId);
63*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
64*4882a593Smuzhiyun         RK_LOGE("failed to disable ao dev, err: %d", s32Ret);
65*4882a593Smuzhiyun         return RK_FAILURE;
66*4882a593Smuzhiyun     }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun     return s32Ret;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
test_adec_create_chn_attr()71*4882a593Smuzhiyun ADEC_CHN_ATTR_S* test_adec_create_chn_attr() {
72*4882a593Smuzhiyun     ADEC_CHN_ATTR_S *pstChnAttr = reinterpret_cast<ADEC_CHN_ATTR_S *>
73*4882a593Smuzhiyun                                         (malloc(sizeof(ADEC_CHN_ATTR_S)));
74*4882a593Smuzhiyun     memset(pstChnAttr, 0, sizeof(ADEC_CHN_ATTR_S));
75*4882a593Smuzhiyun     ADEC_ATTR_CODEC_S *pstCodecAttr = &pstChnAttr->stCodecAttr;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun     // attr of adec
78*4882a593Smuzhiyun     pstCodecAttr->u32Channels      = 2;
79*4882a593Smuzhiyun     pstCodecAttr->u32SampleRate    = 16000;
80*4882a593Smuzhiyun     pstCodecAttr->u32ExtraDataSize = 0;
81*4882a593Smuzhiyun     pstCodecAttr->pExtraData       = RK_NULL;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun     // attr of chn
84*4882a593Smuzhiyun     pstChnAttr->enType          = RK_AUDIO_ID_ADPCM_G726;
85*4882a593Smuzhiyun     pstChnAttr->enMode          = ADEC_MODE_PACK;
86*4882a593Smuzhiyun     pstChnAttr->u32BufCount     = 4;
87*4882a593Smuzhiyun     pstChnAttr->u32BufSize      = 8192;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun     return pstChnAttr;
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun 
test_adec_destroy_chn_attr(ADEC_CHN_ATTR_S ** ppstChnAttr)92*4882a593Smuzhiyun void test_adec_destroy_chn_attr(ADEC_CHN_ATTR_S **ppstChnAttr) {
93*4882a593Smuzhiyun     ADEC_CHN_ATTR_S *pstChnAttr = *ppstChnAttr;
94*4882a593Smuzhiyun     if (pstChnAttr == RK_NULL) {
95*4882a593Smuzhiyun         return;
96*4882a593Smuzhiyun     }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     ADEC_ATTR_CODEC_S *pstCodecAttr = &pstChnAttr->stCodecAttr;
99*4882a593Smuzhiyun     if (pstCodecAttr->pExtraData != RK_NULL) {
100*4882a593Smuzhiyun         free(pstCodecAttr->pExtraData);
101*4882a593Smuzhiyun         pstCodecAttr->pExtraData = RK_NULL;
102*4882a593Smuzhiyun     }
103*4882a593Smuzhiyun     pstCodecAttr->u32ExtraDataSize = 0;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     free(pstChnAttr);
106*4882a593Smuzhiyun     *ppstChnAttr = RK_NULL;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
test_adec_create_channel(TEST_SYS_CTX_S * pstCtx,RK_S32 s32ChnId)109*4882a593Smuzhiyun RK_S32 test_adec_create_channel(TEST_SYS_CTX_S *pstCtx, RK_S32 s32ChnId) {
110*4882a593Smuzhiyun     RK_S32 s32Ret  = RK_SUCCESS;
111*4882a593Smuzhiyun     ADEC_CHN AdChn = (ADEC_CHN)s32ChnId;
112*4882a593Smuzhiyun     ADEC_CHN_ATTR_S *pstChnAttr = test_adec_create_chn_attr();
113*4882a593Smuzhiyun     s32Ret = RK_MPI_ADEC_CreateChn(AdChn, pstChnAttr);
114*4882a593Smuzhiyun     if (s32Ret) {
115*4882a593Smuzhiyun         RK_LOGE("failed to create adec chn %d, err %d", AdChn, s32Ret);
116*4882a593Smuzhiyun         return RK_FAILURE;
117*4882a593Smuzhiyun     }
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun     return s32Ret;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun 
test_adec_destroy_channel(TEST_SYS_CTX_S * pstCtx,RK_S32 s32ChnId)122*4882a593Smuzhiyun RK_S32 test_adec_destroy_channel(TEST_SYS_CTX_S *pstCtx, RK_S32 s32ChnId) {
123*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
124*4882a593Smuzhiyun     RK_S32 s32DevId = pstCtx->s32DevId;
125*4882a593Smuzhiyun     ADEC_CHN AdChn  = (ADEC_CHN)s32ChnId;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun     s32Ret = RK_MPI_ADEC_DestroyChn(AdChn);
128*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
129*4882a593Smuzhiyun         RK_LOGE("failed to destroy adec channel(%d), err: %d", AdChn, s32Ret);
130*4882a593Smuzhiyun     }
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun     test_adec_destroy_chn_attr(&pstCtx->pstADecChnAttr);
133*4882a593Smuzhiyun     return s32Ret;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
test_ao_enable_channel(TEST_SYS_CTX_S * pstCtx,RK_S32 s32ChnId)136*4882a593Smuzhiyun RK_S32 test_ao_enable_channel(TEST_SYS_CTX_S *pstCtx, RK_S32 s32ChnId) {
137*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
138*4882a593Smuzhiyun     ADEC_CHN AdChn  = (ADEC_CHN)s32ChnId;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun     s32Ret = RK_MPI_AO_EnableChn(pstCtx->s32DevId, AdChn);
141*4882a593Smuzhiyun     if (s32Ret != 0) {
142*4882a593Smuzhiyun         RK_LOGE("failed to enable ao chn %d, err %d", AdChn, s32Ret);
143*4882a593Smuzhiyun         return RK_FAILURE;
144*4882a593Smuzhiyun     }
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun     return s32Ret;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
test_ao_disable_channel(TEST_SYS_CTX_S * pstCtx,RK_S32 s32ChnId)149*4882a593Smuzhiyun RK_S32 test_ao_disable_channel(TEST_SYS_CTX_S *pstCtx, RK_S32 s32ChnId) {
150*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
151*4882a593Smuzhiyun     AO_CHN AoChn  = (AO_CHN)s32ChnId;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun     s32Ret = RK_MPI_AO_DisableChn(pstCtx->s32DevId, AoChn);
154*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
155*4882a593Smuzhiyun         RK_LOGE("failed to disable ao channel(%d), err: %d", AoChn, s32Ret);
156*4882a593Smuzhiyun         return RK_FAILURE;
157*4882a593Smuzhiyun     }
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun     return RK_SUCCESS;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
test_bind_adec_ao(TEST_SYS_CTX_S * pstCtx,RK_S32 s32SrcChnId,RK_S32 s32DstChnId)162*4882a593Smuzhiyun RK_S32 test_bind_adec_ao(TEST_SYS_CTX_S *pstCtx, RK_S32 s32SrcChnId, RK_S32 s32DstChnId) {
163*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
164*4882a593Smuzhiyun     RK_S32 s32DevId = pstCtx->s32DevId;
165*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDstChn;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun     stSrcChn.enModId = RK_ID_ADEC;
168*4882a593Smuzhiyun     stSrcChn.s32DevId = s32DevId;
169*4882a593Smuzhiyun     stSrcChn.s32ChnId = s32SrcChnId;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     stDstChn.enModId = RK_ID_AO;
172*4882a593Smuzhiyun     stDstChn.s32DevId = s32DevId;
173*4882a593Smuzhiyun     stDstChn.s32ChnId = s32DstChnId;
174*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDstChn);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun     return s32Ret;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun 
test_unbind_adec_ao(TEST_SYS_CTX_S * pstCtx,RK_S32 s32SrcChnId,RK_S32 s32DstChnId)179*4882a593Smuzhiyun RK_S32 test_unbind_adec_ao(TEST_SYS_CTX_S *pstCtx, RK_S32 s32SrcChnId, RK_S32 s32DstChnId) {
180*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
181*4882a593Smuzhiyun     RK_S32 s32DevId = pstCtx->s32DevId;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDstChn;
184*4882a593Smuzhiyun     stSrcChn.enModId = RK_ID_ADEC;
185*4882a593Smuzhiyun     stSrcChn.s32DevId = s32DevId;
186*4882a593Smuzhiyun     stSrcChn.s32ChnId = s32SrcChnId;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun     stDstChn.enModId = RK_ID_AO;
189*4882a593Smuzhiyun     stDstChn.s32DevId = s32DevId;
190*4882a593Smuzhiyun     stDstChn.s32ChnId = s32DstChnId;
191*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDstChn);
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun     return s32Ret;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
test_mpi_sys_get_bind_by_src(TEST_SYS_CTX_S * pstCtx,RK_S32 s32ChnId)196*4882a593Smuzhiyun RK_S32 test_mpi_sys_get_bind_by_src(TEST_SYS_CTX_S *pstCtx, RK_S32 s32ChnId) {
197*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
198*4882a593Smuzhiyun     MPP_CHN_S stSrcChn;
199*4882a593Smuzhiyun     MPP_BIND_DEST_S pstBindDest;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun     memset(&stSrcChn, 0, sizeof(MPP_CHN_S));
202*4882a593Smuzhiyun     memset(&pstBindDest, 0, sizeof(MPP_BIND_DEST_S));
203*4882a593Smuzhiyun     stSrcChn.enModId = RK_ID_ADEC;
204*4882a593Smuzhiyun     stSrcChn.s32DevId = pstCtx->s32DevId;
205*4882a593Smuzhiyun     stSrcChn.s32ChnId = s32ChnId;
206*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_GetBindbySrc(&stSrcChn, &pstBindDest);
207*4882a593Smuzhiyun     if (s32Ret == RK_SUCCESS) {
208*4882a593Smuzhiyun         for (RK_S32 i=0; i < pstBindDest.u32Num; i++) {
209*4882a593Smuzhiyun             MPP_CHN_S *pstDstChn = &pstBindDest.astMppChn[i];
210*4882a593Smuzhiyun             RK_LOGD("get dst channel(modId=%d, devId=%d, chnId=%d)",
211*4882a593Smuzhiyun                 pstDstChn->enModId, pstDstChn->s32DevId, pstDstChn->s32ChnId);
212*4882a593Smuzhiyun         }
213*4882a593Smuzhiyun     } else {
214*4882a593Smuzhiyun         RK_LOGE("failed to RK_MPI_SYS_GetBindbySrc");
215*4882a593Smuzhiyun     }
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun     return s32Ret;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
test_mpi_sys_get_bind_by_dest(TEST_SYS_CTX_S * pstCtx,RK_S32 s32ChnId)220*4882a593Smuzhiyun RK_S32 test_mpi_sys_get_bind_by_dest(TEST_SYS_CTX_S *pstCtx, RK_S32 s32ChnId) {
221*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
222*4882a593Smuzhiyun     MPP_CHN_S stSrcChn;
223*4882a593Smuzhiyun     MPP_CHN_S stDstChn;
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun     memset(&stSrcChn, 0, sizeof(MPP_CHN_S));
226*4882a593Smuzhiyun     memset(&stDstChn, 0, sizeof(MPP_CHN_S));
227*4882a593Smuzhiyun     stDstChn.enModId = RK_ID_AO;
228*4882a593Smuzhiyun     stDstChn.s32DevId = pstCtx->s32DevId;
229*4882a593Smuzhiyun     stDstChn.s32ChnId = s32ChnId;
230*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_GetBindbyDest(&stDstChn, &stSrcChn);
231*4882a593Smuzhiyun     if (s32Ret == RK_SUCCESS) {
232*4882a593Smuzhiyun         RK_LOGD("get src channel(modId=%d, devId=%d, chnId=%d)",
233*4882a593Smuzhiyun                 stSrcChn.enModId, stSrcChn.s32DevId, stSrcChn.s32ChnId);
234*4882a593Smuzhiyun     } else {
235*4882a593Smuzhiyun         RK_LOGE("failed to RK_MPI_SYS_GetBindbyDest");
236*4882a593Smuzhiyun     }
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun     return s32Ret;
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun 
unit_test_mpi_sys_bind(TEST_SYS_CTX_S * pstCtx)241*4882a593Smuzhiyun RK_S32 unit_test_mpi_sys_bind(TEST_SYS_CTX_S *pstCtx) {
242*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
243*4882a593Smuzhiyun     RK_S32 s32SrcChnId = pstCtx->s32SrcChnId;
244*4882a593Smuzhiyun     RK_S32 s32DstNumChn = pstCtx->s32DstChnNum;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun     // init Ao device
247*4882a593Smuzhiyun     s32Ret = test_ao_dev_init(pstCtx);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun     // create adec channel
250*4882a593Smuzhiyun     s32Ret = test_adec_create_channel(pstCtx, s32SrcChnId);
251*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
252*4882a593Smuzhiyun         goto __FAILED_ADEC;
253*4882a593Smuzhiyun     }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun     // enable ao channel
256*4882a593Smuzhiyun     for (RK_S32 s32DstChnId = 0; s32DstChnId < s32DstNumChn; s32DstChnId++) {
257*4882a593Smuzhiyun         s32Ret = test_ao_enable_channel(pstCtx, s32DstChnId);
258*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
259*4882a593Smuzhiyun             goto __FAILED_AO;
260*4882a593Smuzhiyun         }
261*4882a593Smuzhiyun         // bind adec->ao
262*4882a593Smuzhiyun         s32Ret = test_bind_adec_ao(pstCtx, s32SrcChnId, s32DstChnId);
263*4882a593Smuzhiyun         if (s32Ret == RK_SUCCESS) {
264*4882a593Smuzhiyun             RK_LOGD("succeed to bind ADEC(%d) AO(%d)", s32SrcChnId, s32DstChnId);
265*4882a593Smuzhiyun         }
266*4882a593Smuzhiyun     }
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun     // test RK_MPI_SYS_GetBindbyDest/GetBindbySrc
269*4882a593Smuzhiyun     s32Ret = test_mpi_sys_get_bind_by_src(pstCtx, s32SrcChnId);
270*4882a593Smuzhiyun     for (RK_S32 s32DstChnId = 0; s32DstChnId < s32DstNumChn; s32DstChnId++) {
271*4882a593Smuzhiyun         s32Ret = test_mpi_sys_get_bind_by_dest(pstCtx, s32DstChnId);
272*4882a593Smuzhiyun     }
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun __FAILED_AO:
275*4882a593Smuzhiyun     for (RK_S32 s32DstChnId = 0; s32DstChnId < s32DstNumChn; s32DstChnId++) {
276*4882a593Smuzhiyun         // unbind adec->ao
277*4882a593Smuzhiyun         s32Ret = test_unbind_adec_ao(pstCtx, s32SrcChnId, s32DstChnId);
278*4882a593Smuzhiyun         if (s32Ret == RK_SUCCESS) {
279*4882a593Smuzhiyun             RK_LOGD("succeed to unbind ADEC(%d) AO(%d)", s32SrcChnId, s32DstChnId);
280*4882a593Smuzhiyun         }
281*4882a593Smuzhiyun         // disable ao channel
282*4882a593Smuzhiyun         test_ao_disable_channel(pstCtx, s32DstChnId);
283*4882a593Smuzhiyun     }
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun     test_adec_destroy_channel(pstCtx, s32SrcChnId);
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun  __FAILED_ADEC:
288*4882a593Smuzhiyun     // deinit Ao device
289*4882a593Smuzhiyun     s32Ret = test_ao_dev_deinit(pstCtx);
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun     return s32Ret;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun 
unit_test_mpi_sys(TEST_SYS_CTX_S * pstCtx)294*4882a593Smuzhiyun RK_S32 unit_test_mpi_sys(TEST_SYS_CTX_S *pstCtx) {
295*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
296*4882a593Smuzhiyun     RK_S32 loopCount = pstCtx->s32LoopCount;
297*4882a593Smuzhiyun     do {
298*4882a593Smuzhiyun         s32Ret = unit_test_mpi_sys_bind(pstCtx);
299*4882a593Smuzhiyun         loopCount--;
300*4882a593Smuzhiyun         RK_LOGI("looping times %d", pstCtx->s32LoopCount - loopCount);
301*4882a593Smuzhiyun     } while (loopCount > 0);
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun     return s32Ret;
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun static const char *const usages[] = {
307*4882a593Smuzhiyun     "./rk_mpi_sys_test...",
308*4882a593Smuzhiyun     NULL,
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
main(RK_S32 argc,const char ** argv)311*4882a593Smuzhiyun RK_S32 main(RK_S32 argc, const char **argv) {
312*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
313*4882a593Smuzhiyun     TEST_SYS_CTX_S stCtx;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun     memset(&stCtx, 0, sizeof(TEST_SYS_CTX_S));
316*4882a593Smuzhiyun     stCtx.s32LoopCount = 1;
317*4882a593Smuzhiyun     stCtx.s32DevId = 0;
318*4882a593Smuzhiyun     stCtx.s32SrcChnId = 0;
319*4882a593Smuzhiyun     stCtx.s32DstChnNum = 1;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun     struct argparse_option options[] = {
322*4882a593Smuzhiyun         OPT_HELP(),
323*4882a593Smuzhiyun         OPT_GROUP("basic options:"),
324*4882a593Smuzhiyun         OPT_INTEGER('n', "loop_count", &(stCtx.s32LoopCount),
325*4882a593Smuzhiyun                     "loop running count. default(1)", NULL, 0, 0),
326*4882a593Smuzhiyun         OPT_INTEGER('\0', "device_id", &(stCtx.s32DevId),
327*4882a593Smuzhiyun                     "MODULE device id. default(0)", NULL, 0, 0),
328*4882a593Smuzhiyun         OPT_INTEGER('\0', "src_channel_id", &(stCtx.s32SrcChnId),
329*4882a593Smuzhiyun                     "source MODULE channel id. default(0)", NULL, 0, 0),
330*4882a593Smuzhiyun         OPT_INTEGER('\0', "dst_channel_count", &(stCtx.s32DstChnNum),
331*4882a593Smuzhiyun                     "the count of dst MODULE channel. default(1)", NULL, 0, 0),
332*4882a593Smuzhiyun         OPT_END(),
333*4882a593Smuzhiyun     };
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun     struct argparse argparse;
336*4882a593Smuzhiyun     argparse_init(&argparse, options, usages, 0);
337*4882a593Smuzhiyun     argparse_describe(&argparse, "\nselect a test case to run.",
338*4882a593Smuzhiyun                                  "\nuse --help for details.");
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun     argc = argparse_parse(&argparse, argc, argv);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Init();
343*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
344*4882a593Smuzhiyun         return s32Ret;
345*4882a593Smuzhiyun     }
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun     s32Ret = unit_test_mpi_sys(&stCtx);
348*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
349*4882a593Smuzhiyun         goto __FAILED;
350*4882a593Smuzhiyun     }
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Exit();
353*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
354*4882a593Smuzhiyun         return s32Ret;
355*4882a593Smuzhiyun     }
356*4882a593Smuzhiyun     RK_LOGI("test running ok.");
357*4882a593Smuzhiyun     return RK_SUCCESS;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun __FAILED:
360*4882a593Smuzhiyun     RK_MPI_SYS_Exit();
361*4882a593Smuzhiyun     RK_LOGE("test running failed!");
362*4882a593Smuzhiyun     return s32Ret;
363*4882a593Smuzhiyun }
364