1*53ee8cc1Swenshuai.xi
2*53ee8cc1Swenshuai.xi //************************Kernel Module Define********************************//
3*53ee8cc1Swenshuai.xi //Please Don't Change Code Order.
4*53ee8cc1Swenshuai.xi #include "MsTypes.h"
5*53ee8cc1Swenshuai.xi #include "utopia_driver_id.h"
6*53ee8cc1Swenshuai.xi
7*53ee8cc1Swenshuai.xi #if 0
8*53ee8cc1Swenshuai.xi typedef enum{
9*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) CONFIG_API_##MODULE##_MODULE=0,
10*53ee8cc1Swenshuai.xi INCLUDED_MODULE
11*53ee8cc1Swenshuai.xi #undef PREFIX
12*53ee8cc1Swenshuai.xi }eCONFIG_API_MODULE;
13*53ee8cc1Swenshuai.xi
14*53ee8cc1Swenshuai.xi typedef enum{
15*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) CONFIG_DRV_##MODULE##_MODULE=0,
16*53ee8cc1Swenshuai.xi INCLUDED_MODULE
17*53ee8cc1Swenshuai.xi #undef PREFIX
18*53ee8cc1Swenshuai.xi }eCONFIG_DRV_MODULE;
19*53ee8cc1Swenshuai.xi #endif
20*53ee8cc1Swenshuai.xi
21*53ee8cc1Swenshuai.xi #ifdef CONFIG_ENABLE_MENUCONFIG
22*53ee8cc1Swenshuai.xi #include <autoconf.h>
23*53ee8cc1Swenshuai.xi #endif
24*53ee8cc1Swenshuai.xi //*************************************************************************//
25*53ee8cc1Swenshuai.xi
26*53ee8cc1Swenshuai.xi #include "MsCommon.h"
27*53ee8cc1Swenshuai.xi #include "utopia_private.h"
28*53ee8cc1Swenshuai.xi #include "utopia.h"
29*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
30*53ee8cc1Swenshuai.xi #include "MsOS.h"
31*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
32*53ee8cc1Swenshuai.xi
33*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
34*53ee8cc1Swenshuai.xi #include <sys/ioctl.h>
35*53ee8cc1Swenshuai.xi #include <sys/types.h>
36*53ee8cc1Swenshuai.xi #include <sys/stat.h>
37*53ee8cc1Swenshuai.xi #include <fcntl.h>
38*53ee8cc1Swenshuai.xi #include <unistd.h>
39*53ee8cc1Swenshuai.xi #include <errno.h>
40*53ee8cc1Swenshuai.xi #endif
41*53ee8cc1Swenshuai.xi
42*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_LINUX_KERNEL)
43*53ee8cc1Swenshuai.xi #include <stdio.h>
44*53ee8cc1Swenshuai.xi #include <string.h>
45*53ee8cc1Swenshuai.xi #else
46*53ee8cc1Swenshuai.xi #include <linux/string.h>
47*53ee8cc1Swenshuai.xi #include <linux/slab.h>
48*53ee8cc1Swenshuai.xi #endif
49*53ee8cc1Swenshuai.xi
50*53ee8cc1Swenshuai.xi UTOPIA_PRIVATE* psUtopiaPrivate;
51*53ee8cc1Swenshuai.xi
52*53ee8cc1Swenshuai.xi char moduleNames[][40] = {
53*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "MODULE_"#MODULE,
54*53ee8cc1Swenshuai.xi INCLUDED_MODULE
55*53ee8cc1Swenshuai.xi #undef PREFIX
56*53ee8cc1Swenshuai.xi };
57*53ee8cc1Swenshuai.xi
58*53ee8cc1Swenshuai.xi char rpoolNames[][40] = {
59*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "RPOOL_"#MODULE,
60*53ee8cc1Swenshuai.xi INCLUDED_MODULE
61*53ee8cc1Swenshuai.xi #undef PREFIX
62*53ee8cc1Swenshuai.xi };
63*53ee8cc1Swenshuai.xi
64*53ee8cc1Swenshuai.xi char ResourceNames[][40] = {
65*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) "RESOURCE_"#MODULE,
66*53ee8cc1Swenshuai.xi INCLUDED_MODULE
67*53ee8cc1Swenshuai.xi #undef PREFIX
68*53ee8cc1Swenshuai.xi };
69*53ee8cc1Swenshuai.xi
70*53ee8cc1Swenshuai.xi unsigned int moduleMode[] = {
71*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) 0,
72*53ee8cc1Swenshuai.xi INCLUDED_MODULE
73*53ee8cc1Swenshuai.xi #undef PREFIX
74*53ee8cc1Swenshuai.xi };
75*53ee8cc1Swenshuai.xi
76*53ee8cc1Swenshuai.xi #if 0//defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
77*53ee8cc1Swenshuai.xi
78*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) MS_U32 MODULE_##MODULE##_OPEN = MODULE_##MODULE | \
79*53ee8cc1Swenshuai.xi ((CONFIG_API_##MODULE##_MODULE | CONFIG_DRV_##MODULE##_MODULE) << 31);
80*53ee8cc1Swenshuai.xi INCLUDED_MODULE
81*53ee8cc1Swenshuai.xi #undef PREFIX
82*53ee8cc1Swenshuai.xi
83*53ee8cc1Swenshuai.xi #endif
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi #define UTOPIA_VERSION "libutopia-v02.01-20170812"
86*53ee8cc1Swenshuai.xi MS_U32 UTOPIARegisterToUtopia(FUtopiaOpen ModuleType);
87*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) \
88*53ee8cc1Swenshuai.xi extern MS_U32 MODULE##RegisterToUtopia(FUtopiaOpen ModuleType);
89*53ee8cc1Swenshuai.xi _INCLUDED_MODULE
90*53ee8cc1Swenshuai.xi #undef PREFIX
91*53ee8cc1Swenshuai.xi
92*53ee8cc1Swenshuai.xi //#define CONFIG_UTOPIA_MODE_BY_BOOTARQ
93*53ee8cc1Swenshuai.xi
94*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_MODE_BY_BOOTARQ
95*53ee8cc1Swenshuai.xi
96*53ee8cc1Swenshuai.xi #define BOOTARG_SIZE 2048
UtopiaParserBootArg(char * source,char * pattern,unsigned int size)97*53ee8cc1Swenshuai.xi static unsigned int UtopiaParserBootArg(char* source,char* pattern,unsigned int size)
98*53ee8cc1Swenshuai.xi {
99*53ee8cc1Swenshuai.xi char sCmdline[BOOTARG_SIZE]={0};
100*53ee8cc1Swenshuai.xi FILE* fpProcCmdlineFile = NULL;
101*53ee8cc1Swenshuai.xi int u32ReadCount = 0;
102*53ee8cc1Swenshuai.xi char* pFindString = NULL;
103*53ee8cc1Swenshuai.xi char* sTemp = NULL;
104*53ee8cc1Swenshuai.xi
105*53ee8cc1Swenshuai.xi unsigned int u32CmdlineLen = 0;
106*53ee8cc1Swenshuai.xi
107*53ee8cc1Swenshuai.xi
108*53ee8cc1Swenshuai.xi fpProcCmdlineFile = fopen("/proc/cmdline","r");
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi if(fpProcCmdlineFile==NULL)
111*53ee8cc1Swenshuai.xi {
112*53ee8cc1Swenshuai.xi printu("[utopia info]%d : can't open /proc/cmdline",__LINE__);
113*53ee8cc1Swenshuai.xi return 0;
114*53ee8cc1Swenshuai.xi }
115*53ee8cc1Swenshuai.xi
116*53ee8cc1Swenshuai.xi u32ReadCount = fread(sCmdline,1,BOOTARG_SIZE,fpProcCmdlineFile);
117*53ee8cc1Swenshuai.xi
118*53ee8cc1Swenshuai.xi if(u32ReadCount > BOOTARG_SIZE)
119*53ee8cc1Swenshuai.xi {
120*53ee8cc1Swenshuai.xi printu("[utopia info]%d warring : cmdline info more than buffer size\n",__LINE__);
121*53ee8cc1Swenshuai.xi }
122*53ee8cc1Swenshuai.xi u32CmdlineLen = strlen(sCmdline);
123*53ee8cc1Swenshuai.xi
124*53ee8cc1Swenshuai.xi //printu("[utopia info]:cmdline = %s \n",sCmdline);
125*53ee8cc1Swenshuai.xi //printu("[utopia info]:string len = %d \n",u32CmdlineLen);
126*53ee8cc1Swenshuai.xi
127*53ee8cc1Swenshuai.xi pFindString=strstr(sCmdline,pattern);
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi if(pFindString==NULL)
130*53ee8cc1Swenshuai.xi {
131*53ee8cc1Swenshuai.xi printu("[utopia info] can't serch %s in bootargs \n",pattern);
132*53ee8cc1Swenshuai.xi return 0;
133*53ee8cc1Swenshuai.xi }
134*53ee8cc1Swenshuai.xi sTemp = sCmdline;
135*53ee8cc1Swenshuai.xi while(strsep(&sTemp," ")); //covert space to "\0"
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi sTemp=strsep(&pFindString,"=");
138*53ee8cc1Swenshuai.xi
139*53ee8cc1Swenshuai.xi u32ReadCount = strlen(pFindString);
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi if(u32ReadCount>size)
142*53ee8cc1Swenshuai.xi {
143*53ee8cc1Swenshuai.xi strncpy(source, pFindString, size);
144*53ee8cc1Swenshuai.xi u32ReadCount = size;
145*53ee8cc1Swenshuai.xi }else
146*53ee8cc1Swenshuai.xi {
147*53ee8cc1Swenshuai.xi strncpy(source, pFindString, u32ReadCount);
148*53ee8cc1Swenshuai.xi }
149*53ee8cc1Swenshuai.xi
150*53ee8cc1Swenshuai.xi //printu("%s\n",pFindString);
151*53ee8cc1Swenshuai.xi //printu("lens = %d\n",strlen(pFindString));
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi return u32ReadCount;
154*53ee8cc1Swenshuai.xi }
155*53ee8cc1Swenshuai.xi #endif
156*53ee8cc1Swenshuai.xi #ifndef CONFIG_UTOPIA_MODE_DEFAULT_KERNEL
UtopiaConfigReadFile(char * filePath)157*53ee8cc1Swenshuai.xi static MS_U32 UtopiaConfigReadFile(char* filePath)
158*53ee8cc1Swenshuai.xi {
159*53ee8cc1Swenshuai.xi char sModule[40], sEqual[20];
160*53ee8cc1Swenshuai.xi unsigned int u32moduleMode = 0;
161*53ee8cc1Swenshuai.xi unsigned int u32Cnt =0;
162*53ee8cc1Swenshuai.xi char sConf[50], *tok=" \n", *pch;
163*53ee8cc1Swenshuai.xi int len = 0;
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi FILE* fpUtopiaModuleMode = NULL;
166*53ee8cc1Swenshuai.xi
167*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_MODE_BY_BOOTARQ
168*53ee8cc1Swenshuai.xi char sFilePathFormBootArq[40] = {0};
169*53ee8cc1Swenshuai.xi unsigned int u32RetParserBootArg = 0;
170*53ee8cc1Swenshuai.xi u32RetParserBootArg = UtopiaParserBootArg(sFilePathFormBootArq,"utopia_mode",40);
171*53ee8cc1Swenshuai.xi
172*53ee8cc1Swenshuai.xi if(u32RetParserBootArg == 0)
173*53ee8cc1Swenshuai.xi return 0;
174*53ee8cc1Swenshuai.xi
175*53ee8cc1Swenshuai.xi //printu("utopia_conf path : %s \n",sFilePathFormBootArq);
176*53ee8cc1Swenshuai.xi printu("[utopia info] open: %s\n", sFilePathFormBootArq);
177*53ee8cc1Swenshuai.xi fpUtopiaModuleMode = fopen(sFilePathFormBootArq, "r");
178*53ee8cc1Swenshuai.xi #else
179*53ee8cc1Swenshuai.xi printu("[utopia info] open: %s\n", CONFIG_UTOPIAXP_CONF_PATH);
180*53ee8cc1Swenshuai.xi fpUtopiaModuleMode = fopen(CONFIG_UTOPIAXP_CONF_PATH, "r");
181*53ee8cc1Swenshuai.xi if(fpUtopiaModuleMode==NULL) //forward compatible ,remove later
182*53ee8cc1Swenshuai.xi {
183*53ee8cc1Swenshuai.xi fpUtopiaModuleMode = fopen("/data/utopia.conf", "r");
184*53ee8cc1Swenshuai.xi }
185*53ee8cc1Swenshuai.xi #endif
186*53ee8cc1Swenshuai.xi if(fpUtopiaModuleMode==NULL)
187*53ee8cc1Swenshuai.xi {
188*53ee8cc1Swenshuai.xi printu("[utopia info] don't have utopia.conf\n");
189*53ee8cc1Swenshuai.xi return 0;
190*53ee8cc1Swenshuai.xi }
191*53ee8cc1Swenshuai.xi
192*53ee8cc1Swenshuai.xi // coverity[secure_coding]
193*53ee8cc1Swenshuai.xi while(fgets(sConf,sizeof(sConf),fpUtopiaModuleMode)!=NULL)
194*53ee8cc1Swenshuai.xi {
195*53ee8cc1Swenshuai.xi if(strncmp(sConf,"MODULE_",7)!=0)
196*53ee8cc1Swenshuai.xi {
197*53ee8cc1Swenshuai.xi continue;
198*53ee8cc1Swenshuai.xi }
199*53ee8cc1Swenshuai.xi memset(sModule,0,sizeof(sModule));
200*53ee8cc1Swenshuai.xi memset(sEqual,0,sizeof(sEqual));
201*53ee8cc1Swenshuai.xi pch = strtok(sConf, tok);
202*53ee8cc1Swenshuai.xi len = (strlen(pch)>sizeof(sModule))?sizeof(sModule):strlen(pch);
203*53ee8cc1Swenshuai.xi strncpy(sModule,pch,len);
204*53ee8cc1Swenshuai.xi pch = strtok(NULL, tok);
205*53ee8cc1Swenshuai.xi len = (strlen(pch)>sizeof(sEqual))?sizeof(sEqual):strlen(pch);
206*53ee8cc1Swenshuai.xi strncpy(sEqual,pch,len);
207*53ee8cc1Swenshuai.xi pch = strtok(NULL, tok);
208*53ee8cc1Swenshuai.xi u32moduleMode = atoi(pch);
209*53ee8cc1Swenshuai.xi //printf("11. %s %s %d\n", sModule, sEqual, u32moduleMode);
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi for(u32Cnt = 0;u32Cnt<eMODULE_END;u32Cnt++)
212*53ee8cc1Swenshuai.xi {
213*53ee8cc1Swenshuai.xi if (0== strcmp((const char*)sModule, (const char*)moduleNames[u32Cnt]))
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi if(u32moduleMode == 1)
216*53ee8cc1Swenshuai.xi {
217*53ee8cc1Swenshuai.xi moduleMode[u32Cnt] = KERNEL_MODE;
218*53ee8cc1Swenshuai.xi printu("%s = %d \n",moduleNames[u32Cnt],u32moduleMode);
219*53ee8cc1Swenshuai.xi }else
220*53ee8cc1Swenshuai.xi {
221*53ee8cc1Swenshuai.xi moduleMode[u32Cnt] = 0;
222*53ee8cc1Swenshuai.xi }
223*53ee8cc1Swenshuai.xi break;
224*53ee8cc1Swenshuai.xi }
225*53ee8cc1Swenshuai.xi
226*53ee8cc1Swenshuai.xi }
227*53ee8cc1Swenshuai.xi u32moduleMode = 0 ; //init
228*53ee8cc1Swenshuai.xi }
229*53ee8cc1Swenshuai.xi
230*53ee8cc1Swenshuai.xi fclose(fpUtopiaModuleMode);
231*53ee8cc1Swenshuai.xi return 0;
232*53ee8cc1Swenshuai.xi }
233*53ee8cc1Swenshuai.xi #endif
234*53ee8cc1Swenshuai.xi
UtopiaInit()235*53ee8cc1Swenshuai.xi MS_U32 UtopiaInit()
236*53ee8cc1Swenshuai.xi {
237*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
238*53ee8cc1Swenshuai.xi
239*53ee8cc1Swenshuai.xi printu("[utopia info] utopia init version: %s\n", UTOPIA_VERSION);
240*53ee8cc1Swenshuai.xi psUtopiaPrivate = (UTOPIA_PRIVATE*)malloc(sizeof(UTOPIA_PRIVATE));
241*53ee8cc1Swenshuai.xi memset(psUtopiaPrivate, 0, sizeof(UTOPIA_PRIVATE));
242*53ee8cc1Swenshuai.xi psUtopiaPrivate->u32MutexID = MsOS_CreateMutex(E_MSOS_FIFO
243*53ee8cc1Swenshuai.xi , "UtopiaPrivateMutex", MSOS_PROCESS_SHARED);
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(psUtopiaPrivate->u32MutexID, MSOS_WAIT_FOREVER);
246*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_MODE_DEFAULT_KERNEL
247*53ee8cc1Swenshuai.xi #define MODULE_DEFAULT_KERNEL \
248*53ee8cc1Swenshuai.xi PREFIX(XC) \
249*53ee8cc1Swenshuai.xi PREFIX(DIP) \
250*53ee8cc1Swenshuai.xi PREFIX(PNL) \
251*53ee8cc1Swenshuai.xi PREFIX(ACE) \
252*53ee8cc1Swenshuai.xi PREFIX(DLC) \
253*53ee8cc1Swenshuai.xi PREFIX(PQ) \
254*53ee8cc1Swenshuai.xi PREFIX(TVENCODER) \
255*53ee8cc1Swenshuai.xi PREFIX(HDMIRX) \
256*53ee8cc1Swenshuai.xi PREFIX(BDMA) \
257*53ee8cc1Swenshuai.xi PREFIX(AESDMA) \
258*53ee8cc1Swenshuai.xi PREFIX(HWI2C) \
259*53ee8cc1Swenshuai.xi PREFIX(MIU) \
260*53ee8cc1Swenshuai.xi PREFIX(VIF) \
261*53ee8cc1Swenshuai.xi PREFIX(AVD) \
262*53ee8cc1Swenshuai.xi PREFIX(MVOP) \
263*53ee8cc1Swenshuai.xi PREFIX(GOP) \
264*53ee8cc1Swenshuai.xi PREFIX(GFX) \
265*53ee8cc1Swenshuai.xi PREFIX(GPD) \
266*53ee8cc1Swenshuai.xi PREFIX(DTMB) \
267*53ee8cc1Swenshuai.xi PREFIX(CEC) \
268*53ee8cc1Swenshuai.xi PREFIX(MHL) \
269*53ee8cc1Swenshuai.xi PREFIX(AUDIO) \
270*53ee8cc1Swenshuai.xi PREFIX(NJPEG_EX) \
271*53ee8cc1Swenshuai.xi PREFIX(VDEC_EX) \
272*53ee8cc1Swenshuai.xi PREFIX(DSCMB) \
273*53ee8cc1Swenshuai.xi PREFIX(DMX) \
274*53ee8cc1Swenshuai.xi PREFIX(VBI) \
275*53ee8cc1Swenshuai.xi
276*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) moduleMode[MODULE_##MODULE] = KERNEL_MODE;
277*53ee8cc1Swenshuai.xi MODULE_DEFAULT_KERNEL
278*53ee8cc1Swenshuai.xi #undef PREFIX
279*53ee8cc1Swenshuai.xi #else
280*53ee8cc1Swenshuai.xi UtopiaConfigReadFile(CONFIG_UTOPIAXP_CONF_PATH);
281*53ee8cc1Swenshuai.xi #endif
282*53ee8cc1Swenshuai.xi UTOPIARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_UTOPIA_FULL);
283*53ee8cc1Swenshuai.xi #define PREFIX(MODULE) \
284*53ee8cc1Swenshuai.xi if (MODULE##RegisterToUtopia != NULL && MODULE_TYPE_##MODULE##_FULL) \
285*53ee8cc1Swenshuai.xi { \
286*53ee8cc1Swenshuai.xi u32Ret |= MODULE##RegisterToUtopia((FUtopiaOpen)MODULE_TYPE_##MODULE##_FULL); \
287*53ee8cc1Swenshuai.xi }
288*53ee8cc1Swenshuai.xi _INCLUDED_MODULE
289*53ee8cc1Swenshuai.xi #undef PREFIX
290*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
291*53ee8cc1Swenshuai.xi
292*53ee8cc1Swenshuai.xi return u32Ret;
293*53ee8cc1Swenshuai.xi }
294*53ee8cc1Swenshuai.xi
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)295*53ee8cc1Swenshuai.xi MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
296*53ee8cc1Swenshuai.xi , MS_U32 u32ModuleVersion, const void* const pAttribute)
297*53ee8cc1Swenshuai.xi {
298*53ee8cc1Swenshuai.xi UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
299*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
300*53ee8cc1Swenshuai.xi //UTOPIA_USER_INSTANCE ** ppInstance= (UTOPIA_USER_INSTANCE**)ppInstanceTmp;
301*53ee8cc1Swenshuai.xi MS_S32 _s32UtopiaFd = -1;
302*53ee8cc1Swenshuai.xi UTOPIA_DDI_OPEN_ARG sOpenArg;
303*53ee8cc1Swenshuai.xi UTOPIA_USER_INSTANCE* pInstance = NULL;
304*53ee8cc1Swenshuai.xi while(psUtopiaModule != NULL)
305*53ee8cc1Swenshuai.xi {
306*53ee8cc1Swenshuai.xi if(psUtopiaModule->u32ModuleID == (u32ModuleID&~KERNEL_MODE))
307*53ee8cc1Swenshuai.xi {
308*53ee8cc1Swenshuai.xi MS_U32 u32ModuleIndex = u32ModuleID&~KERNEL_MODE;
309*53ee8cc1Swenshuai.xi pInstance= malloc(sizeof(UTOPIA_USER_INSTANCE));
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi if(pInstance == NULL)
312*53ee8cc1Swenshuai.xi {
313*53ee8cc1Swenshuai.xi printu("utopia.c : malloc fail %d \n",__LINE__);
314*53ee8cc1Swenshuai.xi return UTOPIA_STATUS_FAIL;
315*53ee8cc1Swenshuai.xi }else
316*53ee8cc1Swenshuai.xi {
317*53ee8cc1Swenshuai.xi // printu("utopia.c : malloc ok,Module= %s \n",moduleNames[u32ModuleIndex]);
318*53ee8cc1Swenshuai.xi }
319*53ee8cc1Swenshuai.xi
320*53ee8cc1Swenshuai.xi //if(u32ModuleID & KERNEL_MODE)
321*53ee8cc1Swenshuai.xi if(moduleMode[u32ModuleIndex] & KERNEL_MODE)
322*53ee8cc1Swenshuai.xi {
323*53ee8cc1Swenshuai.xi if (0 > (_s32UtopiaFd = open("/proc/utopia", O_RDWR)))
324*53ee8cc1Swenshuai.xi {
325*53ee8cc1Swenshuai.xi printu("aa : 0x%x Open /proc/utopia fail aa\n", u32ModuleID);
326*53ee8cc1Swenshuai.xi free(pInstance);//coverity Resource leak
327*53ee8cc1Swenshuai.xi return UTOPIA_STATUS_FAIL;
328*53ee8cc1Swenshuai.xi }
329*53ee8cc1Swenshuai.xi // printu("Module : %s kernel mode\n",moduleNames[u32ModuleIndex]);
330*53ee8cc1Swenshuai.xi // printu("_s32UtopiaFd : %d \n",_s32UtopiaFd);
331*53ee8cc1Swenshuai.xi sOpenArg.u32ModuleID = psUtopiaModule->u32ModuleID;
332*53ee8cc1Swenshuai.xi sOpenArg.u32ModuleVersion = u32ModuleVersion;
333*53ee8cc1Swenshuai.xi sOpenArg.pAttribute = (void*)pAttribute;
334*53ee8cc1Swenshuai.xi if(ioctl(_s32UtopiaFd,UTOPIA_IOCTL_SetMODULE,&sOpenArg)!=UTOPIA_STATUS_SUCCESS)
335*53ee8cc1Swenshuai.xi {
336*53ee8cc1Swenshuai.xi printu("utopia.c : UtopiaOpen fail %d \n",__LINE__);
337*53ee8cc1Swenshuai.xi free(pInstance);
338*53ee8cc1Swenshuai.xi close(_s32UtopiaFd);
339*53ee8cc1Swenshuai.xi return UTOPIA_STATUS_FAIL;
340*53ee8cc1Swenshuai.xi }
341*53ee8cc1Swenshuai.xi //while(1);
342*53ee8cc1Swenshuai.xi pInstance->psUtopiaInstant = 0;
343*53ee8cc1Swenshuai.xi pInstance->s32Fd = _s32UtopiaFd;
344*53ee8cc1Swenshuai.xi pInstance->u32KernelSpaceIdentify =KERNEL_MODE;
345*53ee8cc1Swenshuai.xi pInstance->u32ModuleID = psUtopiaModule->u32ModuleID;
346*53ee8cc1Swenshuai.xi *ppInstanceTmp = pInstance;
347*53ee8cc1Swenshuai.xi return UTOPIA_STATUS_SUCCESS;
348*53ee8cc1Swenshuai.xi }else
349*53ee8cc1Swenshuai.xi {
350*53ee8cc1Swenshuai.xi // printu("Module : %s user mode\n",moduleNames[u32ModuleIndex]);
351*53ee8cc1Swenshuai.xi MS_U32 ret = psUtopiaModule->fpOpen(&(pInstance->psUtopiaInstant), pAttribute);
352*53ee8cc1Swenshuai.xi
353*53ee8cc1Swenshuai.xi if(MSOS_BRANCH_PREDICTION_UNLIKELY(ret))
354*53ee8cc1Swenshuai.xi {
355*53ee8cc1Swenshuai.xi printu("[utopia open error] fail to create instance\n");
356*53ee8cc1Swenshuai.xi RET_OR_BLOCK(ret);
357*53ee8cc1Swenshuai.xi }
358*53ee8cc1Swenshuai.xi ((UTOPIA_INSTANCE*)(pInstance->psUtopiaInstant))->psModule =psUtopiaModule;
359*53ee8cc1Swenshuai.xi ((UTOPIA_INSTANCE*)(pInstance->psUtopiaInstant))->u32AppRequireModuleVersion = u32ModuleVersion;
360*53ee8cc1Swenshuai.xi //(*ppInstance)->psModule = psUtopiaModule;
361*53ee8cc1Swenshuai.xi //(*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
362*53ee8cc1Swenshuai.xi pInstance->u32KernelSpaceIdentify = 0;
363*53ee8cc1Swenshuai.xi pInstance->s32Fd = 0;
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi *ppInstanceTmp = pInstance;
366*53ee8cc1Swenshuai.xi return ret; /* depend on fpOpen, may not be UTOPIA_STATUS_SUCCESS */
367*53ee8cc1Swenshuai.xi }
368*53ee8cc1Swenshuai.xi }
369*53ee8cc1Swenshuai.xi psUtopiaModule = psUtopiaModule->psNext;
370*53ee8cc1Swenshuai.xi }
371*53ee8cc1Swenshuai.xi return UTOPIA_STATUS_FAIL;
372*53ee8cc1Swenshuai.xi #else
373*53ee8cc1Swenshuai.xi UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
374*53ee8cc1Swenshuai.xi
375*53ee8cc1Swenshuai.xi
376*53ee8cc1Swenshuai.xi while(psUtopiaModule != NULL)
377*53ee8cc1Swenshuai.xi {
378*53ee8cc1Swenshuai.xi if(psUtopiaModule->u32ModuleID == u32ModuleID)
379*53ee8cc1Swenshuai.xi {
380*53ee8cc1Swenshuai.xi MS_U32 ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
381*53ee8cc1Swenshuai.xi
382*53ee8cc1Swenshuai.xi if(MSOS_BRANCH_PREDICTION_UNLIKELY(ret))
383*53ee8cc1Swenshuai.xi {
384*53ee8cc1Swenshuai.xi printu("[utopia open error] fail to create instance\n");
385*53ee8cc1Swenshuai.xi RET_OR_BLOCK(ret);
386*53ee8cc1Swenshuai.xi }
387*53ee8cc1Swenshuai.xi
388*53ee8cc1Swenshuai.xi (*ppInstance)->psModule = psUtopiaModule;
389*53ee8cc1Swenshuai.xi (*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
390*53ee8cc1Swenshuai.xi return ret; /* depend on fpOpen, may not be UTOPIA_STATUS_SUCCESS */
391*53ee8cc1Swenshuai.xi }
392*53ee8cc1Swenshuai.xi psUtopiaModule = psUtopiaModule->psNext;
393*53ee8cc1Swenshuai.xi }
394*53ee8cc1Swenshuai.xi return UTOPIA_STATUS_FAIL;
395*53ee8cc1Swenshuai.xi #endif
396*53ee8cc1Swenshuai.xi }
397*53ee8cc1Swenshuai.xi
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)398*53ee8cc1Swenshuai.xi MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
399*53ee8cc1Swenshuai.xi {
400*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
401*53ee8cc1Swenshuai.xi UTOPIA_DDI_IOCTL_ARG sIOCTLArg;
402*53ee8cc1Swenshuai.xi UTOPIA_USER_INSTANCE* pInstance = (UTOPIA_USER_INSTANCE*)pInstanceTmp;
403*53ee8cc1Swenshuai.xi MS_U32 ret = 0;
404*53ee8cc1Swenshuai.xi
405*53ee8cc1Swenshuai.xi /* check param. */
406*53ee8cc1Swenshuai.xi if (MSOS_BRANCH_PREDICTION_UNLIKELY(pInstance == NULL))
407*53ee8cc1Swenshuai.xi {
408*53ee8cc1Swenshuai.xi printu("[utopia param error] instance pointer should not be null\n");
409*53ee8cc1Swenshuai.xi RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
410*53ee8cc1Swenshuai.xi }
411*53ee8cc1Swenshuai.xi
412*53ee8cc1Swenshuai.xi if((pInstance->u32KernelSpaceIdentify) & KERNEL_MODE)
413*53ee8cc1Swenshuai.xi {
414*53ee8cc1Swenshuai.xi sIOCTLArg.u32Cmd = u32Cmd;
415*53ee8cc1Swenshuai.xi sIOCTLArg.pArg = pArgs;
416*53ee8cc1Swenshuai.xi
417*53ee8cc1Swenshuai.xi ret = ioctl((pInstance->s32Fd),UTOPIA_IOCTL_IoctlMODULE,&sIOCTLArg);
418*53ee8cc1Swenshuai.xi if(ret != 0)
419*53ee8cc1Swenshuai.xi {
420*53ee8cc1Swenshuai.xi
421*53ee8cc1Swenshuai.xi //printf("UtopiaIoctl error %d \n",ret);
422*53ee8cc1Swenshuai.xi //printf("Module: %s Cmd: %d \n",moduleNames[pInstance->u32ModuleID] , u32Cmd);
423*53ee8cc1Swenshuai.xi //print_trace();
424*53ee8cc1Swenshuai.xi //RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
425*53ee8cc1Swenshuai.xi }
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi //ioctl(((MS_S32)(pInstance->psUtopiaInstant)),u32Cmd,pArgs);
428*53ee8cc1Swenshuai.xi return ret;
429*53ee8cc1Swenshuai.xi }else
430*53ee8cc1Swenshuai.xi {
431*53ee8cc1Swenshuai.xi return TO_INSTANCE_PTR((pInstance->psUtopiaInstant))->psModule->fpIoctl((pInstance->psUtopiaInstant),
432*53ee8cc1Swenshuai.xi u32Cmd, pArgs);
433*53ee8cc1Swenshuai.xi }
434*53ee8cc1Swenshuai.xi #else
435*53ee8cc1Swenshuai.xi UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
436*53ee8cc1Swenshuai.xi /* check param. */
437*53ee8cc1Swenshuai.xi if (MSOS_BRANCH_PREDICTION_UNLIKELY(pInstance == NULL))
438*53ee8cc1Swenshuai.xi {
439*53ee8cc1Swenshuai.xi printu("[utopia param error] instance pointer should not be null\n");
440*53ee8cc1Swenshuai.xi RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
441*53ee8cc1Swenshuai.xi }
442*53ee8cc1Swenshuai.xi
443*53ee8cc1Swenshuai.xi return TO_INSTANCE_PTR(pInstance)->psModule->fpIoctl(pInstance,
444*53ee8cc1Swenshuai.xi u32Cmd, pArgs);
445*53ee8cc1Swenshuai.xi #endif
446*53ee8cc1Swenshuai.xi }
447*53ee8cc1Swenshuai.xi
UtopiaClose(void * pInstantTmp)448*53ee8cc1Swenshuai.xi MS_U32 UtopiaClose(void* pInstantTmp)
449*53ee8cc1Swenshuai.xi {
450*53ee8cc1Swenshuai.xi #if defined(CONFIG_UTOPIA_FRAMEWORK_KERNEL_DRIVER)
451*53ee8cc1Swenshuai.xi UTOPIA_USER_INSTANCE* pInstance = (UTOPIA_USER_INSTANCE*)pInstantTmp;
452*53ee8cc1Swenshuai.xi //UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
453*53ee8cc1Swenshuai.xi
454*53ee8cc1Swenshuai.xi UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
455*53ee8cc1Swenshuai.xi MS_U32 u32Ret = UTOPIA_STATUS_FAIL;
456*53ee8cc1Swenshuai.xi
457*53ee8cc1Swenshuai.xi if((pInstance->u32KernelSpaceIdentify) & KERNEL_MODE)
458*53ee8cc1Swenshuai.xi {
459*53ee8cc1Swenshuai.xi close((int)(pInstance->s32Fd));
460*53ee8cc1Swenshuai.xi free(pInstance);
461*53ee8cc1Swenshuai.xi return 0;//fix me
462*53ee8cc1Swenshuai.xi }else
463*53ee8cc1Swenshuai.xi {
464*53ee8cc1Swenshuai.xi while(psUtopiaModule != NULL)
465*53ee8cc1Swenshuai.xi {
466*53ee8cc1Swenshuai.xi if(psUtopiaModule->u32ModuleID == (TO_INSTANCE_PTR(pInstance->psUtopiaInstant))->psModule->u32ModuleID)
467*53ee8cc1Swenshuai.xi {
468*53ee8cc1Swenshuai.xi u32Ret = psUtopiaModule->fpClose(pInstance->psUtopiaInstant);
469*53ee8cc1Swenshuai.xi if(u32Ret==UTOPIA_STATUS_SUCCESS)
470*53ee8cc1Swenshuai.xi {
471*53ee8cc1Swenshuai.xi //printf("utopia.c : UtopiaClose ok,Module= %s \n",moduleNames[psUtopiaModule->u32ModuleID]);
472*53ee8cc1Swenshuai.xi free(pInstantTmp);
473*53ee8cc1Swenshuai.xi }
474*53ee8cc1Swenshuai.xi else
475*53ee8cc1Swenshuai.xi printf("UtopiaClose fail : Module = %s \n",moduleNames[psUtopiaModule->u32ModuleID]);
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi
478*53ee8cc1Swenshuai.xi return u32Ret;
479*53ee8cc1Swenshuai.xi }
480*53ee8cc1Swenshuai.xi psUtopiaModule = psUtopiaModule->psNext;
481*53ee8cc1Swenshuai.xi }
482*53ee8cc1Swenshuai.xi return 0;
483*53ee8cc1Swenshuai.xi }
484*53ee8cc1Swenshuai.xi #else
485*53ee8cc1Swenshuai.xi UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstantTmp;
486*53ee8cc1Swenshuai.xi
487*53ee8cc1Swenshuai.xi /* check param. */
488*53ee8cc1Swenshuai.xi if (MSOS_BRANCH_PREDICTION_UNLIKELY(pInstance == NULL))
489*53ee8cc1Swenshuai.xi {
490*53ee8cc1Swenshuai.xi printu("[utopia param error] instance pointer should not be null\n");
491*53ee8cc1Swenshuai.xi RET_OR_BLOCK(UTOPIA_STATUS_FAIL);
492*53ee8cc1Swenshuai.xi }
493*53ee8cc1Swenshuai.xi
494*53ee8cc1Swenshuai.xi UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
495*53ee8cc1Swenshuai.xi while(psUtopiaModule != NULL)
496*53ee8cc1Swenshuai.xi {
497*53ee8cc1Swenshuai.xi if(psUtopiaModule->u32ModuleID == pInstance->psModule->u32ModuleID)
498*53ee8cc1Swenshuai.xi {
499*53ee8cc1Swenshuai.xi return psUtopiaModule->fpClose(pInstance);
500*53ee8cc1Swenshuai.xi }
501*53ee8cc1Swenshuai.xi psUtopiaModule = psUtopiaModule->psNext;
502*53ee8cc1Swenshuai.xi }
503*53ee8cc1Swenshuai.xi return 0;
504*53ee8cc1Swenshuai.xi #endif
505*53ee8cc1Swenshuai.xi }
506*53ee8cc1Swenshuai.xi
507