Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | /* |
2 | ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/os/windows/ce/hif/spi/colibri.c#1 $ | |
3 | */ | |
4 | ||
5 | /*! \file "colibri.c" | |
6 | \brief Colibri platform specific functions | |
7 | ||
8 | */ | |
9 | ||
10 | ||
11 | ||
12 | /* | |
13 | ** $Log: colibri.c $ | |
14 | ** | |
15 | ** 09 17 2012 cm.chang | |
16 | ** [BORA00002149] [MT6630 Wi-Fi] Initial software development | |
17 | ** Duplicate source from MT6620 v2.3 driver branch | |
18 | ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base) | |
19 | * | |
20 | * 07 08 2010 cp.wu | |
21 | * | |
22 | * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository. | |
23 | * | |
24 | * 06 06 2010 kevin.huang | |
25 | * [WPD00003832][MT6620 5931] Create driver base | |
26 | * [MT6620 5931] Create driver base | |
27 | ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-04-29 20:13:47 GMT mtk01104 | |
28 | ** Fix bug. It needs OR, not AND in insteaGPIOConfigBackup() and GPIOConfigRestore() | |
29 | ** \main\maintrunk.MT6620WiFiDriver_Prj\1 2009-04-24 21:13:20 GMT mtk01104 | |
30 | ** Initial version | |
31 | */ | |
32 | ||
33 | /****************************************************************************** | |
34 | * C O M P I L E R F L A G S | |
35 | ******************************************************************************* | |
36 | */ | |
37 | ||
38 | /****************************************************************************** | |
39 | * E X T E R N A L R E F E R E N C E S | |
40 | ******************************************************************************* | |
41 | */ | |
42 | #include "gl_os.h" | |
43 | LINT_EXT_HEADER_BEGIN \v | |
44 | #include <ceddk.h> | |
45 | LINT_EXT_HEADER_END | |
46 | #include "hif.h" | |
47 | #include "colibri.h" | |
48 | /****************************************************************************** | |
49 | * C O N S T A N T S | |
50 | ******************************************************************************* | |
51 | */ | |
52 | /* Colibri custom IOCTL */ | |
53 | #define GPIO_EDGE_RISING 1 | |
54 | #define GPIO_EDGE_FALLING 2 | |
55 | /* For Interrupt GPIO to sysIRQ */ | |
56 | #define IOCTL_HAL_GPIO2IRQ \ | |
57 | CTL_CODE(FILE_DEVICE_HAL, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS) | |
58 | #define IOCTL_HAL_IRQEDGE \ | |
59 | CTL_CODE(FILE_DEVICE_HAL, 2050, METHOD_BUFFERED, FILE_ANY_ACCESS) | |
60 | /****************************************************************************** | |
61 | * D A T A T Y P E S | |
62 | ******************************************************************************* | |
63 | */ | |
64 | /****************************************************************************** | |
65 | * P U B L I C D A T A | |
66 | ******************************************************************************* | |
67 | */ | |
68 | /* volatile OST_Timer* pVOSTRegs = NULL; */ | |
69 | volatile CLK_MGR * pVClkMgr = NULL; | |
70 | volatile SSP_REG *pVSsp = NULL; | |
71 | volatile GPIO_REG *pVMem = NULL; | |
72 | ||
73 | /* For backup GPIO config */ | |
74 | UINT_32 Fun_GAFR0_U; | |
75 | UINT_32 IO_GPDR0; | |
76 | ||
77 | /****************************************************************************** | |
78 | * P R I V A T E D A T A | |
79 | ******************************************************************************* | |
80 | */ | |
81 | ||
82 | /****************************************************************************** | |
83 | * M A C R O S | |
84 | ******************************************************************************* | |
85 | */ | |
86 | ||
87 | /****************************************************************************** | |
88 | * F U N C T I O N D E C L A R A T I O N S | |
89 | ******************************************************************************* | |
90 | */ | |
91 | ||
92 | /*----------------------------------------------------------------------------*/ | |
93 | /*! | |
94 | * \brief This routine is to used for register access. | |
95 | * | |
96 | * \param[in] u4Cmd The Read/Write command use the MT5921 defined. | |
97 | * \param[in] u4Offset The register address | |
98 | * \param[in] pU4Value The read / wite buffer pointer | |
99 | * | |
100 | * \return None | |
101 | * | |
102 | */ | |
103 | /*----------------------------------------------------------------------------*/ | |
104 | VOID SpiSendCmd32(UINT_32 u4Cmd, UINT_32 u4Offset, UINT_32 *pU4Value) | |
105 | { | |
106 | UINT_32 u4CmdRespBuff = u4Cmd | (4 << 16) | u4Offset; | |
107 | #if CONFIG_SPI_8_BIT_MODE | |
108 | UINT_32 i; | |
109 | PUINT_8 pucBuff = (PUINT_8) &u4CmdRespBuff; | |
110 | #endif | |
111 | UINT_32 u4Value = 0; | |
112 | ||
113 | ASSERT(pU4Value); | |
114 | ||
115 | WAIT_BUS_CLEAR(u4CmdRespBuff); | |
116 | ||
117 | #if CONFIG_SPI_8_BIT_MODE | |
118 | i = 0; | |
119 | while (i < 4) { | |
120 | WAIT_BUS_READY_TX(); | |
121 | pVSsp->ssdr = pucBuff[i++]; /* for write cmd */ | |
122 | WAIT_BUS_READY_RX(u4Value); | |
123 | if (u4Value != 0) { | |
124 | (void)pVSsp->ssdr; | |
125 | } | |
126 | } | |
127 | ||
128 | if (u4Cmd & BIT(31)) { /* write */ | |
129 | pucBuff = (PUINT_8) pU4Value; | |
130 | i = 0; | |
131 | while (i < 4) { | |
132 | WAIT_BUS_READY_TX(); | |
133 | pVSsp->ssdr = pucBuff[i++]; /* write data */ | |
134 | } | |
135 | } else { /* read */ | |
136 | i = 0; | |
137 | while (i < 4) { | |
138 | WAIT_BUS_READY_TX(); | |
139 | pVSsp->ssdr = 0xff; /* for rsp */ | |
140 | WAIT_BUS_READY_RX(u4Value); | |
141 | pucBuff[i++] = (UINT_8) pVSsp->ssdr; | |
142 | } | |
143 | pucBuff = (PUINT_8) pU4Value; | |
144 | i = 0; | |
145 | while (i < 4) { | |
146 | WAIT_BUS_READY_TX(); | |
147 | pVSsp->ssdr = 0xff; /* for write data */ | |
148 | WAIT_BUS_READY_RX(u4Value); | |
149 | pucBuff[i++] = (UINT_8) pVSsp->ssdr; | |
150 | } | |
151 | } | |
152 | ||
153 | #else | |
154 | ||
155 | WAIT_BUS_READY_TX(); | |
156 | pVSsp->ssdr = u4CmdRespBuff; /* write cmd */ | |
157 | WAIT_BUS_READY_RX(u4Value); | |
158 | if (u4Value != 0) { | |
159 | (void)pVSsp->ssdr; | |
160 | } else { | |
161 | ASSERT(FALSE); | |
162 | } | |
163 | ||
164 | if (u4Cmd & BIT(31)) { /* write */ | |
165 | WAIT_BUS_READY_TX(); | |
166 | pVSsp->ssdr = pU4Value[0]; /* write data */ | |
167 | } else { /* read */ | |
168 | WAIT_BUS_READY_TX(); | |
169 | pVSsp->ssdr = 0xffffffff; | |
170 | WAIT_BUS_READY_RX(u4Value); | |
171 | if (u4Value != 0) { | |
172 | u4CmdRespBuff = pVSsp->ssdr; | |
173 | } else { | |
174 | ASSERT(FALSE); | |
175 | } | |
176 | ||
177 | WAIT_BUS_READY_TX(); | |
178 | pVSsp->ssdr = 0xffffffff; | |
179 | WAIT_BUS_READY_RX(u4Value); | |
180 | if (u4Value != 0) { | |
181 | pU4Value[0] = pVSsp->ssdr; | |
182 | } else { | |
183 | ASSERT(FALSE); | |
184 | } | |
185 | } | |
186 | #endif | |
187 | ||
188 | WAIT_BUS_DONE(); | |
189 | ||
190 | } | |
191 | ||
192 | ||
193 | /*----------------------------------------------------------------------------*/ | |
194 | /*! | |
195 | * \brief This routine is to used for port data access. | |
196 | * | |
197 | * \param[in] u4Cmd The Read/Write command use the MT5921 defined. | |
198 | * \param[in] u4Offset The register address | |
199 | * \param[in] pU4Value The read / wite buffer pointer | |
200 | * \param[in] u4Size The read / wite buffer size | |
201 | * | |
202 | * \return None | |
203 | * | |
204 | */ | |
205 | /*----------------------------------------------------------------------------*/ | |
206 | void SpiReadWriteData32(UINT_32 u4Cmd, UINT_32 u4Offset, UINT_8 *pucDataBuff, UINT_32 u4Size) | |
207 | { | |
208 | UINT_32 u4CmdRespBuff = u4Cmd | (u4Size << 16) | u4Offset; | |
209 | UINT_32 u4Value = 0; | |
210 | UINT_32 i = 0, j = 0, temp = 0; | |
211 | UINT_32 u4Len32bit = (u4Size >> 2); | |
212 | UINT_32 *pu4DataBuff; | |
213 | #if CONFIG_SPI_8_BIT_MODE | |
214 | UINT_32 k = 0; | |
215 | PUINT_8 pucBuff = (PUINT_8) &u4CmdRespBuff; | |
216 | #endif | |
217 | ||
218 | ASSERT(pucDataBuff); | |
219 | ||
220 | pu4DataBuff = (UINT_32 *) pucDataBuff; | |
221 | ||
222 | WAIT_BUS_CLEAR(u4CmdRespBuff); | |
223 | ||
224 | #if CONFIG_SPI_8_BIT_MODE | |
225 | ||
226 | k = 0; | |
227 | while (k < SPI_LOOP_COUNT) { | |
228 | WAIT_BUS_READY_TX(); | |
229 | pVSsp->ssdr = pucBuff[k++]; /* write cmd */ | |
230 | ||
231 | WAIT_BUS_READY_RX(u4Value); | |
232 | (void)pVSsp->ssdr; /* for write cmd */ | |
233 | } | |
234 | /* Data, use double word size */ | |
235 | if (u4Cmd & BIT(31)) { /* write */ | |
236 | pucBuff = (PUINT_8) pucDataBuff; | |
237 | if ((u4Len32bit >> 4) > 0) { | |
238 | for (i = 0; i < (u4Len32bit >> 4); i++) { | |
239 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
240 | WAIT_BUS_READY_TX(); | |
241 | pVSsp->ssdr = pucBuff[j]; | |
242 | WAIT_BUS_READY_TX(); | |
243 | pVSsp->ssdr = pucBuff[j + 1]; | |
244 | WAIT_BUS_READY_TX(); | |
245 | pVSsp->ssdr = pucBuff[j + 2]; | |
246 | WAIT_BUS_READY_TX(); | |
247 | pVSsp->ssdr = pucBuff[j + 3]; | |
248 | WAIT_BUS_READY_TX(); | |
249 | pVSsp->ssdr = pucBuff[j + 4]; | |
250 | WAIT_BUS_READY_TX(); | |
251 | pVSsp->ssdr = pucBuff[j + 5]; | |
252 | WAIT_BUS_READY_TX(); | |
253 | pVSsp->ssdr = pucBuff[j + 6]; | |
254 | WAIT_BUS_READY_TX(); | |
255 | pVSsp->ssdr = pucBuff[j + 7]; | |
256 | ||
257 | WAIT_BUS_READY_TX(); | |
258 | pVSsp->ssdr = pucBuff[j + 8]; | |
259 | WAIT_BUS_READY_TX(); | |
260 | pVSsp->ssdr = pucBuff[j + 9]; | |
261 | WAIT_BUS_READY_TX(); | |
262 | pVSsp->ssdr = pucBuff[j + 10]; | |
263 | WAIT_BUS_READY_TX(); | |
264 | pVSsp->ssdr = pucBuff[j + 11]; | |
265 | WAIT_BUS_READY_TX(); | |
266 | pVSsp->ssdr = pucBuff[j + 12]; | |
267 | WAIT_BUS_READY_TX(); | |
268 | pVSsp->ssdr = pucBuff[j + 13]; | |
269 | WAIT_BUS_READY_TX(); | |
270 | pVSsp->ssdr = pucBuff[j + 14]; | |
271 | WAIT_BUS_READY_TX(); | |
272 | pVSsp->ssdr = pucBuff[j + 15]; | |
273 | j += 16; | |
274 | } | |
275 | } | |
276 | } | |
277 | ||
278 | if ((u4Len32bit & 0x8) != 0) { | |
279 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
280 | WAIT_BUS_READY_TX(); | |
281 | pVSsp->ssdr = pucBuff[j]; | |
282 | WAIT_BUS_READY_TX(); | |
283 | pVSsp->ssdr = pucBuff[j + 1]; | |
284 | WAIT_BUS_READY_TX(); | |
285 | pVSsp->ssdr = pucBuff[j + 2]; | |
286 | WAIT_BUS_READY_TX(); | |
287 | pVSsp->ssdr = pucBuff[j + 3]; | |
288 | WAIT_BUS_READY_TX(); | |
289 | pVSsp->ssdr = pucBuff[j + 4]; | |
290 | WAIT_BUS_READY_TX(); | |
291 | pVSsp->ssdr = pucBuff[j + 5]; | |
292 | WAIT_BUS_READY_TX(); | |
293 | pVSsp->ssdr = pucBuff[j + 6]; | |
294 | WAIT_BUS_READY_TX(); | |
295 | pVSsp->ssdr = pucBuff[j + 7]; | |
296 | j += 8; | |
297 | } | |
298 | } | |
299 | ||
300 | if ((u4Len32bit & 0x4) != 0) { | |
301 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
302 | WAIT_BUS_READY_TX(); | |
303 | pVSsp->ssdr = pucBuff[j]; | |
304 | WAIT_BUS_READY_TX(); | |
305 | pVSsp->ssdr = pucBuff[j + 1]; | |
306 | WAIT_BUS_READY_TX(); | |
307 | pVSsp->ssdr = pucBuff[j + 2]; | |
308 | WAIT_BUS_READY_TX(); | |
309 | pVSsp->ssdr = pucBuff[j + 3]; | |
310 | j += 4; | |
311 | } | |
312 | } | |
313 | ||
314 | temp = (u4Len32bit & 0x3); | |
315 | while (temp--) { | |
316 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
317 | WAIT_BUS_READY_TX(); | |
318 | pVSsp->ssdr = pucBuff[j++]; | |
319 | } | |
320 | } | |
321 | ||
322 | } else { /* read */ | |
323 | ||
324 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
325 | WAIT_BUS_READY_TX(); | |
326 | pVSsp->ssdr = 0xff; /* rsp */ | |
327 | WAIT_BUS_READY_RX(u4Value); | |
328 | (void)pVSsp->ssdr; /* for rsp */ | |
329 | } | |
330 | pucBuff = (PUINT_8) &pu4DataBuff[0]; | |
331 | if ((u4Len32bit >> 4) > 0) { | |
332 | for (i; i < (u4Len32bit >> 4); i++) { | |
333 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
334 | WAIT_BUS_READY_TX(); | |
335 | pVSsp->ssdr = 0xFFFFFFFF; | |
336 | pVSsp->ssdr = 0xFFFFFFFF; | |
337 | pVSsp->ssdr = 0xFFFFFFFF; | |
338 | pVSsp->ssdr = 0xFFFFFFFF; | |
339 | pVSsp->ssdr = 0xFFFFFFFF; | |
340 | ||
341 | pVSsp->ssdr = 0xFFFFFFFF; | |
342 | pVSsp->ssdr = 0xFFFFFFFF; | |
343 | pVSsp->ssdr = 0xFFFFFFFF; | |
344 | pVSsp->ssdr = 0xFFFFFFFF; | |
345 | pVSsp->ssdr = 0xFFFFFFFF; | |
346 | ||
347 | pVSsp->ssdr = 0xFFFFFFFF; | |
348 | pVSsp->ssdr = 0xFFFFFFFF; | |
349 | pVSsp->ssdr = 0xFFFFFFFF; | |
350 | pVSsp->ssdr = 0xFFFFFFFF; | |
351 | pVSsp->ssdr = 0xFFFFFFFF; | |
352 | ||
353 | pVSsp->ssdr = 0xFFFFFFFF; | |
354 | ||
355 | WAIT_BUS_READY_RX(u4Value); | |
356 | pucBuff[j] = (UINT_8) pVSsp->ssdr; | |
357 | WAIT_BUS_READY_RX(u4Value); | |
358 | pucBuff[j + 1] = (UINT_8) pVSsp->ssdr; | |
359 | WAIT_BUS_READY_RX(u4Value); | |
360 | pucBuff[j + 2] = (UINT_8) pVSsp->ssdr; | |
361 | WAIT_BUS_READY_RX(u4Value); | |
362 | pucBuff[j + 3] = (UINT_8) pVSsp->ssdr; | |
363 | WAIT_BUS_READY_RX(u4Value); | |
364 | pucBuff[j + 4] = (UINT_8) pVSsp->ssdr; | |
365 | ||
366 | WAIT_BUS_READY_RX(u4Value); | |
367 | pucBuff[j + 5] = (UINT_8) pVSsp->ssdr; | |
368 | WAIT_BUS_READY_RX(u4Value); | |
369 | pucBuff[j + 6] = (UINT_8) pVSsp->ssdr; | |
370 | WAIT_BUS_READY_RX(u4Value); | |
371 | pucBuff[j + 7] = (UINT_8) pVSsp->ssdr; | |
372 | WAIT_BUS_READY_RX(u4Value); | |
373 | pucBuff[j + 8] = (UINT_8) pVSsp->ssdr; | |
374 | WAIT_BUS_READY_RX(u4Value); | |
375 | pucBuff[j + 9] = (UINT_8) pVSsp->ssdr; | |
376 | ||
377 | WAIT_BUS_READY_RX(u4Value); | |
378 | pucBuff[j + 10] = (UINT_8) pVSsp->ssdr; | |
379 | WAIT_BUS_READY_RX(u4Value); | |
380 | pucBuff[j + 11] = (UINT_8) pVSsp->ssdr; | |
381 | WAIT_BUS_READY_RX(u4Value); | |
382 | pucBuff[j + 12] = (UINT_8) pVSsp->ssdr; | |
383 | WAIT_BUS_READY_RX(u4Value); | |
384 | pucBuff[j + 13] = (UINT_8) pVSsp->ssdr; | |
385 | WAIT_BUS_READY_RX(u4Value); | |
386 | pucBuff[j + 14] = (UINT_8) pVSsp->ssdr; | |
387 | ||
388 | WAIT_BUS_READY_RX(u4Value); | |
389 | pucBuff[j + 15] = (UINT_8) pVSsp->ssdr; | |
390 | j += 16; | |
391 | } | |
392 | } | |
393 | } | |
394 | ||
395 | if ((u4Len32bit & 0x8) != 0) { | |
396 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
397 | WAIT_BUS_READY_TX(); | |
398 | pVSsp->ssdr = 0xFFFFFFFF; | |
399 | pVSsp->ssdr = 0xFFFFFFFF; | |
400 | pVSsp->ssdr = 0xFFFFFFFF; | |
401 | pVSsp->ssdr = 0xFFFFFFFF; | |
402 | pVSsp->ssdr = 0xFFFFFFFF; | |
403 | ||
404 | pVSsp->ssdr = 0xFFFFFFFF; | |
405 | pVSsp->ssdr = 0xFFFFFFFF; | |
406 | pVSsp->ssdr = 0xFFFFFFFF; | |
407 | ||
408 | WAIT_BUS_READY_RX(u4Value); | |
409 | pucBuff[j] = (UINT_8) pVSsp->ssdr; | |
410 | WAIT_BUS_READY_RX(u4Value); | |
411 | pucBuff[j + 1] = (UINT_8) pVSsp->ssdr; | |
412 | WAIT_BUS_READY_RX(u4Value); | |
413 | pucBuff[j + 2] = (UINT_8) pVSsp->ssdr; | |
414 | WAIT_BUS_READY_RX(u4Value); | |
415 | pucBuff[j + 3] = (UINT_8) pVSsp->ssdr; | |
416 | WAIT_BUS_READY_RX(u4Value); | |
417 | pucBuff[j + 4] = (UINT_8) pVSsp->ssdr; | |
418 | ||
419 | WAIT_BUS_READY_RX(u4Value); | |
420 | pucBuff[j + 5] = (UINT_8) pVSsp->ssdr; | |
421 | WAIT_BUS_READY_RX(u4Value); | |
422 | pucBuff[j + 6] = (UINT_8) pVSsp->ssdr; | |
423 | WAIT_BUS_READY_RX(u4Value); | |
424 | pucBuff[j + 7] = (UINT_8) pVSsp->ssdr; | |
425 | j += 8; | |
426 | } | |
427 | } | |
428 | ||
429 | if ((u4Len32bit & 0x4) != 0) { | |
430 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
431 | WAIT_BUS_READY_TX(); | |
432 | pVSsp->ssdr = 0xFFFFFFFF; | |
433 | pVSsp->ssdr = 0xFFFFFFFF; | |
434 | pVSsp->ssdr = 0xFFFFFFFF; | |
435 | pVSsp->ssdr = 0xFFFFFFFF; | |
436 | ||
437 | WAIT_BUS_READY_RX(u4Value); | |
438 | pucBuff[j] = (UINT_8) pVSsp->ssdr; | |
439 | WAIT_BUS_READY_RX(u4Value); | |
440 | pucBuff[j + 1] = (UINT_8) pVSsp->ssdr; | |
441 | WAIT_BUS_READY_RX(u4Value); | |
442 | pucBuff[j + 2] = (UINT_8) pVSsp->ssdr; | |
443 | WAIT_BUS_READY_RX(u4Value); | |
444 | pucBuff[j + 3] = (UINT_8) pVSsp->ssdr; | |
445 | j += 4; | |
446 | } | |
447 | } | |
448 | ||
449 | temp = (u4Len32bit & 0x3); | |
450 | while (temp--) { | |
451 | for (k = 0; k < SPI_LOOP_COUNT; k++) { | |
452 | WAIT_BUS_READY_TX(); | |
453 | pVSsp->ssdr = 0xFF; | |
454 | WAIT_BUS_READY_RX(u4Value); | |
455 | pucBuff[j++] = (UINT_8) pVSsp->ssdr; | |
456 | } | |
457 | } | |
458 | } | |
459 | ||
460 | #else /* 32-bit mode */ | |
461 | WAIT_BUS_READY_TX(); | |
462 | pVSsp->ssdr = u4CmdRespBuff; /* write cmd */ | |
463 | ||
464 | WAIT_BUS_READY_RX(u4Value); | |
465 | u4Value = pVSsp->ssdr; /* for write cmd */ | |
466 | ||
467 | /* Data, use double word size */ | |
468 | if (u4Cmd & BIT(31)) { /* write */ | |
469 | if ((u4Len32bit >> 4) > 0) { | |
470 | for (i = 0; i < (u4Len32bit >> 4); i++) { | |
471 | WAIT_BUS_READY_TX(); | |
472 | pVSsp->ssdr = pu4DataBuff[j]; | |
473 | WAIT_BUS_READY_TX(); | |
474 | pVSsp->ssdr = pu4DataBuff[j + 1]; | |
475 | WAIT_BUS_READY_TX(); | |
476 | pVSsp->ssdr = pu4DataBuff[j + 2]; | |
477 | WAIT_BUS_READY_TX(); | |
478 | pVSsp->ssdr = pu4DataBuff[j + 3]; | |
479 | WAIT_BUS_READY_TX(); | |
480 | pVSsp->ssdr = pu4DataBuff[j + 4]; | |
481 | WAIT_BUS_READY_TX(); | |
482 | pVSsp->ssdr = pu4DataBuff[j + 5]; | |
483 | WAIT_BUS_READY_TX(); | |
484 | pVSsp->ssdr = pu4DataBuff[j + 6]; | |
485 | WAIT_BUS_READY_TX(); | |
486 | pVSsp->ssdr = pu4DataBuff[j + 7]; | |
487 | WAIT_BUS_READY_TX(); | |
488 | pVSsp->ssdr = pu4DataBuff[j + 8]; | |
489 | WAIT_BUS_READY_TX(); | |
490 | pVSsp->ssdr = pu4DataBuff[j + 9]; | |
491 | WAIT_BUS_READY_TX(); | |
492 | pVSsp->ssdr = pu4DataBuff[j + 10]; | |
493 | WAIT_BUS_READY_TX(); | |
494 | pVSsp->ssdr = pu4DataBuff[j + 11]; | |
495 | WAIT_BUS_READY_TX(); | |
496 | pVSsp->ssdr = pu4DataBuff[j + 12]; | |
497 | WAIT_BUS_READY_TX(); | |
498 | pVSsp->ssdr = pu4DataBuff[j + 13]; | |
499 | WAIT_BUS_READY_TX(); | |
500 | pVSsp->ssdr = pu4DataBuff[j + 14]; | |
501 | WAIT_BUS_READY_TX(); | |
502 | pVSsp->ssdr = pu4DataBuff[j + 15]; | |
503 | j += 16; | |
504 | } | |
505 | } | |
506 | ||
507 | if ((u4Len32bit & 0x8) != 0) { | |
508 | WAIT_BUS_READY_TX(); | |
509 | pVSsp->ssdr = pu4DataBuff[j]; | |
510 | WAIT_BUS_READY_TX(); | |
511 | pVSsp->ssdr = pu4DataBuff[j + 1]; | |
512 | WAIT_BUS_READY_TX(); | |
513 | pVSsp->ssdr = pu4DataBuff[j + 2]; | |
514 | WAIT_BUS_READY_TX(); | |
515 | pVSsp->ssdr = pu4DataBuff[j + 3]; | |
516 | WAIT_BUS_READY_TX(); | |
517 | pVSsp->ssdr = pu4DataBuff[j + 4]; | |
518 | WAIT_BUS_READY_TX(); | |
519 | pVSsp->ssdr = pu4DataBuff[j + 5]; | |
520 | WAIT_BUS_READY_TX(); | |
521 | pVSsp->ssdr = pu4DataBuff[j + 6]; | |
522 | WAIT_BUS_READY_TX(); | |
523 | pVSsp->ssdr = pu4DataBuff[j + 7]; | |
524 | j += 8; | |
525 | } | |
526 | ||
527 | if ((u4Len32bit & 0x4) != 0) { | |
528 | WAIT_BUS_READY_TX(); | |
529 | pVSsp->ssdr = pu4DataBuff[j]; | |
530 | WAIT_BUS_READY_TX(); | |
531 | pVSsp->ssdr = pu4DataBuff[j + 1]; | |
532 | WAIT_BUS_READY_TX(); | |
533 | pVSsp->ssdr = pu4DataBuff[j + 2]; | |
534 | WAIT_BUS_READY_TX(); | |
535 | pVSsp->ssdr = pu4DataBuff[j + 3]; | |
536 | j += 4; | |
537 | } | |
538 | ||
539 | temp = (u4Len32bit & 0x3); | |
540 | while (temp--) { | |
541 | WAIT_BUS_READY_TX(); | |
542 | pVSsp->ssdr = pu4DataBuff[j++]; | |
543 | } | |
544 | ||
545 | } else { /* read */ | |
546 | ||
547 | WAIT_BUS_READY_TX(); | |
548 | pVSsp->ssdr = 0xffffffff; /* rsp */ | |
549 | WAIT_BUS_READY_RX(u4Value); | |
550 | u4Value = pVSsp->ssdr; /* for rsp */ | |
551 | ||
552 | if ((u4Len32bit >> 4) > 0) { | |
553 | for (i; i < (u4Len32bit >> 4); i++) { | |
554 | WAIT_BUS_READY_TX(); | |
555 | pVSsp->ssdr = 0xFFFFFFFF; | |
556 | pVSsp->ssdr = 0xFFFFFFFF; | |
557 | pVSsp->ssdr = 0xFFFFFFFF; | |
558 | pVSsp->ssdr = 0xFFFFFFFF; | |
559 | pVSsp->ssdr = 0xFFFFFFFF; | |
560 | ||
561 | pVSsp->ssdr = 0xFFFFFFFF; | |
562 | pVSsp->ssdr = 0xFFFFFFFF; | |
563 | pVSsp->ssdr = 0xFFFFFFFF; | |
564 | pVSsp->ssdr = 0xFFFFFFFF; | |
565 | pVSsp->ssdr = 0xFFFFFFFF; | |
566 | ||
567 | pVSsp->ssdr = 0xFFFFFFFF; | |
568 | pVSsp->ssdr = 0xFFFFFFFF; | |
569 | pVSsp->ssdr = 0xFFFFFFFF; | |
570 | pVSsp->ssdr = 0xFFFFFFFF; | |
571 | pVSsp->ssdr = 0xFFFFFFFF; | |
572 | ||
573 | pVSsp->ssdr = 0xFFFFFFFF; | |
574 | ||
575 | WAIT_BUS_READY_RX(u4Value); | |
576 | pu4DataBuff[j] = pVSsp->ssdr; | |
577 | WAIT_BUS_READY_RX(u4Value); | |
578 | pu4DataBuff[j + 1] = pVSsp->ssdr; | |
579 | WAIT_BUS_READY_RX(u4Value); | |
580 | pu4DataBuff[j + 2] = pVSsp->ssdr; | |
581 | WAIT_BUS_READY_RX(u4Value); | |
582 | pu4DataBuff[j + 3] = pVSsp->ssdr; | |
583 | WAIT_BUS_READY_RX(u4Value); | |
584 | pu4DataBuff[j + 4] = pVSsp->ssdr; | |
585 | ||
586 | WAIT_BUS_READY_RX(u4Value); | |
587 | pu4DataBuff[j + 5] = pVSsp->ssdr; | |
588 | WAIT_BUS_READY_RX(u4Value); | |
589 | pu4DataBuff[j + 6] = pVSsp->ssdr; | |
590 | WAIT_BUS_READY_RX(u4Value); | |
591 | pu4DataBuff[j + 7] = pVSsp->ssdr; | |
592 | WAIT_BUS_READY_RX(u4Value); | |
593 | pu4DataBuff[j + 8] = pVSsp->ssdr; | |
594 | WAIT_BUS_READY_RX(u4Value); | |
595 | pu4DataBuff[j + 9] = pVSsp->ssdr; | |
596 | ||
597 | WAIT_BUS_READY_RX(u4Value); | |
598 | pu4DataBuff[j + 10] = pVSsp->ssdr; | |
599 | WAIT_BUS_READY_RX(u4Value); | |
600 | pu4DataBuff[j + 11] = pVSsp->ssdr; | |
601 | WAIT_BUS_READY_RX(u4Value); | |
602 | pu4DataBuff[j + 12] = pVSsp->ssdr; | |
603 | WAIT_BUS_READY_RX(u4Value); | |
604 | pu4DataBuff[j + 13] = pVSsp->ssdr; | |
605 | WAIT_BUS_READY_RX(u4Value); | |
606 | pu4DataBuff[j + 14] = pVSsp->ssdr; | |
607 | ||
608 | WAIT_BUS_READY_RX(u4Value); | |
609 | pu4DataBuff[j + 15] = pVSsp->ssdr; | |
610 | j += 16; | |
611 | } | |
612 | } | |
613 | ||
614 | if ((u4Len32bit & 0x8) != 0) { | |
615 | WAIT_BUS_READY_TX(); | |
616 | pVSsp->ssdr = 0xFFFFFFFF; | |
617 | pVSsp->ssdr = 0xFFFFFFFF; | |
618 | pVSsp->ssdr = 0xFFFFFFFF; | |
619 | pVSsp->ssdr = 0xFFFFFFFF; | |
620 | pVSsp->ssdr = 0xFFFFFFFF; | |
621 | ||
622 | pVSsp->ssdr = 0xFFFFFFFF; | |
623 | pVSsp->ssdr = 0xFFFFFFFF; | |
624 | pVSsp->ssdr = 0xFFFFFFFF; | |
625 | ||
626 | WAIT_BUS_READY_RX(u4Value); | |
627 | pu4DataBuff[j] = pVSsp->ssdr; | |
628 | WAIT_BUS_READY_RX(u4Value); | |
629 | pu4DataBuff[j + 1] = pVSsp->ssdr; | |
630 | WAIT_BUS_READY_RX(u4Value); | |
631 | pu4DataBuff[j + 2] = pVSsp->ssdr; | |
632 | WAIT_BUS_READY_RX(u4Value); | |
633 | pu4DataBuff[j + 3] = pVSsp->ssdr; | |
634 | WAIT_BUS_READY_RX(u4Value); | |
635 | pu4DataBuff[j + 4] = pVSsp->ssdr; | |
636 | ||
637 | WAIT_BUS_READY_RX(u4Value); | |
638 | pu4DataBuff[j + 5] = pVSsp->ssdr; | |
639 | WAIT_BUS_READY_RX(u4Value); | |
640 | pu4DataBuff[j + 6] = pVSsp->ssdr; | |
641 | WAIT_BUS_READY_RX(u4Value); | |
642 | pu4DataBuff[j + 7] = pVSsp->ssdr; | |
643 | j += 8; | |
644 | } | |
645 | if ((u4Len32bit & 0x4) != 0) { | |
646 | WAIT_BUS_READY_TX(); | |
647 | pVSsp->ssdr = 0xFFFFFFFF; | |
648 | pVSsp->ssdr = 0xFFFFFFFF; | |
649 | pVSsp->ssdr = 0xFFFFFFFF; | |
650 | pVSsp->ssdr = 0xFFFFFFFF; | |
651 | ||
652 | WAIT_BUS_READY_RX(u4Value); | |
653 | pu4DataBuff[j] = pVSsp->ssdr; | |
654 | WAIT_BUS_READY_RX(u4Value); | |
655 | pu4DataBuff[j + 1] = pVSsp->ssdr; | |
656 | WAIT_BUS_READY_RX(u4Value); | |
657 | pu4DataBuff[j + 2] = pVSsp->ssdr; | |
658 | WAIT_BUS_READY_RX(u4Value); | |
659 | pu4DataBuff[j + 3] = pVSsp->ssdr; | |
660 | j += 4; | |
661 | } | |
662 | ||
663 | temp = (u4Len32bit & 0x3); | |
664 | while (temp--) { | |
665 | WAIT_BUS_READY_TX(); | |
666 | pVSsp->ssdr = 0xFFFFFFFF; | |
667 | WAIT_BUS_READY_RX(u4Value); | |
668 | pu4DataBuff[j++] = pVSsp->ssdr; | |
669 | } | |
670 | ||
671 | } | |
672 | #endif | |
673 | ||
674 | WAIT_BUS_DONE(); | |
675 | } | |
676 | ||
677 | /*----------------------------------------------------------------------------*/ | |
678 | /*! | |
679 | * \brief This routine is used to set spi bus width. | |
680 | * | |
681 | * \param[in] u4BusSize - Bus size. | |
682 | * | |
683 | * \retval 0 TRUE | |
684 | * \retval -1 FALSE | |
685 | */ | |
686 | /*----------------------------------------------------------------------------*/ | |
687 | static INT_32 SpiSetBusWidth(UINT_32 u4BusSize) | |
688 | { | |
689 | /* if size is not valid, return with size unchanged */ | |
690 | /* if (u4BusSize > 32 || u4BusSize < 4) */ | |
691 | if (u4BusSize != 32 && u4BusSize != 8) | |
692 | return -1; | |
693 | ||
694 | /* 1) disable port */ | |
695 | pVSsp->sscr0 &= ~SSCR0_SSE; | |
696 | ||
697 | /* 2) clear size field */ | |
698 | pVSsp->sscr0 &= ~(SSCR0_DSS_32BIT | SSCR0_EDSS); | |
699 | ||
700 | /* MUST restore SSCR1 value after disable SSE */ | |
701 | pVSsp->sscr1 = SSCR1_SPH | SSCR1_SPO | (3 << 6) | (0 << 10); | |
702 | ||
703 | /* 3) set size and enable port */ | |
704 | pVSsp->sscr0 |= (SSCR0_DSS_SIZE(u4BusSize) | SSCR0_SSE); | |
705 | ||
706 | return 0; | |
707 | } /* SpiSetBusWidth */ | |
708 | ||
709 | ||
710 | /*----------------------------------------------------------------------------*/ | |
711 | /*! | |
712 | * \brief This routine is used to set operation mode to n-bit mode and Endian. | |
713 | * | |
714 | * \param[in] u4BusSize - Bus size. | |
715 | * | |
716 | * \return none | |
717 | */ | |
718 | /*----------------------------------------------------------------------------*/ | |
719 | static VOID SpiSetOpMode(VOID) | |
720 | { | |
721 | #if !CONFIG_SPI_8_BIT_MODE | |
722 | UINT_32 u4Value = 0; | |
723 | #endif | |
724 | ||
725 | /* Set bus to 32-bit mode */ | |
726 | #if CONFIG_SPI_8_BIT_MODE | |
727 | if (SpiSetBusWidth(8) != 0) { | |
728 | ASSERT(FALSE); | |
729 | return; | |
730 | } | |
731 | DBGLOG(INIT, TRACE, ("Set bus to 8-bit mode\n")); | |
732 | #else | |
733 | if (SpiSetBusWidth(32) != 0) { | |
734 | ASSERT(FALSE); | |
735 | return; | |
736 | } | |
737 | DBGLOG(INIT, TRACE, ("Set bus to 32-bit mode\n")); | |
738 | #endif | |
739 | ||
740 | #if !CONFIG_SPI_8_BIT_MODE | |
741 | /* SPI CSR set from 8 bit mode to 32 bit mode, notice the byte order */ | |
742 | /* Set this after set bus to 32-bit mode */ | |
743 | WAIT_BUS_READY_TX(); | |
744 | pVSsp->ssdr = SPICSR_32BIT_MODE_ADDR; | |
745 | WAIT_BUS_READY_RX(u4Value); | |
746 | if (u4Value != 0) { | |
747 | (void)pVSsp->ssdr; | |
748 | } else { | |
749 | ASSERT(FALSE); | |
750 | } | |
751 | ||
752 | WAIT_BUS_READY_TX(); | |
753 | pVSsp->ssdr = SPICSR_32BIT_MODE_DATA; | |
754 | WAIT_BUS_READY_RX(u4Value); | |
755 | if (u4Value != 0) { | |
756 | (void)pVSsp->ssdr; | |
757 | } else { | |
758 | ASSERT(FALSE); | |
759 | } | |
760 | #endif | |
761 | ||
762 | } /* SpiSetOpMode */ | |
763 | ||
764 | ||
765 | /*----------------------------------------------------------------------------*/ | |
766 | /*! | |
767 | * \brief Modify GP DDR For Input Direction | |
768 | * aGpioPinArray[] = array of GPIO pins, | |
769 | * aGpioPinArray[0] = size of array | |
770 | * | |
771 | * \param[in] aGpioPinArray[] - rray of GPIO pins. | |
772 | * | |
773 | * \return none | |
774 | */ | |
775 | /*----------------------------------------------------------------------------*/ | |
776 | static VOID GpioSetDirectionIn(P_GPIO_REG prGPIO, UINT_32 au4GpioPinArray[] | |
777 | ) | |
778 | { | |
779 | UINT_32 u4GpioPinMask; | |
780 | UINT_32 u4SizeArray; | |
781 | UINT_32 u4Mask0, u4Mask1, u4Mask2, u4Mask3; | |
782 | BOOL fgSet0, fgSet1, fgSet2, fgSet3; | |
783 | UINT_32 i; | |
784 | ||
785 | ASSERT(prGPIO); | |
786 | ASSERT(au4GpioPinArray); | |
787 | ||
788 | /* determine size of array */ | |
789 | u4SizeArray = au4GpioPinArray[0]; | |
790 | u4Mask0 = u4Mask1 = u4Mask2 = u4Mask3 = 0; | |
791 | fgSet0 = fgSet1 = fgSet2 = fgSet3 = FALSE; | |
792 | ||
793 | for (i = 1; i <= u4SizeArray; i++) { | |
794 | u4GpioPinMask = 0x1u << (au4GpioPinArray[i] & 0x1F); | |
795 | if (au4GpioPinArray[i] > 95) { | |
796 | u4Mask3 |= u4GpioPinMask; | |
797 | fgSet3 = TRUE; | |
798 | } else if (au4GpioPinArray[i] > 63) { | |
799 | u4Mask2 |= u4GpioPinMask; | |
800 | fgSet2 = TRUE; | |
801 | } else if (au4GpioPinArray[i] > 31) { | |
802 | u4Mask1 |= u4GpioPinMask; | |
803 | fgSet1 = TRUE; | |
804 | } else { | |
805 | u4Mask0 |= u4GpioPinMask; | |
806 | fgSet0 = TRUE; | |
807 | } | |
808 | ||
809 | } | |
810 | ||
811 | if (fgSet3) { | |
812 | prGPIO->GPDR3 = ((prGPIO->GPDR3 & ~u4Mask3) & ~GPIO_PIN_RESERVED_BITS); | |
813 | } | |
814 | if (fgSet2) { | |
815 | prGPIO->GPDR2 = ((prGPIO->GPDR2) & ~u4Mask2); | |
816 | } | |
817 | if (fgSet1) { | |
818 | prGPIO->GPDR1 = ((prGPIO->GPDR1) & ~u4Mask1); | |
819 | } | |
820 | if (fgSet0) { | |
821 | prGPIO->GPDR0 = ((prGPIO->GPDR0) & ~u4Mask0); | |
822 | } | |
823 | } /* GpioSetDirectionIn */ | |
824 | ||
825 | ||
826 | /*----------------------------------------------------------------------------*/ | |
827 | /*! | |
828 | * \brief Modify GP DDR For Output Direction, | |
829 | * aGpioPinArray[]=array of GPIO pins, | |
830 | * aGpioPinArray[0] = size of array | |
831 | * | |
832 | * \param[in] aGpioPinArray[] - array of GPIO pins | |
833 | * | |
834 | * \return none | |
835 | */ | |
836 | /*----------------------------------------------------------------------------*/ | |
837 | static VOID GpioSetDirectionOut(P_GPIO_REG prGPIO, UINT_32 au4GpioPinArray[] | |
838 | ) | |
839 | { | |
840 | UINT_32 u4GpioPinMask; | |
841 | UINT_32 u4SizeArray; | |
842 | UINT_32 u4Mask0, u4Mask1, u4Mask2, u4Mask3; | |
843 | BOOL fgSet0, fgSet1, fgSet2, fgSet3; | |
844 | UINT_32 i; | |
845 | ||
846 | ASSERT(prGPIO); | |
847 | ASSERT(au4GpioPinArray); | |
848 | ||
849 | /* determine size of array */ | |
850 | u4SizeArray = au4GpioPinArray[0]; | |
851 | u4Mask0 = u4Mask1 = u4Mask2 = u4Mask3 = 0; | |
852 | fgSet0 = fgSet1 = fgSet2 = fgSet3 = FALSE; | |
853 | ||
854 | for (i = 1; i <= u4SizeArray; i++) { | |
855 | u4GpioPinMask = 0x1u << (au4GpioPinArray[i] & 0x1F); | |
856 | if (au4GpioPinArray[i] > 95) { | |
857 | u4Mask3 |= u4GpioPinMask; | |
858 | fgSet3 = TRUE; | |
859 | } else if (au4GpioPinArray[i] > 63) { | |
860 | u4Mask2 |= u4GpioPinMask; | |
861 | fgSet2 = TRUE; | |
862 | } else if (au4GpioPinArray[i] > 31) { | |
863 | u4Mask1 |= u4GpioPinMask; | |
864 | fgSet1 = TRUE; | |
865 | } else { | |
866 | u4Mask0 |= u4GpioPinMask; | |
867 | fgSet0 = TRUE; | |
868 | } | |
869 | } | |
870 | if (fgSet3) { | |
871 | prGPIO->GPDR3 = ((prGPIO->GPDR3 | u4Mask3) & ~GPIO_PIN_RESERVED_BITS); | |
872 | } | |
873 | if (fgSet2) { | |
874 | prGPIO->GPDR2 = ((prGPIO->GPDR2) | u4Mask2); | |
875 | } | |
876 | if (fgSet1) { | |
877 | prGPIO->GPDR1 = ((prGPIO->GPDR1) | u4Mask1); | |
878 | } | |
879 | if (fgSet0) { | |
880 | prGPIO->GPDR0 = ((prGPIO->GPDR0) | u4Mask0); | |
881 | } | |
882 | } /* GpioSetDirectionOut */ | |
883 | ||
884 | ||
885 | /*----------------------------------------------------------------------------*/ | |
886 | /*! | |
887 | * \brief Set GPIO pins alternate function values, | |
888 | * aGpioPinArray[]=array of GPIO pins, | |
889 | * aGpioPinArray[0] = size of array | |
890 | * | |
891 | * aAfValueArray[]=array of GPIO pins alternate function values, | |
892 | * aAfValueArray[0] = size of array | |
893 | * \param[in] aGpioPinArray[] - array of GPIO pins | |
894 | * \param[in] aAfValueArray[] - array of GPIO pins alternate function values | |
895 | * | |
896 | * \return none | |
897 | * \note: IMPORTANT:THE ORDER OF aAfValueArray[] HAS TO MATCH THE ORDER OF aGpioPinArray[] | |
898 | */ | |
899 | /*----------------------------------------------------------------------------*/ | |
900 | static VOID GpioSetAlternateFn(P_GPIO_REG prGPIO, UINT_32 au4GpioPinArray[], UINT_32 aAfValueArray[] | |
901 | ) | |
902 | { | |
903 | UINT_32 u4GpioPinAFMask; | |
904 | UINT_32 u4GpioPinAFValue; | |
905 | UINT_32 u4SizeArray; | |
906 | UINT_32 u4Mask0_U, u4Mask0_L, u4Mask1_U, u4Mask1_L; | |
907 | UINT_32 u4Mask2_U, u4Mask2_L, u4Mask3_U, u4Mask3_L; | |
908 | UINT_32 u4AFnV0_U, u4AFnV0_L, u4AFnV1_U, u4AFnV1_L; | |
909 | UINT_32 u4AFnV2_U, u4AFnV2_L, u4AFnV3_U, u4AFnV3_L; | |
910 | BOOL fgSet0_U, fgSet0_L, fgSet1_U, fgSet1_L; | |
911 | BOOL fgSet2_U, fgSet2_L, fgSet3_U, fgSet3_L; | |
912 | UINT_32 i; | |
913 | ||
914 | ASSERT(prGPIO); | |
915 | ASSERT(au4GpioPinArray); | |
916 | ASSERT(aAfValueArray); | |
917 | ||
918 | /* determine size of array */ | |
919 | u4SizeArray = au4GpioPinArray[0]; | |
920 | u4Mask0_U = u4Mask0_L = u4Mask1_U = u4Mask1_L = 0; | |
921 | u4Mask2_U = u4Mask2_L = u4Mask3_U = u4Mask3_L = 0; | |
922 | u4AFnV0_U = u4AFnV0_L = u4AFnV1_U = u4AFnV1_L = 0; | |
923 | u4AFnV2_U = u4AFnV2_L = u4AFnV3_U = u4AFnV3_L = 0; | |
924 | fgSet0_U = fgSet0_L = fgSet1_U = fgSet1_L = FALSE; | |
925 | fgSet2_U = fgSet2_L = fgSet3_U = fgSet3_L = FALSE; | |
926 | ||
927 | for (i = 1; i <= u4SizeArray; i++) { | |
928 | u4GpioPinAFMask = 0x3u << ((au4GpioPinArray[i] & 0xF) * 2); | |
929 | u4GpioPinAFValue = aAfValueArray[i] << ((au4GpioPinArray[i] & 0xF) * 2); | |
930 | if (au4GpioPinArray[i] > 111) { | |
931 | u4AFnV3_U |= u4GpioPinAFValue; | |
932 | u4Mask3_U |= u4GpioPinAFMask; | |
933 | fgSet3_U = TRUE; | |
934 | } else if (au4GpioPinArray[i] > 95) { | |
935 | u4AFnV3_L |= u4GpioPinAFValue; | |
936 | u4Mask3_L |= u4GpioPinAFMask; | |
937 | fgSet3_L = TRUE; | |
938 | } else if (au4GpioPinArray[i] > 79) { | |
939 | u4AFnV2_U |= u4GpioPinAFValue; | |
940 | u4Mask2_U |= u4GpioPinAFMask; | |
941 | fgSet2_U = TRUE; | |
942 | } else if (au4GpioPinArray[i] > 63) { | |
943 | u4AFnV2_L |= u4GpioPinAFValue; | |
944 | u4Mask2_L |= u4GpioPinAFMask; | |
945 | fgSet2_L = TRUE; | |
946 | } else if (au4GpioPinArray[i] > 47) { | |
947 | u4AFnV1_U |= u4GpioPinAFValue; | |
948 | u4Mask1_U |= u4GpioPinAFMask; | |
949 | fgSet1_U = TRUE; | |
950 | } else if (au4GpioPinArray[i] > 31) { | |
951 | u4AFnV1_L |= u4GpioPinAFValue; | |
952 | u4Mask1_L |= u4GpioPinAFMask; | |
953 | fgSet1_L = TRUE; | |
954 | } else if (au4GpioPinArray[i] > 15) { | |
955 | u4AFnV0_U |= u4GpioPinAFValue; | |
956 | u4Mask0_U |= u4GpioPinAFMask; | |
957 | fgSet0_U = TRUE; | |
958 | } else { | |
959 | u4AFnV0_L |= u4GpioPinAFValue; | |
960 | u4Mask0_L |= u4GpioPinAFMask; | |
961 | fgSet0_L = TRUE; | |
962 | } | |
963 | } | |
964 | if (fgSet3_U) { | |
965 | prGPIO->GAFR3_U = | |
966 | (((prGPIO->GAFR3_U & ~u4Mask3_U) | u4AFnV3_U) & ~GPIO_ALT_RESERVED_BITS); | |
967 | } | |
968 | if (fgSet3_L) { | |
969 | prGPIO->GAFR3_L = ((prGPIO->GAFR3_L & ~u4Mask3_L) | u4AFnV3_L); | |
970 | } | |
971 | if (fgSet2_U) { | |
972 | prGPIO->GAFR2_U = ((prGPIO->GAFR2_U & ~u4Mask2_U) | u4AFnV2_U); | |
973 | } | |
974 | if (fgSet2_L) { | |
975 | prGPIO->GAFR2_L = ((prGPIO->GAFR2_L & ~u4Mask2_L) | u4AFnV2_L); | |
976 | } | |
977 | if (fgSet1_U) { | |
978 | prGPIO->GAFR1_U = ((prGPIO->GAFR1_U & ~u4Mask1_U) | u4AFnV1_U); | |
979 | } | |
980 | if (fgSet1_L) { | |
981 | prGPIO->GAFR1_L = ((prGPIO->GAFR1_L & ~u4Mask1_L) | u4AFnV1_L); | |
982 | } | |
983 | if (fgSet0_U) { | |
984 | prGPIO->GAFR0_U = ((prGPIO->GAFR0_U & ~u4Mask0_U) | u4AFnV0_U); | |
985 | } | |
986 | if (fgSet0_L) { | |
987 | prGPIO->GAFR0_L = ((prGPIO->GAFR0_L & ~u4Mask0_L) | u4AFnV0_L); | |
988 | } | |
989 | } /* GpioSetAlternateFn */ | |
990 | ||
991 | ||
992 | /*----------------------------------------------------------------------------*/ | |
993 | /*! | |
994 | * \brief Enable Falling Edge Detect, | |
995 | * aGpioPinArray[]=array of GPIO pins, | |
996 | * aGpioPinArray[0] = size of array | |
997 | * \param[in] aGpioPinArray[] - array of GPIO pins | |
998 | * | |
999 | * \return none | |
1000 | */ | |
1001 | /*----------------------------------------------------------------------------*/ | |
1002 | static VOID GpioSetFallingEdgeDetectEnable(P_GPIO_REG prGPIO, UINT_32 au4GpioPinArray[] | |
1003 | ) | |
1004 | { | |
1005 | UINT_32 u4GpioPinMask; | |
1006 | UINT_32 u4SizeArray; | |
1007 | UINT_32 u4Mask0, u4Mask1, u4Mask2, u4Mask3; | |
1008 | BOOL fgSet0, fgSet1, fgSet2, fgSet3; | |
1009 | UINT_32 i; | |
1010 | ||
1011 | ASSERT(prGPIO); | |
1012 | ASSERT(au4GpioPinArray); | |
1013 | ||
1014 | /* determine size of array */ | |
1015 | u4SizeArray = au4GpioPinArray[0]; | |
1016 | u4Mask0 = u4Mask1 = u4Mask2 = u4Mask3 = 0; | |
1017 | fgSet0 = fgSet1 = fgSet2 = fgSet3 = FALSE; | |
1018 | ||
1019 | for (i = 1; i <= u4SizeArray; i++) { | |
1020 | u4GpioPinMask = 0x1u << (au4GpioPinArray[i] & 0x1F); | |
1021 | if (au4GpioPinArray[i] > 95) { | |
1022 | u4Mask3 |= u4GpioPinMask; | |
1023 | fgSet3 = TRUE; | |
1024 | } else if (au4GpioPinArray[i] > 63) { | |
1025 | u4Mask2 |= u4GpioPinMask; | |
1026 | fgSet2 = TRUE; | |
1027 | } else if (au4GpioPinArray[i] > 31) { | |
1028 | u4Mask1 |= u4GpioPinMask; | |
1029 | fgSet1 = TRUE; | |
1030 | } else { | |
1031 | u4Mask0 |= u4GpioPinMask; | |
1032 | fgSet0 = TRUE; | |
1033 | } | |
1034 | } | |
1035 | if (fgSet3) { | |
1036 | prGPIO->GFER3 = ((prGPIO->GFER3 | u4Mask3) & ~GPIO_PIN_RESERVED_BITS); | |
1037 | } | |
1038 | if (fgSet2) { | |
1039 | prGPIO->GFER2 = ((prGPIO->GFER2) | u4Mask2); | |
1040 | } | |
1041 | if (fgSet1) { | |
1042 | prGPIO->GFER1 = ((prGPIO->GFER1) | u4Mask1); | |
1043 | } | |
1044 | if (fgSet0) { | |
1045 | prGPIO->GFER0 = ((prGPIO->GFER0) | u4Mask0); | |
1046 | } | |
1047 | } /* GpioSetFallingEdgeDetectEnable */ | |
1048 | ||
1049 | ||
1050 | /*----------------------------------------------------------------------------*/ | |
1051 | /*! | |
1052 | * \brief Enable Initiate SPI interface for Intel PXA270 | |
1053 | * | |
1054 | * \param[in] none | |
1055 | * | |
1056 | * \return none | |
1057 | */ | |
1058 | /*----------------------------------------------------------------------------*/ | |
1059 | void platformBusInit(IN P_GLUE_INFO_T prGlueInfo) | |
1060 | { | |
1061 | P_GL_HIF_INFO_T prHifInfo; | |
1062 | UINT_32 u4Gpio, u4Irq = 0; | |
1063 | ||
1064 | /* Memory Map */ | |
1065 | NDIS_PHYSICAL_ADDRESS CLKMGR_Base = { CLKMGR_BASE_ADD }; /* PA Clock Manager */ | |
1066 | NDIS_PHYSICAL_ADDRESS SSP_Base = { SSP_BASE_ADD }; /* SSP */ | |
1067 | NDIS_PHYSICAL_ADDRESS GPIO_Base = { GPIO_BASE_ADD }; /* GPIO */ | |
1068 | ||
1069 | /* Set GPIO mode */ | |
1070 | UINT_32 GpioDirOutList[] = { 3, GPIO23_SCLK, GPIO24_SFRM, GPIO25_STXD }; | |
1071 | UINT_32 GpioDirInList[] = { 2, GPIO26_SRXD, GPIO_INTR }; | |
1072 | UINT_32 GpioAltFnPinList[] = | |
1073 | { 5, GPIO23_SCLK, GPIO24_SFRM, GPIO25_STXD, GPIO26_SRXD, GPIO_INTR }; | |
1074 | UINT_32 GpioAltFnValList[] = { 5, 2, 2, 2, 1, 1 }; | |
1075 | UINT_32 GpioAltFnIntPinList[] = { 1, GPIO_INTR }; /* interrupt */ | |
1076 | ||
1077 | DEBUGFUNC("windowsFindAdapter"); | |
1078 | ||
1079 | ASSERT(prGlueInfo); | |
1080 | ||
1081 | prHifInfo = &prGlueInfo->rHifInfo; | |
1082 | ||
1083 | /* Memory Map */ | |
1084 | pVClkMgr = (CLK_MGR *) MmMapIoSpace(CLKMGR_Base, sizeof(CLK_MGR), FALSE); | |
1085 | ||
1086 | pVSsp = (SSP_REG *) MmMapIoSpace(SSP_Base, sizeof(SSP_REG), FALSE); | |
1087 | ||
1088 | pVMem = (GPIO_REG *) MmMapIoSpace(GPIO_Base, sizeof(GPIO_REG), FALSE); | |
1089 | ||
1090 | /* Backup GPIO config for restore when unload driver */ | |
1091 | GPIOConfigBackup(); | |
1092 | ||
1093 | /* The InterruptVector is the interrupt line that the card asserts to | |
1094 | interrupt the system, and the InterruptLevel is ignored on Windows CE */ | |
1095 | u4Gpio = GPIO_INTR; | |
1096 | KernelIoControl(IOCTL_HAL_GPIO2IRQ, (LPVOID) & u4Gpio, 1, (LPVOID) & u4Irq, 1, NULL); | |
1097 | prHifInfo->u4InterruptVector = u4Irq; /* IRQ : 27:0x7a */ | |
1098 | prHifInfo->u4InterruptLevel = u4Irq; /* ignore : 27:0x7a */ | |
1099 | DbgPrint("GPIO INTR %d %d %x\n", GPIO_INTR, u4Gpio, u4Irq); | |
1100 | ||
1101 | if (pVMem) { | |
1102 | /* set GPIO mode */ | |
1103 | GpioSetDirectionIn((P_GPIO_REG) pVMem, GpioDirInList); | |
1104 | GpioSetDirectionOut((P_GPIO_REG) pVMem, GpioDirOutList); | |
1105 | GpioSetAlternateFn((P_GPIO_REG) pVMem, GpioAltFnPinList, GpioAltFnValList); | |
1106 | GpioSetFallingEdgeDetectEnable((P_GPIO_REG) pVMem, GpioAltFnIntPinList); /* interrupt */ | |
1107 | } | |
1108 | ||
1109 | if (pVSsp) { | |
1110 | /* Configure SSP */ | |
1111 | pVClkMgr->cken |= CLKEN_SSP; | |
1112 | pVSsp->sssr = 0; | |
1113 | ||
1114 | pVSsp->sscr1 = 0; | |
1115 | pVSsp->sscr1 = SSCR1_SPH | SSCR1_SPO | SSCR1_TTE; /* fifi TTE */ | |
1116 | pVSsp->sscr1 |= (3 << 6) | (0 << 10); /* TFT, RFT */ | |
1117 | ||
1118 | pVSsp->sscr0 = 0; | |
1119 | #if CONFIG_SPI_8_BIT_MODE | |
1120 | pVSsp->sscr0 = SSCR0_DSS_8BIT | SSCR0_RIM; | |
1121 | #else | |
1122 | pVSsp->sscr0 = SSCR0_EDSS | SSCR0_DSS_32BIT | SSCR0_RIM; | |
1123 | #endif | |
1124 | pVSsp->sscr0 |= SSCR0_SSE; /* operation enable at least */ | |
1125 | } | |
1126 | ||
1127 | /* Set operation mode */ | |
1128 | /* Intel PXA27x supports 4~32-bits mode */ | |
1129 | SpiSetOpMode(); | |
1130 | ||
1131 | } /* platformBusInit */ | |
1132 | ||
1133 | ||
1134 | /*----------------------------------------------------------------------------*/ | |
1135 | /*! | |
1136 | * \brief The PROC function for backup GPIO configuration. | |
1137 | * | |
1138 | * This service save the preveous config of GPIO we will use. | |
1139 | * This procedure only present when initialization. | |
1140 | * | |
1141 | * \return (none) | |
1142 | */ | |
1143 | /*----------------------------------------------------------------------------*/ | |
1144 | VOID GPIOConfigBackup(VOID) | |
1145 | { | |
1146 | IO_GPDR0 = pVMem->GPDR0 & (BITS(23, 26) | IO_MASK_INTR); /* 23,24,25,26,intr */ | |
1147 | Fun_GAFR0_U = pVMem->GAFR0_U & (BITS(14, 21) | FUN_MASK_INTR); /* 23,24,25,26,intr */ | |
1148 | } /* BackupGPIOConfig */ | |
1149 | ||
1150 | ||
1151 | /*----------------------------------------------------------------------------*/ | |
1152 | /*! | |
1153 | * \brief The PROC function for restore GPIO configuration. | |
1154 | * | |
1155 | * This service restore the preveous config of GPIO. | |
1156 | * This procedure only present when unload driver. | |
1157 | * | |
1158 | * \return (none) | |
1159 | */ | |
1160 | /*----------------------------------------------------------------------------*/ | |
1161 | VOID GPIOConfigRestore(VOID) | |
1162 | { | |
1163 | UINT_32 tempA = 0, tempB = 0; | |
1164 | ||
1165 | tempA = IO_GPDR0 & (BITS(23, 26) | IO_MASK_INTR); /* 23,24,25,26,intr */ | |
1166 | tempB = pVMem->GPDR0 & ~(BITS(23, 26) | IO_MASK_INTR); | |
1167 | pVMem->GPDR0 = tempA | tempB; | |
1168 | ||
1169 | tempA = Fun_GAFR0_U & (BITS(14, 21) | FUN_MASK_INTR); /* 23,24,25,26,intr */ | |
1170 | tempB = pVMem->GAFR0_U & ~(BITS(14, 21) | FUN_MASK_INTR); | |
1171 | pVMem->GAFR0_U = tempA | tempB; | |
1172 | } /* RestoreGPIOConfig */ |