blob: b0b64fc82501654bc1e04cbde75dce975a73bf49 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*****************************************************************************
37 *
38 * Filename:
39 * ---------
40 * spi.h
41 *
42 * Project:
43 * --------
44 * Maui_Software
45 *
46 * Description:
47 * ------------
48 * This file is intends for SPI driver.
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 *
59 *------------------------------------------------------------------------------
60 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
61 *============================================================================
62 ****************************************************************************/
63
64#ifndef __spi_h__
65#define __spi_h__
66
67//////////////////RHR-ADD//////////////////////
68#include "kal_general_types.h"
69#include "kal_public_defs.h"
70//////////////////RHR-ADD//////////////////////
71
72//////////////////RHR-REMOVE//////////////////////
73//#include <spi_define.h>
74//////////////////////////////////////////////////
75
76#include "drv_features.h"
77
78#if defined(DRV_SPI_SUPPORT)
79
80/** \brief Open the SPI interface
81 *
82 * Before using the SPI interface, users have to call this
83 * function to get one unique number to be used in later SPI
84 * API functions.
85 *
86 * \param id Points to a kal_int32. When this function is
87 * finished, and if it succeed, this variable is represented
88 * as an unique identification number which is used as a
89 * parameter in the other SPI API functions if needed.
90 * \return
91 * - KAL_TRUE if the SPI interface is available.
92 * - KAL_FALSE if the SPI interface is unavailable.
93 */
94#ifdef DRV_SPI_HAL
95#define SPI_OPEN(id) spi_open_old((id), __FILE__, __LINE__);
96#else
97#define SPI_OPEN(id) spi_open((id), __FILE__, __LINE__);
98#endif
99
100/** \brief Release the ownership of the SPI interface, so
101 * that others can use it.
102 *
103 * spi_open() will get the ownership of the SPI interface,
104 * you have to call this function to release the ownership.
105 *
106 * \param id The return value of spi_open().
107 * \return
108 * - KAL_TRUE if success.
109 * - KAL_FALSE if failure, caller can use spi_get_error_code()
110 * to examine what was wrong.
111 */
112#ifdef DRV_SPI_HAL
113#define SPI_CLOSE(id) spi_close_old((id))
114#else
115#define SPI_CLOSE(id) spi_close((id))
116#endif
117
118
119#define SPI_INTERFACE_MAX_PKT_LENGTH_PER_TIMES (0x400)
120#define SPI_INTERFACE_MAX_PKT_COUNT_PER_TIMES (0x100)
121
122/**
123 * \def SPI_FIFO_SIZE
124 * \ingroup spi
125 * Defines the internal TX/RX FIFO size of the SPI controller.
126 */
127#define SPI_FIFO_SIZE (32)
128
129/** \enum SPI_TIME_TYPE
130 * \ingroup spi
131 *
132 * @brief
133 * Specify the time intervals used by the SPI interface.
134 */
135enum SPI_TIME_TYPE {
136 SPI_TIME_SETUP,
137 /**<
138 * \ingroup spi
139 * Setup time.
140 */
141 SPI_TIME_HOLD,
142 /**<
143 * \ingroup spi
144 * Hold time.
145 */
146 SPI_TIME_LOW,
147 /**<
148 * \ingroup spi
149 * Low voltage time of the SPI clock.
150 */
151 SPI_TIME_HIGH,
152 /**<
153 * \ingroup spi
154 * High voltage time of the SPI clock.
155 */
156 SPI_TIME_IDLE
157 /**<
158 * \ingroup spi
159 * Idle time.
160 */
161};
162typedef enum SPI_TIME_TYPE SPI_TIME_TYPE;
163
164/** \enum SPI_INT_TYPE
165 * \ingroup spi
166 *
167 * @brief
168 * SPI interrupt category enum.
169 *
170 * This enumeration defines the two interrupts which SPI devices can generate.
171 */
172enum SPI_INT_TYPE {
173 SPI_INT_PAUSE,
174 /**<
175 * \ingroup spi
176 * Pause interrupt.
177 */
178 SPI_INT_FINISH
179 /**<
180 * \ingroup spi
181 * Finish interrupt.
182 */
183};
184typedef enum SPI_INT_TYPE SPI_INT_TYPE;
185
186/** \enum SPI_DIRECTION_TYPE
187 * \ingroup spi
188 *
189 * @brief
190 * SPI direction enum.
191 *
192 * This enumeration defines whether this SPI operation is
193 * transmission of reception.
194 */
195enum SPI_DIRECTION_TYPE {
196 SPI_TX,
197 /**<
198 * \ingroup spi
199 * Means transmission
200 */
201 SPI_RX
202 /**<
203 * \ingroup spi
204 * Means reception
205 */
206};
207typedef enum SPI_DIRECTION_TYPE SPI_DIRECTION_TYPE;
208
209/** \enum SPI_MLSB
210 * \ingroup spi
211 *
212 * @brief
213 * Specify the MSB or LSB used by the SPI TX/RX operation.
214 */
215enum SPI_MLSB {
216 SPI_LSB = 0,
217 /**<
218 * \ingroup spi
219 * LSB.
220 */
221 SPI_MSB
222 /**<
223 * \ingroup spi
224 * MSB.
225 */
226};
227typedef enum SPI_MLSB SPI_MLSB;
228
229/** \enum SPI_CPOL
230 * \ingroup spi
231 *
232 * @brief
233 * Choose the desired clock polarities supported by the SPI interface.
234 */
235enum SPI_CPOL {
236 SPI_CPOL_0 = 0,
237 /**<
238 * \ingroup spi
239 * SPI clock polarity 0.
240 */
241 SPI_CPOL_1
242 /**<
243 * \ingroup spi
244 * SPI clock polarity 1.
245 */
246};
247typedef enum SPI_CPOL SPI_CPOL;
248
249/** \enum SPI_CPHA
250 * \ingroup spi
251 *
252 * @brief
253 * Choose the desired clock formats supported by the SPI interface.
254 */
255enum SPI_CPHA {
256 SPI_CPHA_0 = 0,
257 /**<
258 * \ingroup spi
259 * SPI clock format 0.
260 */
261 SPI_CPHA_1
262 /**<
263 * \ingroup spi
264 * SPI clock format 1.
265 */
266};
267typedef enum SPI_CPHA SPI_CPHA;
268
269/** \enum SPI_MODE
270 * \ingroup spi
271 *
272 * @brief
273 * Choose the SPI FIFO mode or the SPI DMA mode.
274 */
275enum SPI_MODE {
276 SPI_MODE_FIFO = 0,
277 /**<
278 * \ingroup spi
279 * SPI FIFO mode.
280 */
281 SPI_MODE_DMA
282 /**<
283 * \ingroup spi
284 * SPI DMA mode.
285 */
286};
287typedef enum SPI_MODE SPI_MODE;
288
289/** \enum SPI_ERROR_CODE
290 * \ingroup spi
291 *
292 * @brief
293 * The possible result values of each SPI operations.
294 */
295enum SPI_ERROR_CODE {
296 SPI_NO_ERROR = 0,
297 /**<
298 * \ingroup spi
299 * No errors.
300 */
301
302 SPI_ERROR_CODE_UNAVAILABLE,
303 /**<
304 * \ingroup spi
305 * If ownership of the SPI interface is owned by another
306 * task.
307 */
308
309 SPI_ERROR_CODE_UNKNOWN_TIME_TYPE,
310 /**<
311 * \ingroup spi
312 * Unknown spi time type.
313 */
314
315 SPI_ERROR_CODE_UNKNOWN_BIT_STATUS,
316 /**<
317 * \ingroup spi
318 * Unknown spi bit status.
319 */
320
321 SPI_ERROR_CODE_UNKNOWN_INT_TYPE,
322 /**<
323 * \ingroup spi
324 * Unknown spi interrupt type.
325 */
326
327 SPI_ERROR_CODE_UNKNOWN_MSB_LSB_TYPE,
328 /**<
329 * \ingroup spi
330 * Unknown spi MSB/LSB.
331 */
332
333 SPI_ERROR_CODE_UNKNOWN_TRANSFER_DIRECTION,
334 /**<
335 * \ingroup spi
336 * Unknown spi TX/RX.
337 */
338
339 SPI_ERROR_CODE_UNKNOWN_TRANSFER_TYPE,
340 /**<
341 * \ingroup spi
342 * Unknown spi DMA/FIFO.
343 */
344
345 SPI_ERROR_CODE_UNKNOWN_CLK_POLARITY,
346 /**<
347 * \ingroup spi
348 * Unknown spi clock polarity.
349 */
350
351 SPI_ERROR_CODE_UNKNOWN_CLK_FORMAT,
352 /**<
353 * \ingroup spi
354 * Unknown spi clock format.
355 */
356
357 SPI_ERROR_CODE_ID_PTR_CAN_NOT_BE_ZERO,
358 /**<
359 * \ingroup spi
360 * In spi_open(), the specified ID address can not
361 * be 0.
362 */
363
364 SPI_ERROR_CODE_FILENAME_PTR_CAN_NOT_BE_ZERO,
365 /**<
366 * \ingroup spi
367 * In spi_open(), the specified filename address can not
368 * be 0.
369 */
370
371 SPI_ERROR_CODE_DMA_BUF_ADDR_CAT_NOT_BE_ZERO,
372 /**<
373 * \ingroup spi
374 * In SPI DMA mode, the specified buffer address can not
375 * be 0.
376 */
377
378 SPI_ERROR_CODE_CONFIG_ATTR_CAN_NOT_BE_ZERO,
379 /**<
380 * \ingroup spi
381 * In spi_config(), the specified spi_attr_t can not
382 * be 0.
383 */
384
385 SPI_ERROR_CODE_PKT_LENGTH_CAN_NOT_BE_ZERO,
386 /**<
387 * \ingroup spi
388 * In SPI DMA mode, the specified packet length can not be
389 * 0.
390 */
391
392 SPI_ERROR_CODE_PKT_COUNT_CAN_NOT_BE_ZERO,
393 /**<
394 * \ingroup spi
395 * In SPI DMA mode, the specified packet count can not be
396 * 0.
397 */
398
399 SPI_ERROR_CODE_PKT_LENGTH_TOO_LARGE,
400 /**<
401 * \ingroup spi
402 * In SPI DMA mode, the specified packet length is too
403 * large to operate.
404 */
405
406 SPI_ERROR_CODE_PKT_COUNT_TOO_LARGE,
407 /**<
408 * \ingroup spi
409 * In SPI DMA mode, the specified packet count is too
410 * large to operate.
411 */
412
413 SPI_ERROR_CODE_ADDR_NOT_4_ALIGN
414 /**<
415 * \ingroup spi
416 * The buffer addresses for TX and RX should be 4-byte
417 * alignment.
418 */
419};
420typedef enum SPI_ERROR_CODE SPI_ERROR_CODE;
421
422enum SPI_BIT_STATUS
423{
424 SPI_DISABLE,
425 SPI_ENABLE
426};
427typedef enum SPI_BIT_STATUS SPI_BIT_STATUS;
428
429/**
430 * \typedef spi_cb_func
431 * \ingroup spi
432 * The callback function type.
433 */
434typedef void (*spi_cb_func)(void);
435
436enum SPI_GET_TICK_MODE {
437 SPI_NO_GET_TICK_MODE,
438 SPI_GET_TICK_MODE_DELAY_1,
439 SPI_GET_TICK_MODE_DELAY_2
440};
441typedef enum SPI_GET_TICK_MODE SPI_GET_TICK_MODE;
442
443struct spi_attr_t {
444 kal_uint8 setup_time;
445 kal_uint8 hold_time;
446 kal_uint8 clk_low;
447 kal_uint8 clk_high;
448 kal_uint8 idle_time;
449 kal_bool enable_pause_int;
450 kal_bool enable_finish_int;
451 kal_bool enable_pause_mode;
452 kal_bool enable_deassert_mode;
453 SPI_MLSB tx_mlsb;
454 SPI_MLSB rx_mlsb;
455 SPI_MODE tx_mode;
456 SPI_MODE rx_mode;
457 SPI_CPOL clk_polarity;
458 SPI_CPHA clk_fmt;
459 SPI_GET_TICK_MODE get_tick;
460 kal_bool enable_ultra_high;
461 kal_uint16 ultra_high_thresh;
462 kal_bool enable_gmc_slow_down;
463 kal_bool enable_gmc_split_burst;
464 kal_uint16 gmc_slow_down_thresh;
465};
466typedef struct spi_attr_t spi_attr_t;
467
468typedef enum
469{ SPI_EVENT_INVALID = 0x0,
470 SPI_EVENT_TRANSFER_COMPLETE = 0x1
471} SPIEventType;
472
473extern volatile kal_eventgrpid spi_event_id;
474
475/* Export function prototype. */
476extern void SPI_LISR(void);
477
478#ifdef DRV_SPI_HAL
479extern kal_bool spi_open_old(
480#else
481extern kal_bool spi_open(
482#endif
483 kal_int32 * const id,
484 char const * const filename,
485 kal_uint32 const lineno);
486
487#ifdef DRV_SPI_HAL
488extern kal_bool spi_close_old(
489#else
490extern kal_bool spi_close(
491#endif
492 kal_int32 const id);
493
494extern kal_bool spi_set_time_interval(
495 kal_int32 const id,
496 SPI_TIME_TYPE const type,
497 kal_uint8 const value);
498
499extern kal_bool spi_set_interrupt(
500 kal_int32 const id,
501 SPI_INT_TYPE const type,
502 SPI_BIT_STATUS const status);
503
504extern kal_bool spi_set_msb(
505 kal_int32 const id,
506 SPI_DIRECTION_TYPE const type,
507 SPI_MLSB const msb);
508
509extern kal_bool spi_select_mode(
510 kal_int32 const id,
511 SPI_DIRECTION_TYPE const type,
512 SPI_MODE const mode);
513
514extern kal_bool spi_set_clock_polarity(
515 kal_int32 const id,
516 SPI_CPOL const cpol);
517
518extern kal_bool spi_set_clock_format(
519 kal_int32 const id,
520 SPI_CPHA const cpha);
521
522extern kal_bool spi_set_pause_mode(
523 kal_int32 const id,
524 kal_bool const status);
525
526extern kal_bool spi_set_deassert_mode(
527 kal_int32 const id,
528 kal_bool const status);
529
530extern kal_bool spi_set_desired_size(
531 kal_int32 const id,
532 kal_uint32 const length,
533 kal_uint16 const loop);
534
535extern kal_bool spi_set_get_tick_mode(
536 kal_int32 const id,
537 SPI_GET_TICK_MODE const get_tick);
538
539extern kal_bool spi_slow_down_gmc(
540 kal_int32 const id,
541 kal_bool const slow_down_enable,
542 kal_bool const split_burst_enable,
543 kal_uint16 const slow_down_thresh);
544
545extern kal_bool spi_set_ultra_high(
546 kal_int32 const id,
547 kal_bool const ultra_high_enable,
548 kal_uint16 const ultra_high_thresh);
549
550extern kal_bool spi_set_rwaddr(
551 kal_int32 const id,
552 SPI_DIRECTION_TYPE const type,
553 void * const addr);
554
555extern kal_bool spi_set_cb(
556 kal_int32 const id,
557 SPI_INT_TYPE const type,
558 spi_cb_func func,
559 spi_cb_func * const old);
560
561extern kal_bool spi_set_endian_reverse(
562 kal_int32 const id,
563 SPI_DIRECTION_TYPE const type,
564 kal_bool const reverse);
565
566extern kal_bool spi_config(
567 kal_int32 const id,
568 spi_attr_t * const attr);
569
570extern kal_bool spi_clear_fifo(
571 kal_int32 const id,
572 SPI_DIRECTION_TYPE const direction);
573
574extern kal_bool spi_reset(
575 kal_int32 const id);
576
577extern kal_bool spi_resume(
578 kal_int32 const id);
579
580extern kal_bool spi_activate(
581 kal_int32 const id);
582
583extern kal_bool spi_is_in_pause_mode(void);
584extern kal_bool spi_is_busy(void);
585
586extern kal_bool spi_wait_not_busy(
587 kal_int32 const id);
588
589extern kal_bool spi_fifo_push(
590 kal_int32 const id,
591 kal_uint32 const data);
592
593extern kal_bool spi_fifo_pop(
594 kal_int32 const id,
595 kal_uint32 * const data);
596
597extern void spi_init(void);
598
599extern int rand(void);
600
601#ifdef DRV_SPI_HAL
602extern kal_bool spi_get_driving_current(kal_bool* bEnableSlewRate, kal_uint32* current);
603extern kal_bool spi_set_driving_current(kal_bool bEnableSlewRate, kal_uint32 current);
604extern void spi_select_port(kal_uint32 port);
605#endif
606
607#endif
608
609#endif