xref: /utopia/UTPA2-700.0.x/modules/gpd/api/gpd/apiGPD_v2.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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