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