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