1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
4 // All rights reserved.
5 //
6 // Unless otherwise stipulated in writing, any and all information contained
7 // herein regardless in any format shall remain the sole proprietary of
8 // MStar Semiconductor Inc. and be kept in strict confidence
9 // ("MStar Confidential Information") by the recipient.
10 // Any unauthorized act including without limitation unauthorized disclosure,
11 // copying, use, reproduction, sale, distribution, modification, disassembling,
12 // reverse engineering and compiling of the contents of MStar Confidential
13 // Information is unlawful and strictly prohibited. MStar hereby reserves the
14 // rights to any and all damages, losses, costs and expenses resulting therefrom.
15 //
16 ////////////////////////////////////////////////////////////////////////////////
17
18 ///////////////////////////////////////////////////////////////////////////////////////////////////
19 ///
20 /// file mdrvMSPI.c
21 /// @brief Master SPI Driver Interface
22 /// @author MStar Semiconductor Inc.
23 ///////////////////////////////////////////////////////////////////////////////////////////////////
24
25
26 //-------------------------------------------------------------------------------------------------
27 // Include Files
28 //-------------------------------------------------------------------------------------------------
29
30 #include "MsTypes.h"
31 #include <stdio.h>
32 #include "utopia_dapi.h"
33 #include "utopia.h"
34 #include "drvMSPI.h"
35 #include "drvMSPI_private.h"
36 #include "MsOS.h"
37
38 #include "ULog.h"
39
40 #define TAG_MSPI "MSPI"
41
42 enum
43 {
44 MSPI_POOL_ID=0
45 } eMspiPoolID;
46
MSPIRegisterToUtopia(FUtopiaOpen ModuleType)47 void MSPIRegisterToUtopia(FUtopiaOpen ModuleType)
48 {
49 // 1. deal with module
50 void* pUtopiaModule = NULL;
51 UtopiaModuleCreate(MODULE_MSPI, 8, &pUtopiaModule);
52 UtopiaModuleRegister(pUtopiaModule);
53 UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)MSPIOpen, (FUtopiaClose)MSPIClose, (FUtopiaIOctl)MSPIIoctl);
54
55 // 2. deal with resource
56 void* psResource = NULL;
57 UtopiaModuleAddResourceStart(pUtopiaModule, MSPI_POOL_ID);
58 UtopiaResourceCreate("MSPI", sizeof(MSPI_RESOURCE_PRIVATE), &psResource);
59 UtopiaResourceRegister(pUtopiaModule, psResource, MSPI_POOL_ID);
60 UtopiaModuleAddResourceEnd(pUtopiaModule, MSPI_POOL_ID);
61
62 }
63
MSPIOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)64 MS_U32 MSPIOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
65 {
66 ULOGD(TAG_MSPI, "\n[MSPI INFO] master spi open \n");
67
68 MSPI_INSTANT_PRIVATE *pMSPIPri = NULL;
69 UtopiaInstanceCreate(sizeof(MSPI_INSTANT_PRIVATE), ppInstance);
70 UtopiaInstanceGetPrivate(*ppInstance, (void**)&pMSPIPri);
71 #if (MSPI_UTOPIA20)
72 pMSPIPri->fpMSPI_Init_Ext = _MDrv_MPSI_Init_Ext;
73 pMSPIPri->fpMSPI_Init = _MDrv_MSPI_Init;
74 pMSPIPri->fpMSPI_Read = _MDrv_MSPI_Read;
75 pMSPIPri->fpMSPI_Write = _MDrv_MSPI_Write;
76 pMSPIPri->fpMSPI_DCConfig = _MDrv_MSPI_DCConfig;
77 pMSPIPri->fpMSPI_CLKConfig = _MDrv_MSPI_CLKConfig;
78 pMSPIPri->fpMSPI_FRAMEConfig = _MDrv_MSPI_FRAMEConfig;
79 pMSPIPri->fpMSPI_SlaveEnable = _MDrv_MSPI_SlaveEnable;
80 pMSPIPri->fpMSPI_SetPowerState = _MDrv_MSPI_SetPowerState;
81 pMSPIPri->fpMSPI_SetDbgLevel = _MDrv_MSPI_SetDbgLevel;
82 pMSPIPri->fpMasterSPI_Init_Ext = _MDrv_MasterSPI_Init_Ext;
83 pMSPIPri->fpMasterSPI_Init = _MDrv_MasterSPI_Init;
84 pMSPIPri->fpMasterSPI_Read = _MDrv_MasterSPI_Read;
85 pMSPIPri->fpMasterSPI_Write = _MDrv_MasterSPI_Write;
86 pMSPIPri->fpMasterSPI_DCConfig = _MDrv_MasterSPI_DCConfig;
87 pMSPIPri->fpMasterSPI_CLKConfig = _MDrv_MasterSPI_CLKConfig;
88 pMSPIPri->fpMasterSPI_FrameConfig = _MDrv_MasterSPI_FRAMEConfig;
89 pMSPIPri->fpMasterSPI_SlaveEnable = _MDrv_MasterSPI_SlaveEnable;
90 pMSPIPri->fpMasterSPI_CsPadConfig = _MDrv_MasterSPI_CsPadConfig;
91 pMSPIPri->fpMasterSPI_MaxClkConfig = _MDrv_MasterSPI_MaxClkConfig;
92 #else
93 pMSPIPri->fpMSPI_Init_Ext = MDrv_MSPI_Init_Ext;
94 pMSPIPri->fpMSPI_Init = MDrv_MSPI_Init;
95 pMSPIPri->fpMSPI_Read = MDrv_MSPI_Read;
96 pMSPIPri->fpMSPI_Write = MDrv_MSPI_Write;
97 pMSPIPri->fpMSPI_DCConfig = MDrv_MSPI_DCConfig;
98 pMSPIPri->fpMSPI_CLKConfig = MDrv_MSPI_CLKConfig;
99 pMSPIPri->fpMSPI_FRAMEConfig = MDrv_MSPI_FRAMEConfig;
100 pMSPIPri->fpMSPI_SlaveEnable = MDrv_MSPI_SlaveEnable;
101 pMSPIPri->fpMSPI_SetPowerState = MDrv_MSPI_SetPowerState;
102 pMSPIPri->fpMSPI_SetDbgLevel = MDrv_MSPI_SetDbgLevel;
103 pMSPIPri->fpMasterSPI_Init = MDrv_MasterSPI_Init;
104 pMSPIPri->fpMasterSPI_Read = MDrv_MasterSPI_Read;
105 pMSPIPri->fpMasterSPI_Write = MDrv_MasterSPI_Write;
106 pMSPIPri->fpMasterSPI_DCConfig = MDrv_MasterSPI_DCConfig;
107 pMSPIPri->fpMasterSPI_CLKConfig = MDrv_MasterSPI_CLKConfig;
108 pMSPIPri->fpMasterSPI_FrameConfig = MDrv_MasterSPI_FRAMEConfig;
109 pMSPIPri->fpMasterSPI_SlaveEnable = MDrv_MasterSPI_SlaveEnable;
110 pMSPIPri->fpMasterSPI_CsPadConfig = MDrv_MasterSPI_CsPadConfig;
111 pMSPIPri->fpMasterSPI_MaxClkConfig = MDrv_MasterSPI_MaxClkConfig;
112 #endif
113
114 return TRUE;
115 }
116
117 // FIXME: why static?
MSPIIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)118 MS_U32 MSPIIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
119 {
120 void* pModule = NULL;
121 UtopiaInstanceGetModule(pInstance, &pModule);
122 void* pResource = NULL;
123 PMSPI_INIT_EXT pInitExtParam = NULL;
124 PMSPI_INIT pInitParam = NULL;
125 PMSPI_READ pReadParam = NULL;
126 PMSPI_WRITE pWriteParam = NULL;
127 PMSPI_DCCONFIG pDcconfigParam = NULL;
128 PMSPI_CLKCONFIG pCLKConfigParam = NULL;
129 PMSPI_FRAMECONFIG pFrameConfigParam = NULL;
130 PMSPI_SLAVE_ENABLE pSlaveEnableParam = NULL;
131 PMSPISETPOWERSTATE pSetPowerStateParam = NULL;
132 PMSPI_SETDBGLEVEL pSetDbgLevelParam = NULL;
133 PMASTERSPI_READ pMSPIReadParam = NULL;
134 PMASTERSPI_WRITE pMSPIWriteParam = NULL;
135 PMASTERSPI_DCCONFIG pMSPIDcconfigParam = NULL;
136 PMASTERSPI_CLKCONFIG pMSPICLKConfigParam = NULL;
137 PMASTERSPI_FRAMECONFIG pMSPIFrameConfigParam = NULL;
138 PMASTERSPI_SLAVE_ENABLE pMSPISlaveEnableParam = NULL;
139 PMASTERSPI_CSPADCONFIG pMSPISetCsPadConfigParam = NULL;
140 PMASTERSPI_MAXCLKCONFIG pMSPIMaxClkConfigParam = NULL;
141
142 MS_U32 u32Ret;
143 MSPI_INSTANT_PRIVATE* psMSPIInstPri = NULL;
144 UtopiaInstanceGetPrivate(pInstance, (void**)&psMSPIInstPri);
145
146 switch(u32Cmd)
147 {
148 case MDrv_CMD_MSPI_Init_Ext:
149 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_Init_Ext\n");
150 pInitExtParam = (PMSPI_INIT_EXT)pArgs;
151 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
152 {
153 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
154 return 0xFFFFFFFF;
155 }
156 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_Init_Ext(pInitExtParam->u8HWNum);
157 return 0;
158 case MDrv_CMD_MSPI_Init:
159 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_Init\n");
160 pInitParam = (PMSPI_INIT)pArgs;
161 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
162 {
163 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
164 return 0xFFFFFFFF;
165 }
166 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_Init(pInitParam->ptMSPIConfig, pInitParam->u8HWNum);
167 return 0;
168 case MDrv_CMD_MSPI_Read:
169 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_Read\n");
170 pReadParam = (PMSPI_READ)pArgs;
171 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
172 {
173 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
174 return 0xFFFFFFFF;
175 }
176 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_Read(pReadParam->pu8Data, pReadParam->u16Size);
177 return 0;
178 case MDrv_CMD_MSPI_Write:
179 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_Write\n");
180 pWriteParam = (PMSPI_WRITE)pArgs;
181 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
182 {
183 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
184 return 0xFFFFFFFF;
185 }
186 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_Write(pWriteParam->pu8Data, pWriteParam->u16Size);
187 UtopiaResourceRelease(pResource);
188 return 0;
189 case MDrv_CMD_MSPI_DCConfig:
190 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_DCConfig\n");
191 pDcconfigParam = (PMSPI_DCCONFIG)pArgs;
192 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
193 {
194 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
195 return 0xFFFFFFFF;
196 }
197 psMSPIInstPri->fpMSPI_DCConfig(pDcconfigParam->ptDCConfig);
198 UtopiaResourceRelease(pResource);
199 return 0;
200 case MDrv_CMD_MSPI_CLKConfig:
201 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_CLKConfig\n");
202 pCLKConfigParam = (PMSPI_CLKCONFIG)pArgs;
203 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
204 {
205 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
206 return 0xFFFFFFFF;
207 }
208 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_CLKConfig(pCLKConfigParam->ptCLKConfig);
209 UtopiaResourceRelease(pResource);
210 return 0;
211 case MDrv_CMD_MSPI_FRAMEConfig:
212 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_FRAMEConfig\n");
213 pFrameConfigParam = (PMSPI_FRAMECONFIG)pArgs;
214 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
215 {
216 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
217 return 0xFFFFFFFF;
218 }
219 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_FRAMEConfig(pFrameConfigParam->ptFrameConfig);
220 UtopiaResourceRelease(pResource);
221 return 0;
222 case MDrv_CMD_MSPI_SlaveEnable:
223 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_SlaveEnable\n");
224 pSlaveEnableParam = (PMSPI_SLAVE_ENABLE)pArgs;
225 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
226 {
227 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
228 return 0xFFFFFFFF;
229 }
230 psMSPIInstPri->fpMSPI_SlaveEnable(pSlaveEnableParam->bEnable);
231 UtopiaResourceRelease(pResource);
232 return 0;
233 case MDrv_CMD_MSPI_SetPowerState:
234 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_SetPowerState\n");
235 pSetPowerStateParam = (PMSPISETPOWERSTATE)pArgs;
236 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
237 {
238 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
239 return 0xFFFFFFFF;
240 }
241 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_SetPowerState(pSetPowerStateParam->enPowerState);
242 UtopiaResourceRelease(pResource);
243 return 0;
244 case MDrv_CMD_MSPI_DbgLEvel:
245 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MSPI_DbgLEvel\n");
246 pSetDbgLevelParam = (PMSPI_SETDBGLEVEL)pArgs;
247 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
248 {
249 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
250 return 0xFFFFFFFF;
251 }
252 u32Ret = (MS_U32)psMSPIInstPri->fpMSPI_SetDbgLevel(pSetDbgLevelParam->u8DbgLevel);
253 UtopiaResourceRelease(pResource);
254 return 0;
255
256 //===================================================================
257 // MSPI NEW API of support slave device id
258 //===================================================================
259 case MDrv_CMD_MasterSPI_Init:
260 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_Init\n");
261 pInitParam = (PMSPI_INIT)pArgs;
262 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
263 {
264 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
265 return 0xFFFFFFFF;
266 }
267 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_Init(pInitParam->ptMSPIConfig, pInitParam->u8HWNum);
268 UtopiaResourceRelease(pResource);
269 return 0;
270 case MDrv_CMD_MasterSPI_Read:
271 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_Read\n");
272 pMSPIReadParam = (PMASTERSPI_READ)pArgs;
273 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
274 {
275 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
276 return 0xFFFFFFFF;
277 }
278 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_Read(pMSPIReadParam->u32DevID, pMSPIReadParam->pu8Data, pMSPIReadParam->u16Size);
279 UtopiaResourceRelease(pResource);
280 return 0;
281 case MDrv_CMD_MasterSPI_Write:
282 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_Write\n");
283 pMSPIWriteParam = (PMASTERSPI_WRITE)pArgs;
284 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
285 {
286 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
287 return 0xFFFFFFFF;
288 }
289 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_Write(pMSPIWriteParam->u32DevID, pMSPIWriteParam->pu8Data, pMSPIWriteParam->u16Size);
290 UtopiaResourceRelease(pResource);
291 return 0;
292 case MDrv_CMD_MasterSPI_DCConfig:
293 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_DCConfig\n");
294 pMSPIDcconfigParam = (PMASTERSPI_DCCONFIG)pArgs;
295 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
296 {
297 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
298 return 0xFFFFFFFF;
299 }
300 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_DCConfig(pMSPIDcconfigParam->u32DevID, pMSPIDcconfigParam->ptDCConfig);
301 UtopiaResourceRelease(pResource);
302 return 0;
303
304 case MDrv_CMD_MasterSPI_CLKConfig:
305 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_CLKConfig\n");
306 pMSPICLKConfigParam = (PMASTERSPI_CLKCONFIG)pArgs;
307 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
308 {
309 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
310 return 0xFFFFFFFF;
311 }
312 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_CLKConfig(pMSPICLKConfigParam->u32DevID, pMSPICLKConfigParam->ptCLKConfig);
313 UtopiaResourceRelease(pResource);
314 return 0;
315 case MDrv_CMD_MasterSPI_FRAMEConfig:
316 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_FRAMEConfig\n");
317 pMSPIFrameConfigParam = (PMASTERSPI_FRAMECONFIG)pArgs;
318 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
319 {
320 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
321 return 0xFFFFFFFF;
322 }
323 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_FrameConfig(pMSPIFrameConfigParam->u32DevID, pMSPIFrameConfigParam->ptFrameConfig);
324 UtopiaResourceRelease(pResource);
325 return 0;
326 case MDrv_CMD_MasterSPI_SlaveEnable:
327 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_SlaveEnable\n");
328 pMSPISlaveEnableParam = (PMASTERSPI_SLAVE_ENABLE)pArgs;
329 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
330 {
331 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
332 return 0xFFFFFFFF;
333 }
334 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_SlaveEnable(pMSPISlaveEnableParam->u32DevID, pMSPISlaveEnableParam->bEnable);
335 UtopiaResourceRelease(pResource);
336 return 0;
337 case MDrv_CMD_MasterSPI_CSPadConfig:
338 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_CSPadConfig\n");
339 pMSPISetCsPadConfigParam = (PMASTERSPI_CSPADCONFIG)pArgs;
340 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
341 {
342 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
343 return 0xFFFFFFFF;
344 }
345 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_CsPadConfig(pMSPISetCsPadConfigParam->u32DevID, pMSPISetCsPadConfigParam->u32CsPad);
346 UtopiaResourceRelease(pResource);
347 return 0;
348 case MDrv_CMD_MasterSPI_MaxClkConfig:
349 ULOGD(TAG_MSPI, "MSPIIoctl - MDrv_CMD_MasterSPI_MaxClkConfig\n");
350 pMSPIMaxClkConfigParam = (PMASTERSPI_MAXCLKCONFIG)pArgs;
351 if(UtopiaResourceObtain(pModule, MSPI_POOL_ID, &pResource) != 0)
352 {
353 ULOGE(TAG_MSPI, "UtopiaResourceObtainToInstant fail\n");
354 return 0xFFFFFFFF;
355 }
356 u32Ret = (MS_U32)psMSPIInstPri->fpMasterSPI_MaxClkConfig(pMSPIMaxClkConfigParam->u32DevID, pMSPIMaxClkConfigParam->u32MaxClk);
357 UtopiaResourceRelease(pResource);
358 return 0;
359 default:
360 break;
361 };
362
363 return 0; // FIXME: error code
364 }
365
MSPIClose(void * pInstance)366 MS_U32 MSPIClose(void* pInstance)
367 {
368 UtopiaInstanceDelete(pInstance);
369
370 return TRUE;
371 }
372