• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "higv_mw_media.h"
16 #include "hi_common.h"
17 #include "hi_buffer.h"
18 #include "hi_comm_sys.h"
19 #include "hi_comm_vb.h"
20 #include "hi_comm_isp.h"
21 #include "hi_comm_vi.h"
22 #include "hi_comm_vo.h"
23 #include "hi_comm_venc.h"
24 #include "hi_comm_vdec.h"
25 #include "hi_comm_vpss.h"
26 #include "hi_comm_region.h"
27 #include "hi_comm_adec.h"
28 #include "hi_comm_aenc.h"
29 #include "hi_comm_ai.h"
30 #include "hi_comm_ao.h"
31 #include "hi_comm_aio.h"
32 #include "hi_defines.h"
33 #include "hi_comm_hdmi.h"
34 #include "hi_mipi.h"
35 #include "hi_comm_vgs.h"
36 #include "mpi_sys.h"
37 #include "mpi_vb.h"
38 #include "mpi_vi.h"
39 #include "mpi_vo.h"
40 #include "mpi_venc.h"
41 #include "mpi_vdec.h"
42 #include "mpi_vpss.h"
43 #include "mpi_region.h"
44 #include "mpi_audio.h"
45 #include "mpi_isp.h"
46 #include "mpi_ae.h"
47 #include "mpi_awb.h"
48 #include "hi_math.h"
49 #include "hi_sns_ctrl.h"
50 #include "mpi_hdmi.h"
51 #include "mpi_vgs.h"
52 
SAMPLE_COMM_SYS_Init(const VB_CONFIG_S * pstVbConfig)53 HI_S32 SAMPLE_COMM_SYS_Init(const VB_CONFIG_S *pstVbConfig)
54 {
55     HI_MPI_SYS_Exit();
56     HI_MPI_VB_Exit();
57 
58     if (pstVbConfig == NULL) {
59         return HI_FAILURE;
60     }
61 
62     HI_S32 ret = HI_MPI_VB_SetConfig(pstVbConfig);
63     if (ret != HI_SUCCESS) {
64         return HI_FAILURE;
65     }
66 
67     ret = HI_MPI_VB_Init();
68     if (ret != HI_SUCCESS) {
69         return HI_FAILURE;
70     }
71 
72     ret = HI_MPI_SYS_Init();
73     if (ret != HI_SUCCESS) {
74         HI_MPI_VB_Exit();
75         return HI_FAILURE;
76     }
77 
78     return HI_SUCCESS;
79 }
80 
HI_MW_Sys_Init(HI_VOID)81 static HI_S32 HI_MW_Sys_Init(HI_VOID)
82 {
83     VB_CONFIG_S vbConf = { 0 };
84     vbConf.u32MaxPoolCnt = 1;
85     vbConf.astCommPool[0].u64BlkSize = 1920 * 1080 * 2; /* 1920/1080/2: calculate block buf size */
86     vbConf.astCommPool[0].u32BlkCnt = 4; /* 4: block cnt */
87     HI_S32 ret = SAMPLE_COMM_SYS_Init(&vbConf);
88     if (ret != HI_SUCCESS) {
89         return ret;
90     }
91 
92     return HI_SUCCESS;
93 }
94 
SAMPLE_COMM_VO_StartDev(VO_DEV voDev,const VO_PUB_ATTR_S * pstPubAttr)95 HI_S32 SAMPLE_COMM_VO_StartDev(VO_DEV voDev, const VO_PUB_ATTR_S *pstPubAttr)
96 {
97     HI_S32 ret;
98 
99     ret = HI_MPI_VO_SetPubAttr(voDev, pstPubAttr);
100     if (ret != HI_SUCCESS) {
101         return HI_FAILURE;
102     }
103 
104     ret = HI_MPI_VO_Enable(voDev);
105     if (ret != HI_SUCCESS) {
106         return HI_FAILURE;
107     }
108 
109     return ret;
110 }
111 
SAMPLE_COMM_VO_HdmiConvertSync(VO_INTF_SYNC_E enIntfSync,HI_HDMI_VIDEO_FMT_E * penVideoFmt)112 HI_VOID SAMPLE_COMM_VO_HdmiConvertSync(VO_INTF_SYNC_E enIntfSync, HI_HDMI_VIDEO_FMT_E *penVideoFmt)
113 {
114     if (penVideoFmt == NULL) {
115         return;
116     }
117     switch (enIntfSync) {
118         case VO_OUTPUT_PAL:
119             *penVideoFmt = HI_HDMI_VIDEO_FMT_PAL;
120             break;
121         case VO_OUTPUT_NTSC:
122             *penVideoFmt = HI_HDMI_VIDEO_FMT_NTSC;
123             break;
124         case VO_OUTPUT_1080P24:
125             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_24;
126             break;
127         case VO_OUTPUT_1080P25:
128             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_25;
129             break;
130         case VO_OUTPUT_1080P30:
131             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_30;
132             break;
133         case VO_OUTPUT_720P50:
134             *penVideoFmt = HI_HDMI_VIDEO_FMT_720P_50;
135             break;
136         case VO_OUTPUT_720P60:
137             *penVideoFmt = HI_HDMI_VIDEO_FMT_720P_60;
138             break;
139         case VO_OUTPUT_1080I50:
140             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080i_50;
141             break;
142         case VO_OUTPUT_1080I60:
143             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080i_60;
144             break;
145         case VO_OUTPUT_1080P50:
146             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_50;
147             break;
148         case VO_OUTPUT_1080P60:
149             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_60;
150             break;
151         case VO_OUTPUT_576P50:
152             *penVideoFmt = HI_HDMI_VIDEO_FMT_576P_50;
153             break;
154         case VO_OUTPUT_480P60:
155             *penVideoFmt = HI_HDMI_VIDEO_FMT_480P_60;
156             break;
157         case VO_OUTPUT_800x600_60:
158             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_800X600_60;
159             break;
160         case VO_OUTPUT_1024x768_60:
161             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1024X768_60;
162             break;
163         case VO_OUTPUT_1280x1024_60:
164             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1280X1024_60;
165             break;
166         case VO_OUTPUT_1366x768_60:
167             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1366X768_60;
168             break;
169         case VO_OUTPUT_1440x900_60:
170             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1440X900_60;
171             break;
172         case VO_OUTPUT_1280x800_60:
173             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1280X800_60;
174             break;
175         case VO_OUTPUT_1920x2160_30:
176             *penVideoFmt = HI_HDMI_VIDEO_FMT_1920x2160_30;
177             break;
178         case VO_OUTPUT_1600x1200_60:
179             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1600X1200_60;
180             break;
181         case VO_OUTPUT_1920x1200_60:
182             *penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1920X1200_60;
183             break;
184         case VO_OUTPUT_2560x1440_30:
185             *penVideoFmt = HI_HDMI_VIDEO_FMT_2560x1440_30;
186             break;
187         case VO_OUTPUT_2560x1600_60:
188             *penVideoFmt = HI_HDMI_VIDEO_FMT_2560x1600_60;
189             break;
190         case VO_OUTPUT_3840x2160_30:
191             *penVideoFmt = HI_HDMI_VIDEO_FMT_3840X2160P_30;
192             break;
193         case VO_OUTPUT_3840x2160_60:
194             *penVideoFmt = HI_HDMI_VIDEO_FMT_3840X2160P_60;
195             break;
196         default:
197             *penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_60;
198             break;
199     }
200 
201     return;
202 }
203 
SAMPLE_COMM_VO_HdmiStart(VO_INTF_SYNC_E enIntfSync)204 HI_S32 SAMPLE_COMM_VO_HdmiStart(VO_INTF_SYNC_E enIntfSync)
205 {
206     HI_HDMI_ATTR_S stAttr;
207     HI_HDMI_VIDEO_FMT_E enVideoFmt;
208     HI_HDMI_ID_E enHdmiId = HI_HDMI_ID_0;
209 
210     SAMPLE_COMM_VO_HdmiConvertSync(enIntfSync, &enVideoFmt);
211 
212     CHECK_RET(HI_MPI_HDMI_Init(), "HI_MPI_HDMI_Init");
213     CHECK_RET(HI_MPI_HDMI_Open(enHdmiId), "HI_MPI_HDMI_Open");
214     CHECK_RET(HI_MPI_HDMI_GetAttr(enHdmiId, &stAttr), "HI_MPI_HDMI_GetAttr");
215     stAttr.bEnableHdmi = HI_TRUE;
216     stAttr.bEnableVideo = HI_TRUE;
217     stAttr.enVideoFmt = enVideoFmt;
218     stAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
219     stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_24BIT;
220     stAttr.bxvYCCMode = HI_FALSE;
221     stAttr.enOutCscQuantization = HDMI_QUANTIZATION_LIMITED_RANGE;
222 
223     stAttr.bEnableAudio = HI_FALSE;
224     stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
225     stAttr.bIsMultiChannel = HI_FALSE;
226 
227     stAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
228 
229     stAttr.bEnableAviInfoFrame = HI_TRUE;
230     stAttr.bEnableAudInfoFrame = HI_TRUE;
231     stAttr.bEnableSpdInfoFrame = HI_FALSE;
232     stAttr.bEnableMpegInfoFrame = HI_FALSE;
233 
234     stAttr.bDebugFlag = HI_FALSE;
235     stAttr.bHDCPEnable = HI_FALSE;
236 
237     stAttr.b3DEnable = HI_FALSE;
238     stAttr.enDefaultMode = HI_HDMI_FORCE_HDMI;
239 
240     CHECK_RET(HI_MPI_HDMI_SetAttr(enHdmiId, &stAttr), "HI_MPI_HDMI_SetAttr");
241     CHECK_RET(HI_MPI_HDMI_Start(enHdmiId), "HI_MPI_HDMI_Start");
242 
243     return HI_SUCCESS;
244 }
245 
HI_MW_DISP_Open(HI_VOID)246 HI_S32 HI_MW_DISP_Open(HI_VOID)
247 {
248     HI_S32 ret;
249     VO_PUB_ATTR_S pubAttr;
250     const VO_DEV voDev = 0;
251 
252     ret = HI_MW_Sys_Init();
253     if (ret != HI_SUCCESS) {
254         return HI_FAILURE;
255     }
256 
257     pubAttr.u32BgColor = 0x000000ff; /* 0x000000ff: bg color value */
258     pubAttr.enIntfType = VO_INTF_HDMI;
259     pubAttr.enIntfSync = VO_OUTPUT_1080P30;
260 
261     if (SAMPLE_COMM_VO_StartDev(voDev, &pubAttr) != HI_SUCCESS) {
262         return HI_FAILURE;
263     }
264 
265     ret = SAMPLE_COMM_VO_HdmiStart(pubAttr.enIntfSync);
266     if (ret != HI_SUCCESS) {
267         return HI_FAILURE;
268     }
269 
270     return ret;
271 }
272 
SAMPLE_COMM_VO_Exit(void)273 HI_VOID SAMPLE_COMM_VO_Exit(void)
274 {
275     HI_S32 i, j;
276     for (i = 0; i < VO_MAX_LAYER_NUM; i++) {
277         for (j = 0; j < VO_MAX_CHN_NUM; j++) {
278             HI_MPI_VO_DisableChn(i, j);
279         }
280     }
281 
282     for (i = 0; i < VO_MAX_LAYER_NUM; i++) {
283         HI_MPI_VO_DisableVideoLayer(i);
284     }
285 
286     for (i = 0; i < VO_MAX_DEV_NUM; i++) {
287         HI_MPI_VO_Disable(i);
288     }
289 }
290 
SAMPLE_COMM_SYS_Exit(void)291 HI_VOID SAMPLE_COMM_SYS_Exit(void)
292 {
293     SAMPLE_COMM_VO_Exit();
294     HI_MPI_SYS_Exit();
295     HI_MPI_VB_ExitModCommPool(VB_UID_VDEC);
296     HI_MPI_VB_Exit();
297     return;
298 }
299 
HI_MW_Sys_Deinit(HI_VOID)300 static HI_S32 HI_MW_Sys_Deinit(HI_VOID)
301 {
302     SAMPLE_COMM_SYS_Exit();
303     return HI_SUCCESS;
304 }
305 
HI_MW_DISP_Close(HI_VOID)306 HI_S32 HI_MW_DISP_Close(HI_VOID)
307 {
308     HI_S32 ret = HI_MW_Sys_Deinit();
309     if (ret != HI_SUCCESS) {
310         return HI_FAILURE;
311     }
312 
313     return ret;
314 }
315 
HI_MW_DISP_SetDisplayGraphicCSC()316 HI_S32 HI_MW_DISP_SetDisplayGraphicCSC()
317 {
318     return HI_SUCCESS;
319 }
320