xref: /utopia/UTPA2-700.0.x/modules/wdt/drv/wdt/mdrvWDT.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 #if !defined(MSOS_TYPE_LINUX_KERNEL)
2 #include "string.h"
3 #include <stdio.h>
4 #else
5 #include <linux/string.h>
6 #include <linux/slab.h>
7 #endif
8 #include "MsTypes.h"
9 #include "utopia_dapi.h"
10 #include "drvWDT.h"
11 #include "drvWDT_private.h"
12 #include "MsOS.h"
13 #include "utopia.h"
14 
15 
16 enum
17 {
18     WDT_POOL_ID_WDT0=0
19 } eWDTPoolID;
20 
21 void* psWdtResource = NULL;
22 // this func will be call to init by utopia20 framework
WDTRegisterToUtopia(FUtopiaOpen ModuleType)23 void WDTRegisterToUtopia(FUtopiaOpen ModuleType)
24 {
25     void* pUtopiaModule = NULL;
26     WDT_RESOURCE_PRIVATE * pResPri = NULL;
27     UtopiaModuleCreate(MODULE_WDT, 8, &pUtopiaModule);
28     UtopiaModuleRegister(pUtopiaModule);
29 
30     // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
31     UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)WDTOpen, (FUtopiaClose)WDTClose, (FUtopiaIOctl)WDTIoctl);
32 
33     // 2. Resource register
34     // start func to add resources of a certain Resource_Pool
35     UtopiaModuleAddResourceStart(pUtopiaModule, WDT_POOL_ID_WDT0);
36     // create a resouce and regiter it to a certain Resource_Pool, resource can alloc private for internal use
37     UtopiaResourceCreate("wdt0", sizeof(WDT_RESOURCE_PRIVATE), &psWdtResource);
38     UtopiaResourceRegister(pUtopiaModule, psWdtResource, WDT_POOL_ID_WDT0);
39 
40     // end func to add resources of a certain Resource_Pool(this will set the ResourceSemaphore of this ResourcePool)
41     UtopiaModuleAddResourceEnd(pUtopiaModule, WDT_POOL_ID_WDT0);
42     if(UtopiaResourceObtain(pUtopiaModule, WDT_POOL_ID_WDT0, &psWdtResource) != 0)
43     {
44       printf("UtopiaResourceObtainToInstant fail\n");
45     }
46     UtopiaResourceGetPrivate(psWdtResource, (void**)&pResPri);
47     UtopiaResourceRelease(psWdtResource);
48 }
49 
WDTOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)50 MS_U32 WDTOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
51 {
52     WDT_INSTANT_PRIVATE *pWdtPri = NULL;
53     void *pWdtPriVoid = NULL;
54     //printf("\n[BDMA INFO] bdma open");
55     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,printf("enter %s %d\n",__FUNCTION__,__LINE__));
56     // instance is allocated here, also can allocate private for internal use, ex, BDMA_INSTANT_PRIVATE
57     UtopiaInstanceCreate(sizeof(WDT_INSTANT_PRIVATE), ppInstance);
58     // setup func in private and assign the calling func in func ptr in instance private
59     UtopiaInstanceGetPrivate(*ppInstance, &pWdtPriVoid);
60     pWdtPri = (WDT_INSTANT_PRIVATE*)pWdtPriVoid;
61     pWdtPri->fpWdtIsEn = (IOCTL_WDT_IS_ENABLE)MDrv_WDT_IsEnable_U2K;
62     pWdtPri->fpWdtInit = (IOCTL_WDT_INIT)MDrv_WDT_Init_U2K;
63     pWdtPri->fpWdtStop = (IOCTL_WDT_STOP)MDrv_WDT_Stop_U2K;
64     pWdtPri->fpWdtClear = (IOCTL_WDT_CLEAR)MDrv_WDT_Clear_U2K;
65     pWdtPri->fpWdtClrRstFlg = (IOCTL_WDT_CLEAR_RST_FLAG)MDrv_WDT_ClearRstFlag_U2K;
66     pWdtPri->fpWdtIsRst = (IOCTL_WDT_IS_RST)MDrv_WDT_IsReset_U2K;
67     pWdtPri->fpWdtSetTimer = (IOCTL_WDT_SET_TIMER)MDrv_WDT_SetTimer_U2K;
68     pWdtPri->fpWdtSetMs = (IOCTL_WDT_SET_MS)MDrv_WDT_SetTimer_ms_U2K;
69     pWdtPri->fpWdtSetUs = (IOCTL_WDT_SET_US)MDrv_WDT_SetTimer_us_U2K;
70     pWdtPri->fpWdtSetIntTimer = (IOCTL_WDT_SET_INT_TIMER)MDrv_WDT_SetIntTimer_U2K;
71     pWdtPri->fpTimerCount= (IOCTL_TIMER_COUNT)MDrv_TIMER_Count_U2K;
72     pWdtPri->fpTimerInt = (IOCTL_TIMER_INT)MDrv_TIMER_Init_U2K;
73     pWdtPri->fpTimerMaxMatch = (IOCTL_TIMER_MAX_MATCH)MDrv_TIMER_HitMaxMatch_U2K;
74     pWdtPri->fpTimerRST = (IOCTL_TIMER_RST)MDrv_TIMER_Rst_U2K;
75     pWdtPri->fpTimerSetMaxMatch = (IOCTL_TIMER_SET_MAX_MATCH)MDrv_TIMER_SetMaxMatch_U2K;
76     pWdtPri->fpTimerGetMaxMatch = (IOCTL_TIMER_GET_MAX_MATCH)MDrv_TIMER_GetMaxMatch_U2K;
77     pWdtPri->fpTimerGetCount = (IOCTL_TIMER_GET_COUNT)MDrv_TIMER_GetCounter_U2K;
78     pWdtPri->fpTimerGetSec = (IOCTL_TIMER_GET_SEC)MDrv_TIMER_GetSecond_U2K;
79     pWdtPri->fpTimerGetMs = (IOCTL_TIMER_GET_MS)MDrv_TIMER_GetMs_U2K;
80     pWdtPri->fpTimerGetUs = (IOCTL_TIMER_GET_US)MDrv_TIMER_GetUs_U2K;
81     pWdtPri->fpTimerDelay = (IOCTL_TIMER_DELAY)MDrv_TIMER_Delay_U2K;
82     pWdtPri->fpTimerDelayMs = (IOCTL_TIMER_DELAY_MS)MDrv_TIMER_DelayMs_U2K;
83     pWdtPri->fpTimerDelayUs = (IOCTL_TIMER_DELAY_US	)MDrv_TIMER_DelayUs_U2K;
84     pWdtPri->fpTimerInitial = (IOCTL_TIMER_INITIAL	)MDrv_TIMER_Init_U2K;
85     pWdtPri->fpTimerExit = (IOCTL_TIMER_EXIT	)MDrv_TIMER_Exit_U2K;
86 	return UTOPIA_STATUS_SUCCESS;
87 }
88 
89 
90 // FIXME: why static?
WDTIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)91 MS_U32 WDTIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
92 {
93 	void* pModule = NULL;
94 	WDT_RESOURCE_PRIVATE * pResPri = NULL;
95 	WDT_INSTANT_PRIVATE* psWdtInstPri = NULL;
96 	MS_U32 u32Ret = TRUE;
97 	MS_U32 u32MatchVal;
98 	MS_U32 u32CntVal;
99 	MS_U32 u32SecVal;
100 	MS_U32 u32MsecVal;
101 	MS_U32 u32UsecVal;
102 	WDT_Result statustmp;
103 	UtopiaInstanceGetModule(pInstance, &pModule);
104 	UtopiaInstanceGetPrivate(pInstance, (void**)&psWdtInstPri);
105 	UtopiaResourceGetPrivate(psWdtResource, (void**)&pResPri);
106 	WDT_PRIVATE_PARAM *param = NULL;
107 	if (pArgs != NULL)
108 		param= (WDT_PRIVATE_PARAM *) pArgs;
109 
110     switch(u32Cmd)
111     {
112         case MDrv_CMD_WDT_Init:
113             pResPri->eLevel=param->privateWdtInit.eLevel;
114             u32Ret = psWdtInstPri->fpWdtInit(param->privateWdtInit.eLevel);
115             break;
116         case MDrv_CMD_WDT_Stop:
117             u32Ret = psWdtInstPri->fpWdtStop(param->privateWdtStop.eLevel);
118             break;
119         case MDrv_CMD_WDT_Clear:
120             u32Ret = psWdtInstPri->fpWdtClear();
121             break;
122         case MDrv_CMD_WDT_ClearRstFlag:
123             u32Ret = psWdtInstPri->fpWdtClrRstFlg();
124             break;
125         case  MDrv_CMD_WDT_IsReset:
126              statustmp = psWdtInstPri->fpWdtIsRst();
127              param->privateWdtIsRst.status=statustmp;
128             break;
129         case MDrv_CMD_WDT_IsEnable:
130 	       statustmp =  psWdtInstPri->fpWdtIsEn();
131              param->privateWdtIsEn.status=statustmp;
132             break;
133         case MDrv_CMD_WDT_SetTimer:
134              u32Ret = psWdtInstPri->fpWdtSetTimer(param->privateWdtSetTimer.eLevel,param->privateWdtSetTimer.sec);
135             break;
136         case MDrv_CMD_WDT_SetTimer_ms:
137             u32Ret = psWdtInstPri->fpWdtSetMs(param->privateWdtSetMSec.eLevel,param->privateWdtSetMSec.msec);
138             break;
139         case MDrv_CMD_WDT_SetTimer_us:
140             u32Ret = psWdtInstPri->fpWdtSetUs(param->privateWdtSetUSec.eLevel,param->privateWdtSetUSec.usec);
141             break;
142         case MDrv_CMD_WDT_SetIntTimer:
143 	     u32Ret = psWdtInstPri->fpWdtSetIntTimer(param->privateWdtSetSec.eLevel,param->privateWdtSetSec.sec);
144         case MDrv_CMD_TIMER_Init:
145 	     psWdtInstPri->fpTimerInt(param->privateTimerInit.eTimer,param->privateTimerInit.bEnable);
146             break;
147         case MDrv_CMD_TIMER_Count:
148 	     psWdtInstPri->fpTimerCount(param->privateTimerCnt.eTimer,param->privateTimerCnt.bEnable);
149             break;
150         case MDrv_CMD_TIMER_Rst:
151 	     psWdtInstPri->fpTimerRST(param->privateTimerRst.eTimer);
152             break;
153         case MDrv_CMD_TIMER_SetMaxMatch:
154 	     psWdtInstPri->fpTimerSetMaxMatch(param->privateTimerSetMaxMatch.eTimer,param->privateTimerSetMaxMatch.u32MaxTimer);
155 	     break;
156         case MDrv_CMD_TIMER_HitMaxMatch:
157 	     u32Ret =psWdtInstPri->fpTimerMaxMatch(param->privateTimerHitMaxMatch.eTimer);
158             break;
159         case MDrv_CMD_TIMER_GetMaxMatch:
160 	       u32MatchVal=psWdtInstPri->fpTimerGetMaxMatch(param->privateTimerGetMaxMatch.eTimer);
161 		param->privateTimerGetMaxMatch.u32MaxMatchVal=u32MatchVal;
162 		if (0xFFFFFFFF != u32MatchVal)
163                 u32Ret= TRUE;
164 		else
165                 u32Ret= FALSE;
166             break;
167         case MDrv_CMD_TIMER_GetCounter:
168 		u32CntVal=psWdtInstPri->fpTimerGetCount(param->privateTimerGetCunter.eTimer);
169 		param->privateTimerGetCunter.u32Cnt=u32CntVal;
170 		if (0xFFFFFFFF != u32CntVal)
171                 u32Ret= TRUE;
172 		else
173                 u32Ret= FALSE;
174             break;
175         case MDrv_CMD_TIMER_GetSecond:
176 		u32SecVal=psWdtInstPri->fpTimerGetSec(param->privateTimerGetSec.eTimer);
177 		param->privateTimerGetSec.u32Sec=u32SecVal;
178 		if (0xFFFFFFFF != u32SecVal)
179                 u32Ret= TRUE;
180 		else
181                 u32Ret= FALSE;
182             break;
183         case MDrv_CMD_TIMER_GetMs:
184 		u32MsecVal=psWdtInstPri->fpTimerGetMs(param->privateTimerGetMs.eTimer);
185 		param->privateTimerGetMs.u32Msec=u32MsecVal;
186 		if (0xFFFFFFFF != u32MsecVal)
187                 u32Ret= TRUE;
188 		else
189                 u32Ret= FALSE;
190 		break;
191         case MDrv_CMD_TIMER_GetUs:
192 		u32UsecVal=psWdtInstPri->fpTimerGetUs(param->privateTimerGetUs.eTimer);
193 		param->privateTimerGetUs.u32Usec=u32UsecVal;
194 		if (0xFFFFFFFF != u32UsecVal)
195                 u32Ret= TRUE;
196 		else
197                 u32Ret= FALSE;
198 		break;
199         case MDrv_CMD_TIMER_Delay:
200 		psWdtInstPri->fpTimerDelay(param->privateTimerDelay.eTimer,param->privateTimerDelay.u32Second);
201             break;
202        case MDrv_CMD_TIMER_DelayMs:
203 	   	psWdtInstPri->fpTimerDelayMs(param->privateTimerDelayMs.eTimer,param->privateTimerDelayMs.u32ms);
204             break;
205         case MDrv_CMD_TIMER_DelayUs:
206 		psWdtInstPri->fpTimerDelayUs(param->privateTimerDelayUs.eTimer,param->privateTimerDelayUs.u32us);
207             break;
208 	 case MDrv_CMD_TIMER_Initial:
209 	 	psWdtInstPri->fpTimerInitial();
210 	     break;
211 	 case MDrv_CMD_TIMER_Exit:
212 	 	psWdtInstPri->fpTimerExit();
213 	     break;
214 	 case MDrv_CMD_WDT_GetConfig:
215              *(WDT_DbgLv*)pArgs= pResPri->eLevel;
216 	     break;
217         default:
218             break;
219     }
220 	return  (u32Ret==TRUE?UTOPIA_STATUS_SUCCESS:UTOPIA_STATUS_FAIL); // FIXME: error code
221 }
222 
WDTClose(void * pInstance)223 MS_U32 WDTClose(void* pInstance)
224 {
225 	UtopiaInstanceDelete(pInstance);
226 
227 	return UTOPIA_STATUS_SUCCESS;
228 }
229 
230 
231