1
2
3 #ifdef MSOS_TYPE_LINUX_KERNEL
4 #include <linux/string.h>
5 #include <linux/module.h>
6 #include <linux/kernel.h>
7 #else
8 #include <string.h>
9 #include <stdio.h>
10 #endif
11 #include "MsTypes.h"
12 #include "utopia_dapi.h"
13 #include "gpd.h"
14 #include "apiGPD.h"
15 #include "MsOS.h"
16
17 #include "utopia.h"
18 #include "apiGPD_priv.h"
19 #include "apiGPD_v2.h"
20
21
22
23 enum
24 {
25 GPD_POOL_ID_GPD0=0,
26 GPD_POOL_ID_GPD_MAX
27 } eGPDPoolID;
28
29 #if (defined CONFIG_MLOG)
30 #include "ULog.h"
31
32 #define GPD_API_ERROR(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_ERROR) ULOGE("API_GPD", format, ##args);}while(0)
33 #define GPD_API_INFO(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_INFO) ULOGI("API_GPD", format, ##args);}while(0)
34 #else
35
36 #ifdef ANDROID
37 #ifndef LOGD
38 #define GPD_API_ERROR(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_ERROR) ALOGE(format, ##args);}while(0)
39 #define GPD_API_INFO(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_INFO) ALOGI(format, ##args);}while(0)
40 #else
41 #define GPD_API_ERROR(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_ERROR) LOGE(format, ##args);}while(0)
42 #define GPD_API_INFO(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_INFO) LOGI(format, ##args);}while(0)
43 #endif
44 #else
45 #ifdef MSOS_TYPE_LINUX_KERNEL
46 #define GPD_API_ERROR(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_ERROR) printk(format, ##args);}while(0)
47 #define GPD_API_INFO(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_INFO) printk(format, ##args);}while(0)
48 #else
49 #define GPD_API_ERROR(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_ERROR) printf(format, ##args);}while(0)
50 #define GPD_API_INFO(format, args...) do{if(eEnableDbgMsg & E_GPD_DEBUG_LEVEL_INFO) printf(format, ##args);}while(0)
51 #endif
52 #endif
53
54 #endif
55
56 #define GPD_SUSPEND_TIMEOUT 1000
57
58 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
59 #include "utopia_dapi.h"
60
GPDMdbIoctl(MS_U32 u32Cmd,const void * const pArgs)61 MS_U32 GPDMdbIoctl(MS_U32 u32Cmd, const void* const pArgs)
62 {
63 MDBCMD_CMDLINE_PARAMETER *paraCmdLine;
64 MDBCMD_GETINFO_PARAMETER *paraGetInfo;
65
66 switch(u32Cmd)
67 {
68 case MDBCMD_CMDLINE:
69 paraCmdLine = (MDBCMD_CMDLINE_PARAMETER *)pArgs;
70 break;
71 case MDBCMD_GETINFO:
72 paraGetInfo = (MDBCMD_GETINFO_PARAMETER *)pArgs;
73 _MApi_GPD_GetMdbInfo(paraGetInfo->u64ReqHdl);
74 break;
75 default:
76 break;
77 }
78 return 0;
79 }
80 #endif
81
82 // this func will be call to init by utopia20 framework
GPDRegisterToUtopia(FUtopiaOpen ModuleType)83 void GPDRegisterToUtopia(FUtopiaOpen ModuleType)
84 {
85 GPD_API_INFO("%s(): start\n", __FUNCTION__);
86 // 1. deal with module
87 void* pModuleGPD_V2 = NULL;
88 UtopiaModuleCreate(MODULE_GPD, 0, &pModuleGPD_V2);
89 UtopiaModuleRegister(pModuleGPD_V2);
90 // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
91 UtopiaModuleSetupFunctionPtr(pModuleGPD_V2,
92 (FUtopiaOpen)GPDOpen,
93 (FUtopiaClose)GPDClose,
94 (FUtopiaIOctl)GPDIoctl);
95
96 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
97 UtopiaModuleRegisterMdbNode("gpd", (FUtopiaMdbIoctl)GPDMdbIoctl);
98 #endif
99
100 #if defined(MSOS_TYPE_LINUX_KERNEL)
101 UtopiaModuleSetupSTRFunctionPtr(pModuleGPD_V2,(FUtopiaSTR)GPDStr);
102 UtopiaModuleSetSTRPrivate(pModuleGPD_V2, sizeof(GPD_INSTANCE_PRIVATE));
103 #endif
104
105 // 2. deal with resource
106 void* psResource = NULL;
107 UtopiaModuleAddResourceStart(pModuleGPD_V2, GPD_POOL_ID_GPD0);
108 UtopiaResourceCreate("GPD", sizeof(GPD_RESOURCE_PRIVATE), &psResource);
109 UtopiaResourceRegister(pModuleGPD_V2, psResource, GPD_POOL_ID_GPD0);
110 UtopiaModuleAddResourceEnd(pModuleGPD_V2, GPD_POOL_ID_GPD0);
111 GPD_API_INFO("%s(): end\n", __FUNCTION__);
112
113 }
114
GPDOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)115 MS_U32 GPDOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
116 {
117 GPD_INSTANCE_PRIVATE* psGPD_InstPri = NULL;
118 MS_U8 i = 0;
119 GPD_API_INFO("%s(): start...\n", __FUNCTION__);
120
121
122 //Create instance
123 UtopiaInstanceCreate(sizeof(GPD_INSTANCE_PRIVATE), ppInstance);
124 UtopiaInstanceGetPrivate(*ppInstance, (void**)&psGPD_InstPri);
125
126 //Recode decoder index
127 psGPD_InstPri->Index_of_decoder = i;
128
129 #ifdef UTOPIA_20
130 psGPD_InstPri->fpGPDInit = (IOCTL_GPD_INIT)_MApi_GPD_Init;
131 psGPD_InstPri->fpGPDInputSource = (IOCTL_GPD_INPUT_SOURCE)_MApi_GPD_InputSource;
132 psGPD_InstPri->fpGPDOutputDecode = (IOCTL_GPD_OUTPUT_DECODE)_MApi_GPD_OutputDecode;
133 psGPD_InstPri->fpGPDOutputDecodeROI = (IOCTL_GPD_OUTPUT_DECODE_ROI)_MApi_GPD_OutputDecodeROI;
134 psGPD_InstPri->fpGPDOutputDecodeMGIF = (IOCTL_GPD_OUTPUT_DECODE_MGIF)_MApi_GPD_OutputDecodeMGIF;
135 psGPD_InstPri->fpGPDGetDuration = (IOCTL_GPD_GET_DURATION)_MApi_GPD_GetDuration;
136 psGPD_InstPri->fpGPDSetGIFMode = (IOCTL_GPD_SET_GIF_MODE)_MApi_GPD_SetGIFMode;
137 psGPD_InstPri->fpGPDScalingEnable = (IOCTL_GPD_SCALING_ENABLE)_MApi_GPD_ScalingEnable;
138 psGPD_InstPri->fpGPDScalingDisable = (IOCTL_GPD_SCALING_DISABLE)_MApi_GPD_ScalingDisable;
139 psGPD_InstPri->fpGPDSetControl = (IOCTL_GPD_SET_CONTROL)_MApi_GPD_SetControl;
140 psGPD_InstPri->fpGPDGetControl = (IOCTL_GPD_GET_CONTROL)_MApi_GPD_GetControl;
141 psGPD_InstPri->fpGPDGetCRCResult = (IOCTL_GPD_GET_CRC_RESULT)_MApi_GPD_GetCRCResult;
142 #endif
143 void* pModuleGPD_V2;
144 UtopiaModuleGetPtr(MODULE_GPD,&pModuleGPD_V2);
145
146 // Check there is available decoder to be use
147 if(UtopiaResourceObtain(pModuleGPD_V2, GPD_POOL_ID_GPD0, &psGPD_InstPri->pResource) != UTOPIA_STATUS_SUCCESS)
148 {
149 GPD_API_ERROR("UtopiaResourceObtain fail,%s,%d\n",__FUNCTION__,__LINE__);
150 return UTOPIA_STATUS_ERR_RESOURCE;
151 }
152 UtopiaResourceRelease(psGPD_InstPri->pResource);
153 GPD_API_INFO("%s(): end\n", __FUNCTION__);
154
155 #if defined(MSOS_TYPE_LINUX_KERNEL)
156 GPD_INSTANCE_PRIVATE* psGPD_STR_InstPri = NULL;
157 UtopiaModuleGetSTRPrivate(pModuleGPD_V2, (void**)&psGPD_STR_InstPri);
158 psGPD_STR_InstPri->bGPDInUse = TRUE;
159 psGPD_STR_InstPri->bGPDSuspend = FALSE;
160 #endif
161
162 return UTOPIA_STATUS_SUCCESS;
163 }
164
165
GPDIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)166 MS_U32 GPDIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
167 {
168 #ifdef UTOPIA_20
169 GPD_INSTANCE_PRIVATE* psGPD_InstPri = NULL;
170 UtopiaInstanceGetPrivate(pInstance, (void*)&psGPD_InstPri);
171 E_GPD_V2_IOCTL_CMD IOcmd = (E_GPD_V2_IOCTL_CMD)u32Cmd;
172 MS_U32 ret = UTOPIA_STATUS_SUCCESS;
173
174 PGPD_INIT_PARAM pInit = NULL;
175 PGPD_INPUTSOURCE_PARAM pInputSource = NULL;
176 PGPD_OUTPUTDECODE_PARAM pOutputDecode = NULL;
177 PGPD_OUTPUTDECODEROI_PARAM pOutputDecodeROI = NULL;
178 PGPD_GETDURATION_PARAM pGetDuration = NULL;
179 PGPD_SETGIFMODE_PARAM pSetGIFMode = NULL;
180 PGPD_SCALINGENABLE_PARAM pScalingEnable = NULL;
181 PGPD_CONTROL_PARAM pControl = NULL;
182 PGPD_GET_CONTROL_PARAM pGetControl = NULL;
183 PGPD_GETCRCRESULT_PARAM pGetCRCResult = NULL;
184
185 switch(IOcmd)
186 {
187 case MApi_CMD_GPD_Init:
188 pInit = (PGPD_INIT_PARAM)pArgs;
189 pInit->retVal = psGPD_InstPri->fpGPDInit(pInit->SrcBuf);
190 break;
191 case MApi_CMD_GPD_InputSource:
192 pInputSource = (PGPD_INPUTSOURCE_PARAM)pArgs;
193 pInputSource->retVal = psGPD_InstPri->fpGPDInputSource(pInputSource->param, pInputSource->InputBuf, pInputSource->Size);
194 break;
195 case MApi_CMD_GPD_OutputDecode:
196 pOutputDecode = (PGPD_OUTPUTDECODE_PARAM)pArgs;
197 pOutputDecode->retVal = psGPD_InstPri->fpGPDOutputDecode(pOutputDecode->DecodeBuf, pOutputDecode->ocolor, pOutputDecode->Size);
198 break;
199 case MApi_CMD_GPD_OutputDecodeROI:
200 pOutputDecodeROI = (PGPD_OUTPUTDECODEROI_PARAM)pArgs;
201 pOutputDecodeROI->retVal = psGPD_InstPri->fpGPDOutputDecodeROI(pOutputDecodeROI->DecodeBuf, pOutputDecodeROI->ocolor, pOutputDecodeROI->Size, pOutputDecodeROI->roi);
202 break;
203 case MApi_CMD_GPD_OutputDecodeMGIF:
204 pOutputDecode= (PGPD_OUTPUTDECODE_PARAM)pArgs;
205 pOutputDecode->retVal = psGPD_InstPri->fpGPDOutputDecodeMGIF(pOutputDecode->DecodeBuf, pOutputDecode->ocolor, pOutputDecode->Size);
206 break;
207 case MApi_CMD_GPD_GetDuration:
208 pGetDuration = (PGPD_GETDURATION_PARAM)pArgs;
209 pGetDuration->retVal = psGPD_InstPri->fpGPDGetDuration();
210 break;
211 case MApi_CMD_GPD_SetGIFMode:
212 pSetGIFMode = (PGPD_SETGIFMODE_PARAM)pArgs;
213 psGPD_InstPri->fpGPDSetGIFMode(pSetGIFMode->mode);
214 break;
215 case MApi_CMD_GPD_ScalingEnable:
216 pScalingEnable = (PGPD_SCALINGENABLE_PARAM)pArgs;
217 psGPD_InstPri->fpGPDScalingEnable(pScalingEnable->mode);
218 break;
219 case MApi_CMD_GPD_ScalingDisable:
220 psGPD_InstPri->fpGPDScalingDisable();
221 break;
222 case MApi_CMD_GPD_SetControl:
223 pControl = (PGPD_CONTROL_PARAM)pArgs;
224 pControl->retVal = psGPD_InstPri->fpGPDSetControl(pControl->cmd_id, pControl->param);
225 break;
226 case MApi_CMD_GPD_GetControl:
227 pGetControl = (PGPD_GET_CONTROL_PARAM)pArgs;
228 pGetControl->retVal = psGPD_InstPri->fpGPDGetControl(pGetControl->cmd_id, pGetControl->param);
229 break;
230 case MApi_CMD_GPD_GetCRCResult:
231 pGetCRCResult = (PGPD_GETCRCRESULT_PARAM)pArgs;
232 pGetCRCResult->retVal = psGPD_InstPri->fpGPDGetCRCResult(pGetCRCResult->pu8Data, pGetCRCResult->u32Size);
233 break;
234
235 default:
236 ret = UTOPIA_STATUS_NOT_SUPPORTED;
237 GPD_API_ERROR("Error Command = %td\n",(ptrdiff_t)u32Cmd);
238
239 break;
240
241 }
242 return ret;
243 #else
244 return UTOPIA_STATUS_SUCCESS;
245 #endif
246 }
GPDClose(void * pInstance)247 MS_U32 GPDClose(void* pInstance)
248 {
249 GPD_RESOURCE_PRIVATE* pGPD_ResourcePrivate = NULL;
250 GPD_INSTANCE_PRIVATE* psGPD_InstPri = NULL;
251 GPD_API_INFO("%s(): start\n", __FUNCTION__);
252 void* pModuleGPD_V2 = NULL;
253 UtopiaModuleGetPtr(MODULE_GPD, &pModuleGPD_V2);
254
255 // Get instance private
256 UtopiaInstanceGetPrivate(pInstance, (void**)&psGPD_InstPri);
257
258
259 UtopiaResourceGetPrivate(psGPD_InstPri->pResource,(void*)(&pGPD_ResourcePrivate));
260
261 // Set using decoder index to 0
262 pGPD_ResourcePrivate->u8DecoderInUse[psGPD_InstPri->Index_of_decoder] = 0;
263
264 UtopiaResourceRelease(psGPD_InstPri->pResource);
265
266 UtopiaInstanceDelete(pInstance);
267 GPD_API_INFO("%s(): end\n", __FUNCTION__);
268
269 #if defined(MSOS_TYPE_LINUX_KERNEL)
270 GPD_INSTANCE_PRIVATE* psGPD_STR_InstPri = NULL;
271 UtopiaModuleGetSTRPrivate(pModuleGPD_V2, (void**)&psGPD_STR_InstPri);
272 psGPD_STR_InstPri->bGPDInUse = FALSE;
273 psGPD_STR_InstPri->bGPDSuspend = FALSE;
274 #endif
275
276 return UTOPIA_STATUS_SUCCESS;
277 }
278
279
GPDStr(MS_U32 u32PowerState,void * pModule)280 MS_U32 GPDStr(MS_U32 u32PowerState, void* pModule)
281 {
282 #ifdef UTOPIA_20
283 MS_U32 u32Return = UTOPIA_STATUS_FAIL;
284
285 #if defined(MSOS_TYPE_LINUX_KERNEL)
286 GPD_INSTANCE_PRIVATE* psGPD_STR_InstPri = NULL;
287 UtopiaModuleGetSTRPrivate(pModule, (void**)&psGPD_STR_InstPri);
288
289 if (u32PowerState == E_POWER_SUSPEND)
290 {
291 MS_U32 u32Time=MsOS_GetSystemTime();
292 while(1)
293 {
294 if(psGPD_STR_InstPri->bGPDInUse==FALSE)
295 {
296 psGPD_STR_InstPri->bGPDSuspend = TRUE;
297 return UTOPIA_STATUS_SUCCESS;
298 }
299 if((MsOS_GetSystemTime() - u32Time) >= GPD_SUSPEND_TIMEOUT)
300 {
301 GPD_API_INFO("Suspend request Timeout!!!, force suspend()\n");
302 psGPD_STR_InstPri->bGPDSuspend = TRUE;
303 return UTOPIA_STATUS_SUCCESS;
304 }
305 else if(u32Time > MsOS_GetSystemTime()) // For the overflow case
306 {
307 u32Time = 0;
308 }
309 MsOS_DelayTask(1);
310 }
311 /* Please Implement Module Suspend Flow Here. */
312 u32Return = UTOPIA_STATUS_SUCCESS;//SUSPEND_OK;
313 }
314 else if (u32PowerState == E_POWER_RESUME)
315 {
316 if(psGPD_STR_InstPri->bGPDSuspend == FALSE)
317 {
318 GPD_API_INFO("Resume fail!!! Not in suspend state!!!\n");
319 u32Return = UTOPIA_STATUS_FAIL;
320 }
321 psGPD_STR_InstPri->bGPDSuspend = FALSE;
322 /* Please Implement Module Resume Flow Here. */
323 u32Return = UTOPIA_STATUS_SUCCESS;//RESUME_OK;
324 }
325 else
326 {
327 u32Return = UTOPIA_STATUS_FAIL;
328 }
329 #endif
330 return u32Return;// for success
331 #else
332 return UTOPIA_STATUS_SUCCESS;
333 #endif
334 }
335