xref: /utopia/UTPA2-700.0.x/modules/msos/utopia_core/nuttx/utopia.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 #include "utopia_private.h"
2 #include "utopia_module.h"
3 #include <stdio.h>
4 #include "utopia.h"
5 #include "utopia_dapi.h"
6 #include "string.h"
7 #include "MsOS.h"
8 
9 //Global Variable===================================================
10 UTOPIA_PRIVATE* psUtopiaPrivate;
11 
12 int lib_lowprintf(const char *fmt, ...);
13 #define printf lib_lowprintf
14 char moduleNames[][40] = {
15 #define PREFIX(MODULE) "MODULE_"#MODULE,
16 	INCLUDED_MODULE
17 #undef PREFIX
18 };
19 
20 char rpoolNames[][40] = {
21 #define PREFIX(MODULE) "RPOOL_"#MODULE,
22 	INCLUDED_MODULE
23 #undef PREFIX
24 };
25 
26 char ResourceNames[][40] = {
27 #define PREFIX(MODULE) "RESOURCE_"#MODULE,
28 	INCLUDED_MODULE
29 #undef PREFIX
30 };
31 
32 void BDMARegisterToUtopia(FUtopiaOpen ModuleType);
33 void AESDMARegisterToUtopia(FUtopiaOpen ModuleType);
34 void MBXRegisterToUtopia(FUtopiaOpen ModuleType);
35 void DSCMBRegisterToUtopia(void);
36 void SYSRegisterToUtopia(FUtopiaOpen ModuleType);
37 
UtopiaInit()38 MS_U32 UtopiaInit()
39 {
40 	MS_U32 u32Ret = 0;
41 
42 	printf("utopia init\n" );
43     psUtopiaPrivate = (UTOPIA_PRIVATE*)malloc(sizeof(UTOPIA_PRIVATE));
44     memset(psUtopiaPrivate, 0, sizeof(UTOPIA_PRIVATE));
45 	psUtopiaPrivate->u32MutexID = MsOS_CreateMutex(E_MSOS_FIFO
46 			, "UtopiaPrivateMutex", MSOS_PROCESS_SHARED);
47 
48 	MsOS_ObtainMutex(psUtopiaPrivate->u32MutexID, MSOS_WAIT_FOREVER);
49 	/*
50 	 * to avoid weak attribute malfunction in static lib,
51 	 * we explicitly call needed functions
52 	 */
53 	UTOPIARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_UTOPIA_FULL);
54 	BDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_BDMA_FULL);
55 	AESDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_AESDMA_FULL);
56 	MBXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_MBX_FULL);
57 	DSCMBRegisterToUtopia();
58     SYSRegisterToUtopia(NULL);
59 	MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
60 
61 	return u32Ret;
62 }
63 
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)64 MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
65 		, MS_U32 u32ModuleVersion, const void* const pAttribute)
66 {
67     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
68     UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
69 
70 
71     // psUtopiaInstant->u32OpenThreadName = pthred_ctrl(get_name); // FIXME: need to be discussed implementation
72     while(psUtopiaModule != NULL)
73     {
74         if(psUtopiaModule->u32ModuleID == u32ModuleID)//need modify to link list
75         {
76             int ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
77 
78             if(ret)
79             {
80                 printf("[utopia error] fail to create instance\n");
81                 return ret;
82             }
83 
84             (*ppInstance)->psModule = psUtopiaModule;
85 			(*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
86             return ret;
87         }
88         psUtopiaModule = psUtopiaModule->psNext;
89     }
90 	return 0xFFFFFFFF; // FIXME: 1. error code, 2. to avoid possible fpOpen return value
91 }
92 
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)93 MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
94 {
95 	UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
96     return ((UTOPIA_INSTANCE*)pInstance)->psModule->fpIoctl(pInstance, u32Cmd, pArgs);
97 }
98 
UtopiaClose(void * pInstantTmp)99 MS_U32 UtopiaClose(void* pInstantTmp)
100 {
101     UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
102 
103     UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
104     while(psUtopiaModule != NULL)
105     {
106         if(psUtopiaModule->u32ModuleID == pInstant->psModule->u32ModuleID)
107         {
108             return psUtopiaModule->fpClose(pInstant);
109         }
110         psUtopiaModule = psUtopiaModule->psNext;
111     }
112 	return 0;
113 }
114 
115