xref: /utopia/UTPA2-700.0.x/modules/pwm/drv/pwm/mdrvPWM.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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