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