1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 #ifndef LIBRARIES_PERIPHDRIVERS_SOURCE_SPIXF_SPIXF_REVA_H_
22 #define LIBRARIES_PERIPHDRIVERS_SOURCE_SPIXF_SPIXF_REVA_H_
23 
24 /****** Includes *******/
25 #include "mxc_device.h"
26 #include "mxc_sys.h"
27 #include "spixf.h"
28 #include "spixfc_reva_regs.h"
29 #include "spixfm_reva_regs.h"
30 #include "spixfc_fifo_reva_regs.h"
31 
32 /* **** Definitions **** */
33 /**
34  * @brief      Active levels for slave select lines.
35  */
36 typedef enum {
37     MXC_SPIXF_REVA_SSEL0_HIGH = (0x1 << 0),
38     MXC_SPIXF_REVA_SSEL0_LOW = 0,
39     MXC_SPIXF_REVA_SSEL1_HIGH = (0x1 << 1),
40     MXC_SPIXF_REVA_SSEL1_LOW = 0,
41     MXC_SPIXF_REVA_SSEL2_HIGH = (0x1 << 2),
42     MXC_SPIXF_REVA_SSEL2_LOW = 0,
43     MXC_SPIXF_REVA_SSEL3_HIGH = (0x1 << 3),
44     MXC_SPIXF_REVA_SSEL3_LOW = 0
45 } mxc_spixf_reva_ssel_t;
46 
47 /**
48  * @brief      Header direction.
49  */
50 typedef enum {
51     MXC_SPIXF_REVA_HEADER_DIR_NONE,
52     MXC_SPIXF_REVA_HEADER_DIR_TX,
53     MXC_SPIXF_REVA_HEADER_DIR_RX,
54     MXC_SPIXF_REVA_HEADER_DIR_BOTH,
55 } mxc_spixf_reva_hdr_direction_t;
56 
57 /**
58  * @brief      SPIXF Pin mode.
59  */
60 typedef enum {
61     MXC_SPIXF_REVA_ACTIVE_LOW,
62     MXC_SPIXF_REVA_ACTIVE_HIGH,
63 } mxc_spixf_reva_sspol_t;
64 
65 /**
66  * @brief      SPIXF set command.
67  */
68 typedef enum {
69     MXC_SPIXF_REVA_CMD_EVERY_TRANS,
70     MXC_SPIXF_REVA_CMD_FIRST_TRANS,
71 } mxc_spixf_reva_cmd_t;
72 
73 /**
74  * @brief      SPIXF mode.
75  * @note       modes 1 and 2 are not supported
76  */
77 typedef enum {
78     MXC_SPIXF_REVA_MODE_0 = 0,
79     MXC_SPIXF_REVA_MODE_3 = 3,
80 } mxc_spixf_reva_mode_t;
81 
82 /**
83  * @brief      Select page size.
84  */
85 typedef enum {
86     MXC_SPIXF_REVA_4B,
87     MXC_SPIXF_REVA_8B,
88     MXC_SPIXF_REVA_16B,
89     MXC_SPIXF_REVA_32B,
90 } mxc_spixf_reva_age_size_t;
91 
92 /**
93  * @brief      Header units.
94  */
95 typedef enum {
96     MXC_SPIXF_REVA_HEADER_UNITS_BITS,
97     MXC_SPIXF_REVA_HEADER_UNITS_BYTES,
98     MXC_SPIXF_REVA_HEADER_UNITS_PAGES,
99 } mxc_spixf_reva_hdr_units_t;
100 
101 /**
102  * @brief      Number of data lines to use.
103  */
104 typedef enum {
105     MXC_SPIXF_REVA_WIDTH_1, ///< 1 Data Line.
106     MXC_SPIXF_REVA_WIDTH_2, ///< 2 Data Lines(x2).
107     MXC_SPIXF_REVA_WIDTH_4, ///< 4 Data Lines(x4).
108 } mxc_spixf_reva_width_t;
109 
110 /**
111  * @brief      MXC_SPIXF configuration type.
112  */
113 typedef struct {
114     mxc_spixf_reva_mode_t mode; ///< MXC_SPIXF mode to use, 0-3.
115     mxc_spixf_reva_sspol_t
116         ssel_pol; ///< Mask of active levels for slave select signals, use mxc_spixf_ssel_t.
117     uint32_t hz; ///< SPI Frequency in Hz.
118 } mxc_spixf_reva_cfg_t;
119 
120 /**
121  * @brief      Slave select active timing
122  */
123 typedef enum {
124     MXC_SPIXF_REVA_SYS_CLOCKS_0,
125     MXC_SPIXF_REVA_SYS_CLOCKS_2,
126     MXC_SPIXF_REVA_SYS_CLOCKS_4,
127     MXC_SPIXF_REVA_SYS_CLOCKS_8,
128 } mxc_spixf_reva_ssact_t;
129 
130 /**
131  * @brief      Slave select Inactive timing
132  */
133 typedef enum {
134     MXC_SPIXF_REVA_SYS_CLOCKS_1, ///< 1 system clocks
135     MXC_SPIXF_REVA_SYS_CLOCKS_3, ///< 3 system clocks
136     MXC_SPIXF_REVA_SYS_CLOCKS_5, ///< 5 system clocks
137     MXC_SPIXF_REVA_SYS_CLOCKS_9, ///< 9 system clocks
138 } mxc_spixf_reva_ssiact_t;
139 
140 /**
141  * @brief      Data Width, # of data I/O used to rcv data
142  */
143 typedef enum {
144     MXC_SPIXF_REVA_SINGLE_SDIO,
145     MXC_SPIXF_REVA_DUAL_SDIO,
146     MXC_SPIXF_REVA_QUAD_SDIO,
147     MXC_SPIXF_REVA_INVALID,
148 } mxc_spixf_reva_spiwidth_t;
149 
150 /**
151  * @brief      IO pullup/pulldown Control
152  */
153 typedef enum {
154     MXC_SPIXF_REVA_TRISTATE = MXC_S_SPIXFM_REVA_IO_CTRL_PU_PD_CTRL_TRI_STATE,
155     MXC_SPIXF_REVA_PULL_UP = MXC_S_SPIXFM_REVA_IO_CTRL_PU_PD_CTRL_PULL_UP,
156     MXC_SPIXF_REVA_PULL_DOWN = MXC_S_SPIXFM_REVA_IO_CTRL_PU_PD_CTRL_PULL_DOWN,
157 } mxc_spixf_reva_pup_t;
158 
159 /**
160  * @brief       SPIXF drive strentgh
161  *
162  */
163 typedef enum { MXC_SPIXF_REVA_LOW = 0, MXC_SPIXF_REVA_HIGH } mxc_spixf_reva_ds_t;
164 
165 /**
166  * @brief      MXC_SPIXF Transaction request.
167  */
168 typedef struct mxc_spixf_reva_req mxc_spixf_reva_req_t;
169 
170 struct mxc_spixf_reva_req {
171     uint8_t deass; ///< De-assert slave select at the end of the transaction.
172     uint8_t wait_tx; ///< Wait for the TX FIFO to be empty before returning.
173     const uint8_t *tx_data; ///< TX buffer.
174     uint8_t *rx_data; ///< RX buffer.
175     mxc_spixf_reva_width_t width; ///< Number of data lines to use
176     unsigned len; ///< Number of bytes to send.
177     unsigned read_num; ///< Number of bytes read.
178     unsigned write_num; ///< Number of bytes written.
179     spixr_complete_cb_t callback; ///< callback function
180 };
181 
182 typedef mxc_spixf_pup_t mxc_spixf_padctrl_t;
183 
184 /***** Function Prototypes *****/
185 int MXC_SPIXF_RevA_Init(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
186                         uint32_t cmdval, uint32_t frequency);
187 void MXC_SPIXF_RevA_Shutdown(mxc_spixfc_reva_regs_t *spixfc);
188 void MXC_SPIXF_RevA_IOCtrl(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_ds_t sclk_ds,
189                            mxc_spixf_ds_t ss_ds, mxc_spixf_ds_t sdio_ds,
190                            mxc_spixf_padctrl_t padctrl);
191 int MXC_SPIXF_RevA_Clocks(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
192                           mxc_spixfc_fifo_reva_regs_t *spixfc_fifo, uint32_t len, uint8_t deass);
193 int MXC_SPIXF_RevA_Transaction(mxc_spixfc_reva_regs_t *spixfc,
194                                mxc_spixfc_fifo_reva_regs_t *spixfc_fifo, mxc_spixf_req_t *req);
195 int MXC_SPIXF_RevA_TransactionAsync(mxc_spixfc_reva_regs_t *spixfc,
196                                     mxc_spixfc_fifo_reva_regs_t *spixfc_fifo, mxc_spixf_req_t *req);
197 int MXC_SPIXF_RevA_AbortAsync(mxc_spixfc_reva_regs_t *spixfc, mxc_spixf_req_t *req);
198 void MXC_SPIXF_RevA_Handler(mxc_spixfc_reva_regs_t *spixfc,
199                             mxc_spixfc_fifo_reva_regs_t *spixfc_fifo);
200 int MXC_SPIXF_RevA_ReadyForSleep(mxc_spixfc_reva_regs_t *spixfc);
201 int MXC_SPIXF_RevA_EnableInt(mxc_spixfc_reva_regs_t *spixfc, uint32_t mask);
202 int MXC_SPIXF_RevA_DisableInt(mxc_spixfc_reva_regs_t *spixfc, uint32_t mask);
203 int MXC_SPIXF_RevA_ClearFlags(mxc_spixfc_reva_regs_t *spixfc, uint32_t flags);
204 int MXC_SPIXF_RevA_GetFlags(mxc_spixfc_reva_regs_t *spixfc);
205 
206 //Low level
207 int MXC_SPIXF_RevA_SetMode(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
208                            mxc_spixf_mode_t mode);
209 mxc_spixf_mode_t MXC_SPIXF_RevA_GetMode(mxc_spixfc_reva_regs_t *spixfc);
210 int MXC_SPIXF_RevA_SetSSPolActiveHigh(mxc_spixfc_reva_regs_t *spixfc,
211                                       mxc_spixfm_reva_regs_t *spixfm);
212 int MXC_SPIXF_RevA_SetSSPolActiveLow(mxc_spixfc_reva_regs_t *spixfc,
213                                      mxc_spixfm_reva_regs_t *spixfm);
214 int MXC_SPIXF_RevA_GetSSPolarity(mxc_spixfc_reva_regs_t *spixfc);
215 int MXC_SPIXF_RevA_SetSPIFrequency(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
216                                    unsigned int hz);
217 uint32_t MXC_SPIXF_RevA_GetSPIFrequency(mxc_spixfm_reva_regs_t *spixfm);
218 uint32_t MXC_SPIXF_RevA_GetSPIFrequencyWrite(mxc_spixfc_reva_regs_t *spixfc);
219 int MXC_SPIXF_RevA_SetSSActiveTime(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
220                                    mxc_spixf_ssact_t ssact);
221 mxc_spixf_ssact_t MXC_SPIXF_RevA_GetSSActiveTime(mxc_spixfc_reva_regs_t *spixfc);
222 int MXC_SPIXF_RevA_SetSSInactiveTime(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
223                                      mxc_spixf_ssiact_t ssiact);
224 mxc_spixf_ssiact_t MXC_SPIXF_RevA_GetSSInactiveTime(mxc_spixfc_reva_regs_t *spixfc);
225 int MXC_SPIXF_RevA_SetCmdWidth(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_spiwidth_t width);
226 mxc_spixf_spiwidth_t MXC_SPIXF_RevA_GetCmdWidth(mxc_spixfm_reva_regs_t *spixfm);
227 int MXC_SPIXF_RevA_SetAddrWidth(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_spiwidth_t width);
228 mxc_spixf_spiwidth_t MXC_SPIXF_RevA_GetAddrWidth(mxc_spixfm_reva_regs_t *spixfm);
229 int MXC_SPIXF_RevA_SetDataWidth(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_spiwidth_t width);
230 mxc_spixf_spiwidth_t MXC_SPIXF_RevA_GetDataWidth(mxc_spixfm_reva_regs_t *spixfm);
231 int MXC_SPIXF_RevA_Set4ByteAddr(mxc_spixfm_reva_regs_t *spixfm);
232 int MXC_SPIXF_RevA_Set3ByteAddr(mxc_spixfm_reva_regs_t *spixfm);
233 unsigned int MXC_SPIXF_RevA_GetBytesPerAddr(mxc_spixfm_reva_regs_t *spixfm);
234 int MXC_SPIXF_RevA_SetModeClk(mxc_spixfm_reva_regs_t *spixfm, uint8_t mdclk);
235 uint8_t MXC_SPIXF_RevA_GetModeClk(mxc_spixfm_reva_regs_t *spixfm);
236 int MXC_SPIXF_RevA_SetCmdModeEveryTrans(mxc_spixfm_reva_regs_t *spixfm);
237 int MXC_SPIXF_RevA_SetCmdModeFirstTrans(mxc_spixfm_reva_regs_t *spixfm);
238 mxc_spixf_cmd_t MXC_SPIXF_RevA_GetCmdMode(mxc_spixfm_reva_regs_t *spixfm);
239 int MXC_SPIXF_RevA_BBDataOutputEnable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask);
240 int MXC_SPIXF_RevA_BBDataOutputDisable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask);
241 uint8_t MXC_SPIXF_RevA_BBDataOutputIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
242 uint8_t MXC_SPIXF_RevA_GetBBDataOutputValue(mxc_spixfc_reva_regs_t *spixfc);
243 uint8_t MXC_SPIXF_RevA_GetBBDataInputValue(mxc_spixfc_reva_regs_t *spixfc);
244 int MXC_SPIXF_RevA_SetModeData(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm,
245                                uint16_t data);
246 uint16_t MXC_SPIXF_RevA_GetModeData(mxc_spixfm_reva_regs_t *spixfm);
247 int MXC_SPIXF_RevA_SetSCKInverted(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm);
248 int MXC_SPIXF_RevA_SetSCKNonInverted(mxc_spixfc_reva_regs_t *spixfc,
249                                      mxc_spixfm_reva_regs_t *spixfm);
250 int MXC_SPIXF_RevA_GetSCKInverted(mxc_spixfm_reva_regs_t *spixfm);
251 int MXC_SPIXF_RevA_SCKFeedbackEnable(mxc_spixfc_reva_regs_t *spixfc,
252                                      mxc_spixfm_reva_regs_t *spixfm);
253 int MXC_SPIXF_RevA_SCKFeedbackDisable(mxc_spixfc_reva_regs_t *spixfc,
254                                       mxc_spixfm_reva_regs_t *spixfm);
255 int MXC_SPIXF_RevA_SCKFeedbackIsEnabled(mxc_spixfm_reva_regs_t *spixfm);
256 int MXC_SPIXF_RevA_SetSCKSampleDelay(mxc_spixfc_reva_regs_t *spixfc, uint8_t delay);
257 uint8_t MXC_SPIXF_RevA_GetSCKSampleDelay(mxc_spixfc_reva_regs_t *spixfc);
258 int MXC_SPIXF_RevA_SetCmdValue(mxc_spixfm_reva_regs_t *spixfm, uint8_t cmdval);
259 uint8_t MXC_SPIXF_RevA_GetCmdValue(mxc_spixfm_reva_regs_t *spixfm);
260 void MXC_SPIXF_RevA_SetPageSize(mxc_spixfc_reva_regs_t *spixfc, mxc_spixf_page_size_t size);
261 mxc_spixf_page_size_t MXC_SPIXF_RevA_GetPageSize(mxc_spixfc_reva_regs_t *spixfc);
262 int MXC_SPIXF_RevA_SimpleRXEnabled(mxc_spixfc_reva_regs_t *spixfc);
263 int MXC_SPIXF_RevA_SimpleRXDisable(mxc_spixfc_reva_regs_t *spixfc);
264 int MXC_SPIXF_RevA_SimpleRXIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
265 int MXC_SPIXF_RevA_SimpleModeEnable(mxc_spixfc_reva_regs_t *spixfc);
266 int MXC_SPIXF_RevA_SimpleModeDisable(mxc_spixfc_reva_regs_t *spixfc);
267 int MXC_SPIXF_RevA_SimpleModeIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
268 int MXC_SPIXF_RevA_SampleOutputEnable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask);
269 int MXC_SPIXF_RevA_SampleOutputDisable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask);
270 uint8_t MXC_SPIXF_RevA_SampleOutputIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
271 uint8_t MXC_SPIXF_RevA_GetSampleOutputValue(mxc_spixfc_reva_regs_t *spixfc);
272 void MXC_SPIXF_RevA_SetIoctrlSDIODriveHigh(mxc_spixfm_reva_regs_t *spixfm);
273 void MXC_SPIXF_RevA_SetIoctrlSDIODriveLow(mxc_spixfm_reva_regs_t *spixfm);
274 uint8_t MXC_SPIXF_RevA_GetIoctrlSDIODrive(mxc_spixfm_reva_regs_t *spixfm);
275 void MXC_SPIXF_RevA_SetIoctrlSCLKDriveHigh(mxc_spixfm_reva_regs_t *spixfm);
276 void MXC_SPIXF_RevA_SetIoctrlSCLKDriveLow(mxc_spixfm_reva_regs_t *spixfm);
277 uint8_t MXC_SPIXF_RevA_GetIoctrlSCLKDrive(mxc_spixfm_reva_regs_t *spixfm);
278 void MXC_SPIXF_RevA_SetIoctrlSSDriveHigh(mxc_spixfm_reva_regs_t *spixfm);
279 void MXC_SPIXF_RevA_SetIoctrlSSDriveLow(mxc_spixfm_reva_regs_t *spixfm);
280 uint8_t MXC_SPIXF_RevA_GetIoctrlSSDrive(mxc_spixfm_reva_regs_t *spixfm);
281 void MXC_SPIXF_RevA_SetPuPdCtrl(
282     mxc_spixfm_reva_regs_t *spixfm,
283     mxc_spixf_padctrl_t pad); // Legacy Name. Will start using SetPadCtrl going forward. 1-23-2023
284 uint8_t MXC_SPIXF_RevA_GetPuPdCtrl(
285     mxc_spixfm_reva_regs_t
286         *spixfm); // Legacy Name. Will start using GetPadCtrl going forward. 1-23-2023
287 void MXC_SPIXF_RevA_SetPadCtrl(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_padctrl_t pad);
288 uint8_t MXC_SPIXF_RevA_GetPadCtrl(mxc_spixfm_reva_regs_t *spixfm);
289 void MXC_SPIXF_RevA_SetSCKDriveHigh(mxc_spixfc_reva_regs_t *spixfc);
290 void MXC_SPIXF_RevA_SetSCKDriveLow(mxc_spixfc_reva_regs_t *spixfc);
291 uint8_t MXC_SPIXF_RevA_GetSCKDrive(mxc_spixfc_reva_regs_t *spixfc);
292 void MXC_SPIXF_RevA_SetSSDriveOutputHigh(mxc_spixfc_reva_regs_t *spixfc);
293 void MXC_SPIXF_RevA_SetSSDriveOutputLow(mxc_spixfc_reva_regs_t *spixfc);
294 uint8_t MXC_SPIXF_RevA_GetSSDriveOutput(mxc_spixfc_reva_regs_t *spixfc);
295 int MXC_SPIXF_RevA_BitBangModeEnable(mxc_spixfc_reva_regs_t *spixfc);
296 int MXC_SPIXF_RevA_BitBangModeDisable(mxc_spixfc_reva_regs_t *spixfc);
297 int MXC_SPIXF_RevA_BitBangModeIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
298 int MXC_SPIXF_RevA_RXFIFOEnable(mxc_spixfc_reva_regs_t *spixfc);
299 int MXC_SPIXF_RevA_RXFIFODisable(mxc_spixfc_reva_regs_t *spixfc);
300 int MXC_SPIXF_RevA_RXFIFOIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
301 int MXC_SPIXF_RevA_TXFIFOEnable(mxc_spixfc_reva_regs_t *spixfc);
302 int MXC_SPIXF_RevA_TXFIFODisable(mxc_spixfc_reva_regs_t *spixfc);
303 int MXC_SPIXF_RevA_TXFIFOIsEnabled(mxc_spixfc_reva_regs_t *spixfc);
304 int MXC_SPIXF_RevA_Enable(mxc_spixfc_reva_regs_t *spixfc);
305 int MXC_SPIXF_RevA_Disable(mxc_spixfc_reva_regs_t *spixfc);
306 int MXC_SPIXF_RevA_IsEnabled(mxc_spixfc_reva_regs_t *spixfc);
307 int MXC_SPIXF_RevA_SetBusIdle(mxc_spixfm_reva_regs_t *spixfm, unsigned int busidle);
308 unsigned int MXC_SPIXF_RevA_GetBusIdle(mxc_spixfm_reva_regs_t *spixfm);
309 
310 #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_SPIXF_SPIXF_REVA_H_
311