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