1 /*
2  * @ : Copyright (c) 2021 Phytium Information Technology, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0.
5  *
6  * @Date: 2021-04-25 13:59:05
7  * @LastEditTime: 2021-04-30 16:11:46
8  * @Description:  This files is for
9  *
10  * @Modify History:
11  *  Ver   Who        Date         Changes
12  * ----- ------     --------    --------------------------------------
13  */
14 
15 #ifndef FT_BSP_SPI_H
16 #define FT_BSP_SPI_H
17 
18 #ifdef __cplusplus
19 extern "C"
20 {
21 #endif
22 
23 #include "ft_types.h"
24 #include "ft_spi_hw.h"
25 #include "ft_error_code.h"
26 #include "ft_debug.h"
27 
28         typedef struct
29         {
30                 u8 WorkMode;
31 #define SPI_CTRL_MASTER_MODE (u8)0x0
32 #define SPI_CTRL_SLAVE_MODE (u8)0x1
33                 u8 DevAddrLen;
34 #define SPI_3_BYTE_ADDR (u8)0x3
35 #define SPI_4_BYTE_ADDR (u8)0x4
36                 u8 Cpol;
37 #define SPI_CTRL_CPOL_LOW (u8)0x0
38 #define SPI_CTRL_CPOL_HIGH (u8)0x1
39                 u8 Cpha;
40 #define SPI_CTRL_CPHA_1EDGE (u8)0x0
41 #define SPI_CTRL_CPHA_2EDGE (u8)0x1
42                 u8 DevAddr[4];
43                 u32 BaudRDiv;
44         } FSpi_Conf_t;
45 
46         typedef struct
47         {
48                 FSpi_Conf_t Config;
49                 FSpi_CtrlId_t CtrlId;
50                 FSpi_DevId_t DevId; /* support only one slave at the moment */
51                 bool_t IsReady;
52                 u16 CsPin; /* cs pin in gpio group A */
53         } FSpi_Ctrl_t;
54 
55 /* misc marco */
56 #define SPI_TIMEOUT 5000
57 #define SPI_DUMMY_TX_DATA 0xFF
58 
59 /* ctrl member shortcut */
60 #define FSPI_DEV_ADDR_LEN(pCtrl) (pCtrl->Config.DevAddrLen)
61 #define FSPI_IS_3_BYTE_ADDR(pCtrl) (SPI_3_BYTE_ADDR == FSPI_DEV_ADDR_LEN(pCtrl))
62 #define FSPI_DEV_ADDR(pCtrl) (pCtrl->Config.DevAddr)
63 
64 /* define error code */
65 #define ERR_SPI_OK ERR_SUCCESS
66 #define ERR_SPI_GENERAL FT_CODE_ERR(ERR_MODE_SPI, 0, 1)
67 #define ERR_SPI_NOT_READY FT_CODE_ERR(ERR_MODE_SPI, 0, 2)
68 #define ERR_SPI_TX_TIMEOUT FT_CODE_ERR(ERR_MODE_SPI, 0, 3)
69 #define ERR_SPI_RX_TIMEOUT FT_CODE_ERR(ERR_MODE_SPI, 0, 4)
70 
71 /* spi flash error code */
72 #define ERR_SPI_WAIT_TIMEOUT FT_CODE_ERR(ERR_MODE_SPI, 1, 1)
73 
74 /* define debug utilities */
75 #define FT_SPI_DEBUG_TAG "FT_SPI"
76 #define FT_SPI_ENABLE_DEBUG
77 #define FT_SPI_ERROR(format, ...) FT_DEBUG_PRINT_E(FT_SPI_DEBUG_TAG, format, ##__VA_ARGS__)
78 #ifdef FT_SPI_ENABLE_DEBUG
79 #define FT_SPI_DEBUG_I(format, ...) FT_DEBUG_PRINT_I(FT_SPI_DEBUG_TAG, format, ##__VA_ARGS__)
80 #define FT_SPI_DEBUG_W(format, ...) FT_DEBUG_PRINT_W(FT_SPI_DEBUG_TAG, format, ##__VA_ARGS__)
81 #else
82 #define FT_SPI_DEBUG_I(format, ...)
83 #define FT_SPI_DEBUG_W(format, ...)
84 #endif
85 
86         u32 FSpi_Init(FT_INOUT FSpi_Ctrl_t *pCtrl);
87         u32 FSpi_ReadWriteByte(FT_INOUT FSpi_Ctrl_t *pCtrl, FT_IN u8 TxData,
88                                FT_OUT u8 *pRxData);
89         void FSpi_SelectSlave(FT_INOUT FSpi_Ctrl_t *pCtrl, FT_IN FSpi_DevId_t DevId,
90                               FT_IN bool_t select);
91 #ifdef __cplusplus
92 }
93 #endif
94 
95 #endif
96