1 #include "MsTypes.h"
2 #include "string.h"
3 #include <stdio.h>
4 #include "utopia_dapi.h"
5 #include "utopia.h"
6 #include "drvPWM.h"
7 #include "drvPWM_private.h"
8 #include "MsOS.h"
9
10 #include "ULog.h"
11
12 #define TAG_PWM "PWM"
13
14 enum
15 {
16 PWM_POOL_ID_PWM0=0
17 } ePWMPoolID;
18
PWMRegisterToUtopia(FUtopiaOpen ModuleType)19 void PWMRegisterToUtopia(FUtopiaOpen ModuleType)
20 {
21 // 1. deal with module
22 void* pUtopiaModule = NULL;
23 UtopiaModuleCreate(MODULE_PWM, 8, &pUtopiaModule);
24 UtopiaModuleRegister(pUtopiaModule);
25 UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)PWMOpen, (FUtopiaClose)PWMClose, (FUtopiaIOctl)PWMIoctl);
26
27 // 2. deal with resource
28 void* psResource = NULL;
29 UtopiaModuleAddResourceStart(pUtopiaModule, PWM_POOL_ID_PWM0);
30 UtopiaResourceCreate("PWM", sizeof(PWM_RESOURCE_PRIVATE), &psResource);
31 UtopiaResourceRegister(pUtopiaModule, psResource, PWM_POOL_ID_PWM0);
32 UtopiaModuleAddResourceEnd(pUtopiaModule, PWM_POOL_ID_PWM0);
33
34 // FLASHRegisterToUtopia only call once, so driver init code can put here,v
35 }
36
PWMOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)37 MS_U32 PWMOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
38 {
39 PWM_INSTANT_PRIVATE *pPwmPri = NULL;
40 ULOGD(TAG_PWM, "\n[PWM INFO] pwm open");
41
42 UtopiaInstanceCreate(sizeof(PWM_INSTANT_PRIVATE), ppInstance);
43 UtopiaInstanceGetPrivate(*ppInstance, (void**)&pPwmPri);
44
45 pPwmPri->fpPWMOen = MDrv_PWM_Oen;
46 pPwmPri->fpPWMPeriod = MDrv_PWM_Period;
47 pPwmPri->fpPWMDutyCycle = MDrv_PWM_DutyCycle;
48 pPwmPri->fpPWMUnitDiv = MDrv_PWM_UnitDiv;
49 pPwmPri->fpPWMDiv = MDrv_PWM_Div;
50 pPwmPri->fpPWMPolarity = MDrv_PWM_Polarity;
51 pPwmPri->fpPWMVdben = MDrv_PWM_Vdben;
52 pPwmPri->fpPWMResetEn = MDrv_PWM_ResetEn;
53 pPwmPri->fpPWMDben = MDrv_PWM_Dben;
54 pPwmPri->fpPWMShift = MDrv_PWM_Shift;
55 pPwmPri->fpPWMNvsync = MDrv_PWM_Nvsync;
56
57 MDrv_PWM_Init(E_PWM_DBGLV_ALL);
58 return TRUE;
59 }
60
61 // FIXME: why static?
PWMIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)62 MS_U32 PWMIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
63 {
64 void* pModule = NULL;
65 UtopiaInstanceGetModule(pInstance, &pModule);
66 void* pResource = NULL;
67
68 PPWM_OEN_PARAM pOenParam = NULL;
69 PPWM_PERIOD_PARAM pPeriodParam = NULL;
70 PPWM_DUTYCYCLE_PARAM pDutyCycleParam = NULL;
71 PPWM_UNITDIV_PARAM pUnitDivParam = NULL;
72 PPWM_DIV_PARAM pDivParam = NULL;
73 PPWM_POLARITY_PARAM pPolarityParam = NULL;
74 PPWM_VDBEN_PARAM pVdbenParam = NULL;
75 PPWM_RESETEN_PARAM pResetEnParam = NULL;
76 PPWM_DBEN_PARAM pDbenParam = NULL;
77 PPWM_SHIFT_PARAM pShiftParam = NULL;
78 PPWM_NVSYNC_PARAM pNvsyncParam = NULL;
79
80 MS_U32 u32Ret;
81 PWM_INSTANT_PRIVATE* psPWMInstPri = NULL;
82 UtopiaInstanceGetPrivate(pInstance, (void**)&psPWMInstPri);
83
84 switch(u32Cmd)
85 {
86 case MDrv_CMD_PWM_Oen:
87 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Oen\n");
88 pOenParam = (PPWM_OEN_PARAM)pArgs;
89 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
90 {
91 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
92 return 0xFFFFFFFF;
93 }
94 u32Ret = (MS_U32)psPWMInstPri->fpPWMOen(pOenParam->u8IndexPWM,pOenParam->bOenPWM);
95 UtopiaResourceRelease(pResource);
96 return 0;
97 case MDrv_CMD_PWM_Period:
98 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Period\n");
99 pPeriodParam = (PPWM_PERIOD_PARAM)pArgs;
100 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
101 {
102 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
103 return 0xFFFFFFFF;
104 }
105 u32Ret = (MS_U32)psPWMInstPri->fpPWMPeriod(pPeriodParam->u8IndexPWM,pPeriodParam->u32PeriodPWM);
106 UtopiaResourceRelease(pResource);
107 return 0;
108 case MDrv_CMD_PWM_DutyCycle:
109 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_DutyCycle\n");
110 pDutyCycleParam = (PPWM_DUTYCYCLE_PARAM)pArgs;
111 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
112 {
113 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
114 return 0xFFFFFFFF;
115 }
116 u32Ret = (MS_U32)psPWMInstPri->fpPWMDutyCycle(pDutyCycleParam->u8IndexPWM,pDutyCycleParam->u32DutyPWM);
117 UtopiaResourceRelease(pResource);
118 return 0;
119 case MDrv_CMD_PWM_UnitDiv:
120 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_UnitDiv\n");
121 pUnitDivParam = (PPWM_UNITDIV_PARAM)pArgs;
122 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
123 {
124 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
125 return 0xFFFFFFFF;
126 }
127 u32Ret = (MS_U32)psPWMInstPri->fpPWMUnitDiv(pUnitDivParam->u16UnitDivPWM);
128 UtopiaResourceRelease(pResource);
129 return 0;
130 case MDrv_CMD_PWM_Div:
131 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Div\n");
132 pDivParam = (PPWM_DIV_PARAM)pArgs;
133 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
134 {
135 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
136 return 0xFFFFFFFF;
137 }
138 psPWMInstPri->fpPWMDiv(pDivParam->u8IndexPWM,pDivParam->u16DivPWM);
139 UtopiaResourceRelease(pResource);
140 return 0;
141 case MDrv_CMD_PWM_Polarity:
142 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Polarity\n");
143 pPolarityParam = (PPWM_POLARITY_PARAM)pArgs;
144 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
145 {
146 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
147 return 0xFFFFFFFF;
148 }
149 psPWMInstPri->fpPWMPolarity(pPolarityParam->u8IndexPWM,pPolarityParam->bPolPWM);
150 UtopiaResourceRelease(pResource);
151 return 0;
152 case MDrv_CMD_PWM_Vdben:
153 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Vdben\n");
154 pVdbenParam = (PPWM_VDBEN_PARAM)pArgs;
155 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
156 {
157 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
158 return 0xFFFFFFFF;
159 }
160 psPWMInstPri->fpPWMVdben(pVdbenParam->u8IndexPWM,pVdbenParam->bVdbenPWM);
161 UtopiaResourceRelease(pResource);
162 return 0;
163 case MDrv_CMD_PWM_ResetEn:
164 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_ResetEn\n");
165 pResetEnParam = (PPWM_RESETEN_PARAM)pArgs;
166 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
167 {
168 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
169 return 0xFFFFFFFF;
170 }
171 psPWMInstPri->fpPWMResetEn(pResetEnParam->u8IndexPWM,pResetEnParam->bRstPWM);
172 UtopiaResourceRelease(pResource);
173 return 0;
174 case MDrv_CMD_PWM_Dben:
175 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Dben\n");
176 pDbenParam = (PPWM_DBEN_PARAM)pArgs;
177 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
178 {
179 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
180 return 0xFFFFFFFF;
181 }
182 psPWMInstPri->fpPWMDben(pDbenParam->u8IndexPWM,pDbenParam->bDbenPWM);
183 UtopiaResourceRelease(pResource);
184 return 0;
185 case MDrv_CMD_PWM_Shift:
186 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Shift\n");
187 pShiftParam = (PPWM_SHIFT_PARAM)pArgs;
188 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
189 {
190 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
191 return 0xFFFFFFFF;
192 }
193 u32Ret = (MS_U32)psPWMInstPri->fpPWMShift(pShiftParam->u8IndexPWM,pShiftParam->u32DutyPWM);
194 UtopiaResourceRelease(pResource);
195 return 0;
196 case MDrv_CMD_PWM_Nvsync:
197 ULOGD(TAG_PWM, "PWMIoctl - MDrv_CMD_PWM_Nvsync\n");
198 pNvsyncParam = (PPWM_NVSYNC_PARAM)pArgs;
199 if(UtopiaResourceObtain(pModule, PWM_POOL_ID_PWM0, &pResource) != 0)
200 {
201 ULOGE(TAG_PWM, "UtopiaResourceObtainToInstant fail\n");
202 return 0xFFFFFFFF;
203 }
204 psPWMInstPri->fpPWMNvsync(pNvsyncParam->u8IndexPWM,pNvsyncParam->bNvsPWM);
205 UtopiaResourceRelease(pResource);
206 return 0;
207 default:
208 break;
209 }
210
211 return 0; // FIXME: error code
212
213 }
214
PWMClose(void * pInstance)215 MS_U32 PWMClose(void* pInstance)
216 {
217 UtopiaInstanceDelete(pInstance);
218
219 return TRUE;
220 }
221