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