1 #include "utopia_private.h"
2 #include <stdio.h>
3 #include "utopia.h"
4 #include "utopia_module.h"
5 #include "utopia_dapi.h"
6 #include "string.h"
7 #include "MsOS.h"
8 #include "MsCommon.h"
9
10 //Global Variable===================================================
11 UTOPIA_PRIVATE* psUtopiaPrivate;
12
13 char moduleNames[][40] = {
14 #define PREFIX(MODULE) "MODULE_"#MODULE,
15 INCLUDED_MODULE
16 #undef PREFIX
17 };
18
19 char rpoolNames[][40] = {
20 #define PREFIX(MODULE) "RPOOL_"#MODULE,
21 INCLUDED_MODULE
22 #undef PREFIX
23 };
24
25 char ResourceNames[][40] = {
26 #define PREFIX(MODULE) "RESOURCE_"#MODULE,
27 INCLUDED_MODULE
28 #undef PREFIX
29 };
30
31 void BDMARegisterToUtopia(FUtopiaOpen ModuleType);
32 #if defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_KANO)
33 void CPURegisterToUtopia(FUtopiaOpen ModuleType);
34 void FLASHRegisterToUtopia(FUtopiaOpen ModuleType);
35 void IRRegisterToUtopia(FUtopiaOpen ModuleType);
36 void MBXRegisterToUtopia(FUtopiaOpen ModuleType);
37 void MVOPRegisterToUtopia(FUtopiaOpen ModuleType);
38 void MSPIRegisterToUtopia(FUtopiaOpen ModuleType);
39 void PWMRegisterToUtopia(FUtopiaOpen ModuleType);
40 void PWSRegisterToUtopia(FUtopiaOpen ModuleType);
41 void RTCRegisterToUtopia(FUtopiaOpen ModuleType);
42 void SARRegisterToUtopia(FUtopiaOpen ModuleType);
43
44 #if defined(CHIP_KERES) || defined(CHIP_KIRIN)
45 void CH34RegisterToUtopia(FUtopiaOpen ModuleType);
46 void VBIRegisterToUtopia(FUtopiaOpen ModuleType);
47 #endif
48
49 void ACERegisterToUtopia(FUtopiaOpen ModuleType);
50 void DLCRegisterToUtopia(FUtopiaOpen ModuleType);
51 void DMXRegisterToUtopia(FUtopiaOpen ModuleType);
52 void GFXRegisterToUtopia(FUtopiaOpen ModuleType);
53 void GOPRegisterToUtopia(FUtopiaOpen ModuleType);
54 void PNLRegisterToUtopia(FUtopiaOpen ModuleType);
55 void XCRegisterToUtopia(FUtopiaOpen ModuleType);
56
57 void VDEC_EXRegisterToUtopia(FUtopiaOpen ModuleType);
58 void SYSRegisterToUtopia(FUtopiaOpen ModuleType);
59 void UARTRegisterToUtopia(FUtopiaOpen ModuleType);
60 void TVENCODERRegisterToUtopia(FUtopiaOpen ModuleType);
61 #ifdef CONFIG_API_JPEG_EX
62 void JPEG_EXRegisterToUtopia(FUtopiaOpen ModuleType);
63 #endif
64 #ifdef CONFIG_API_NJPEG_EX
65 void NJPEG_EXRegisterToUtopia(FUtopiaOpen ModuleType);
66 #endif
67 void GPDRegisterToUtopia(FUtopiaOpen ModuleType);
68
69 void DACRegisterToUtopia(void);
70 void SEMRegisterToUtopia(void);
71 void DSCMBRegisterToUtopia(void);
72 void AESDMARegisterToUtopia(FUtopiaOpen ModuleType);
73 void ACPRegisterToUtopia(FUtopiaOpen ModuleType);
74 void HDMITXRegisterToUtopia(FUtopiaOpen ModuleType);
75 void CECRegisterToUtopia(FUtopiaOpen ModuleType);
76
77 #endif
78
UtopiaInit()79 MS_U32 UtopiaInit()
80 {
81 MS_U32 u32Ret = 0;
82 printf("\033[35m[eCos] UtopiaInit\033[m\n\n");
83
84 psUtopiaPrivate = (UTOPIA_PRIVATE*)malloc(sizeof(UTOPIA_PRIVATE));
85 memset(psUtopiaPrivate, 0, sizeof(UTOPIA_PRIVATE));
86 psUtopiaPrivate->u32MutexID = MsOS_CreateMutex(E_MSOS_FIFO, "UtopiaPrivateMutex", MSOS_PROCESS_SHARED);
87
88 MsOS_ObtainMutex(psUtopiaPrivate->u32MutexID, MSOS_WAIT_FOREVER);
89
90 /*
91 * to avoid weak attribute malfunction in static lib,
92 * we explicitly call needed functions
93 */
94 UTOPIARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_UTOPIA_FULL);
95 BDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_BDMA_FULL);
96
97 #if defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_KANO)
98 CPURegisterToUtopia((FUtopiaOpen)MODULE_TYPE_CPU_FULL);
99 MBXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_MBX_FULL);
100 SYSRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_SYS_FULL);
101 UARTRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_UART_FULL);
102 #if 0 // Below is not necessary for ucos
103 FLASHRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_FLASH_FULL);
104 IRRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_IR_FULL);
105 MVOPRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_MVOP_FULL);
106 MSPIRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_MSPI_FULL);
107 PWMRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_PWM_FULL);
108 PWSRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_PWS_FULL);
109 RTCRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_RTC_FULL);
110 SARRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_SAR_FULL);
111 CECRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_CEC_FULL);
112 ACERegisterToUtopia((FUtopiaOpen)MODULE_TYPE_ACE_FULL);
113 DLCRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_DLC_FULL);
114 DMXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_DMX_FULL);
115 GFXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_GFX_FULL);
116 GOPRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_GOP_FULL);
117 PNLRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_PNL_FULL);
118 XCRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_XC_FULL);
119
120 #if defined(CHIP_KERES) || defined(CHIP_KIRIN)
121 CH34RegisterToUtopia((FUtopiaOpen)MODULE_TYPE_CH34_FULL);
122 VBIRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_VBI_FULL);
123 #endif
124 VDEC_EXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_VDEC_EX_FULL);
125 TVENCODERRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_TVENCODER_FULL);
126 #ifdef CONFIG_API_JPEG_EX
127 JPEG_EXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_NJPEG_EX_FULL);
128 #endif
129 #ifdef CONFIG_API_NJPEG_EX
130 NJPEG_EXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_NJPEG_EX_FULL);
131 #endif
132 GPDRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_GPD_FULL);
133
134 DACRegisterToUtopia();
135 SEMRegisterToUtopia();
136 DSCMBRegisterToUtopia();
137 AESDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_AESDMA_FULL);
138 ACPRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_ACP_FULL);
139 HDMITXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_HDMITX_FULL);
140 #endif
141 #endif
142
143 MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
144
145 return u32Ret;
146 }
147
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)148 MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
149 , MS_U32 u32ModuleVersion, const void* const pAttribute)
150 {
151 UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
152 UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
153
154 while(psUtopiaModule != NULL)
155 {
156 if(psUtopiaModule->u32ModuleID == u32ModuleID)
157 {
158 int ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
159
160 if(ret)
161 {
162 printf("[utopia error] fail to create instance\n");
163 return ret;
164 }
165
166 (*ppInstance)->psModule = psUtopiaModule;
167 (*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
168 return ret;
169 }
170 psUtopiaModule = psUtopiaModule->psNext;
171 }
172
173 printf("\033[35mFunction = %s, Line = %d, UtopiaOpen strange failed\033[m\n", __FUNCTION__, __LINE__);
174
175 return UTOPIA_STATUS_FAIL;
176 }
177
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)178 MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
179 {
180 UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
181 /* check param. */
182 if (pInstance == NULL)
183 {
184 printf("[utopia error] instance pointer should not be null\n");
185 return UTOPIA_STATUS_FAIL;
186 }
187
188 return TO_INSTANCE_PTR(pInstance)->psModule->fpIoctl(pInstance, u32Cmd, pArgs);
189 }
190
UtopiaClose(void * pInstantTmp)191 MS_U32 UtopiaClose(void* pInstantTmp)
192 {
193 UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
194
195 printf("\n[utopia info] close module id: %s\n",
196 moduleNames[pInstant->psModule->u32ModuleID]);
197
198 UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
199 while(psUtopiaModule != NULL)
200 {
201 if(psUtopiaModule->u32ModuleID == pInstant->psModule->u32ModuleID)
202 {
203 return psUtopiaModule->fpClose(pInstant);
204 }
205 psUtopiaModule = psUtopiaModule->psNext;
206 }
207 return 0;
208 }
209