1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2018-02-08     RT-Thread    the first version
9  */
10 
11 #ifndef __DRV_SPI_H__
12 #define __DRV_SPI_H__
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 /********************** private ************************************/
18 
19 #define SPI0_BASE_ADDR     (0x01C05000)
20 #define SPI1_BASE_ADDR     (0x01C06000)
21 
22 /**
23   * @brief Serial Peripheral Interface
24   */
25 typedef struct
26 {
27     volatile rt_uint32_t VER;               /* SPI Version number Register,                          Address offset: 0x00   */
28     volatile rt_uint32_t CTRL;              /* SPI Global Control Register,                          Address offset: 0x04   */
29     volatile rt_uint32_t TCTRL;             /* SPI Transfer Control Register,                        Address offset: 0x08   */
30     volatile rt_uint32_t RESERVED1[1];      /* Reserved, 0x0C                                                               */
31     volatile rt_uint32_t IER;               /* SPI Interrupt Control Register,                       Address offset: 0x10   */
32     volatile rt_uint32_t STA;               /* SPI Interrupt Status Register,                        Address offset: 0x14   */
33     volatile rt_uint32_t FCTL;              /* SPI FIFO Control Register,                            Address offset: 0x18   */
34     volatile rt_uint32_t FST;               /* SPI FIFO Status Register,                             Address offset: 0x1C   */
35     volatile rt_uint32_t WAIT;              /* SPI Wait Clock Counter Register,                      Address offset: 0x20   */
36     volatile rt_uint32_t CCTR;              /* SPI Clock Rate Control Register,                      Address offset: 0x24   */
37     volatile rt_uint32_t RESERVED2[2];      /* Reserved, 0x28-0x2C                                                          */
38     volatile rt_uint32_t BC;                /* SPI Master mode Burst Control Register,               Address offset: 0x30   */
39     volatile rt_uint32_t TC;                /* SPI Master mode Transmit Counter Register,            Address offset: 0x34   */
40     volatile rt_uint32_t BCC;               /* SPI Burst Control Register,                           Address offset: 0x38   */
41     volatile rt_uint32_t RESERVED3[19];     /* Reserved, 0x3C-0x84                                                          */
42     volatile rt_uint32_t NDMA_MODE_CTRL;    /* SPI Nomal DMA Mode Control Regist                     Address offset: 0x88   */
43     volatile rt_uint32_t RESERVED4[93];     /* Reserved, 0x8C-0x1FC                                                         */
44     volatile rt_uint32_t TXD;               /* SPI TX Date Register,                                 Address offset: 0x200  */
45     volatile rt_uint32_t RESERVED5[63];     /* Reserved, 0x204-0x2FC                                                        */
46     volatile rt_uint32_t RXD;               /* SPI RX Date Register,                                 Address offset: 0x300  */
47 } SPI_T;
48 
49 /*
50  * @brief SPI Global Control Register
51  */
52 #define SPI_CTRL_RST_SHIFT                  (31)
53 #define SPI_CTRL_RST_MASK                   (0x1U << SPI_CTRL_RST_SHIFT)
54 
55 #define SPI_CTRL_TP_EN_SHIFT                (7)
56 #define SPI_CTRL_TP_EN_MASK                 (0x1U << SPI_CTRL_TP_EN_SHIFT)
57 
58 #define SPI_CTRL_MODE_SHIFT                 (1)
59 #define SPI_CTRL_MODE_MASK                  (0x1U << SPI_CTRL_MODE_SHIFT)
60 typedef enum
61 {
62     SPI_CTRL_MODE_SLAVE = 0 << SPI_CTRL_MODE_SHIFT,
63     SPI_CTRL_MODE_MASTER = 1 << SPI_CTRL_MODE_SHIFT
64 } SPI_CTRL_Mode;
65 
66 #define SPI_CTRL_EN_SHIFT                   (0)
67 #define SPI_CTRL_EN_MASK                    (0x1U << SPI_CTRL_EN_SHIFT)
68 typedef enum
69 {
70     SPI_CTRL_EN_DISABLE = 0 << SPI_CTRL_EN_SHIFT,
71     SPI_CTRL_EN_ENABLE = 1 << SPI_CTRL_EN_SHIFT
72 } SPI_CTRL_En;
73 
74 /*
75  * @brief SPI Transfer Control Register
76  */
77 #define SPI_TCTRL_XCH_SHIFT                 (31)
78 #define SPI_TCTRL_XCH_MASK                  (0x1U << SPI_TCTRL_XCH_SHIFT)
79 typedef enum
80 {
81     SPI_TCTRL_XCH_IDLE = 0 << SPI_TCTRL_XCH_SHIFT,
82     SPI_TCTRL_XCH_START = 1 << SPI_TCTRL_XCH_SHIFT
83 } SPI_TCTRL_Xch;
84 
85 #define SPI_TCTRL_SDDM_SHIFT                (14)
86 #define SPI_TCTRL_SDDM_MASK                 (0x0U << SPI_TCTRL_SDDM_SHIFT)
87 typedef enum
88 {
89     SPI_TCTRL_SDDM_SEND_NODELAY = 0 << SPI_TCTRL_SDDM_SHIFT,
90     SPI_TCTRL_SDDM_SEND_DELAY = 1 << SPI_TCTRL_SDDM_SHIFT
91 } SPI_TCTRL_Sddm;
92 
93 #define SPI_TCTRL_SDM_SHIFT                 (13)
94 #define SPI_TCTRL_SDM_MASK                  (0x1U << SPI_TCTRL_SDM_SHIFT)
95 typedef enum
96 {
97     SPI_TCTRL_SDM_SAMPLE_NODELAY = 1 << SPI_TCTRL_SDM_SHIFT,
98     SPI_TCTRL_SDM_SAMPLE_DELAY = 0 << SPI_TCTRL_SDM_SHIFT
99 } SPI_TCTRL_Sdm;
100 
101 #define SPI_TCTRL_FBS_SHIFT                 (12)
102 #define SPI_TCTRL_FBS_MASK                  (0x1U << SPI_TCTRL_FBS_SHIFT)
103 typedef enum
104 {
105     SPI_TCTRL_FBS_MSB = 0 << SPI_TCTRL_FBS_SHIFT,
106     SPI_TCTRL_FBS_LSB = 1 << SPI_TCTRL_FBS_SHIFT
107 } SPI_TCTRL_Fbs;
108 
109 #define SPI_TCTRL_SDC_SHIFT                 (11)
110 #define SPI_TCTRL_SDC_MASK                  (0x1U << SPI_TCTRL_SDC_SHIFT)
111 
112 #define SPI_TCTRL_RPSM_SHIFT                (10)
113 #define SPI_TCTRL_RPSM_MASK                 (0x1U << SPI_TCTRL_RPSM_SHIFT)
114 
115 #define SPI_TCTRL_DDB_SHIFT                 (9)
116 #define SPI_TCTRL_DDB_MASK                  (0x1U << SPI_TCTRL_DDB_SHIFT)
117 
118 #define SPI_TCTRL_DHB_SHIFT                 (8)
119 #define SPI_TCTRL_DHB_MASK                  (0x1U << SPI_TCTRL_DHB_SHIFT)
120 typedef enum
121 {
122     SPI_TCTRL_DHB_FULL_DUPLEX = 0 << SPI_TCTRL_DHB_SHIFT,
123     SPI_TCTRL_DHB_HALF_DUPLEX = 1 << SPI_TCTRL_DHB_SHIFT
124 } SPI_TCTRL_DHB_Duplex;
125 
126 #define SPI_TCTRL_SS_LEVEL_SHIFT            (7)
127 #define SPI_TCTRL_SS_LEVEL_MASK             (0x1U << SPI_TCTRL_SS_LEVEL_SHIFT)
128 
129 #define SPI_TCTRL_SS_OWNER_SHIFT            (6)
130 #define SPI_TCTRL_SS_OWNER_MASK             (0x1U << SPI_TCTRL_SS_OWNER_SHIFT)
131 typedef enum
132 {
133     SPI_TCTRL_SS_OWNER_CONTROLLER = 0 << SPI_TCTRL_SS_OWNER_SHIFT,
134     SPI_TCTRL_SS_OWNER_SOFTWARE = 1 << SPI_TCTRL_SS_OWNER_SHIFT
135 } SPI_TCTRL_SS_OWNER;
136 
137 #define SPI_TCTRL_SS_SEL_SHIFT              (4)
138 #define SPI_TCTRL_SS_SEL_MASK               (0x3U << SPI_TCTRL_SS_SEL_SHIFT)
139 typedef enum
140 {
141     SPI_TCTRL_SS_SEL_SS0 = 0 << SPI_TCTRL_SS_SEL_SHIFT,
142     SPI_TCTRL_SS_SEL_SS1 = 1 << SPI_TCTRL_SS_SEL_SHIFT,
143     SPI_TCTRL_SS_SEL_SS2 = 2 << SPI_TCTRL_SS_SEL_SHIFT,
144     SPI_TCTRL_SS_SEL_SS3 = 3 << SPI_TCTRL_SS_SEL_SHIFT
145 } SPI_TCTRL_SS_Sel;
146 
147 #define SPI_TCTRL_SS_CTL_SHIFT              (3)
148 #define SPI_TCTRL_SS_CTL_MASK               (0x1U << SPI_TCTRL_SS_CTL_SHIFT)
149 
150 #define SPI_TCTRL_SPOL_SHIFT                (2)
151 #define SPI_TCTRL_SPOL_MASK                 (0x1U << SPI_TCTRL_SPOL_SHIFT)
152 
153 #define SPI_TCTRL_CPOL_SHIFT                (1)
154 #define SPI_TCTRL_CPOL_MASK                 (0x1U << SPI_TCTRL_CPOL_SHIFT)
155 typedef enum
156 {
157     SPI_TCTRL_CPOL_HIGH = 0 << SPI_TCTRL_CPOL_SHIFT,
158     SPI_TCTRL_CPOL_LOW = 1 << SPI_TCTRL_CPOL_SHIFT
159 } SPI_TCTRL_Cpol;
160 
161 #define SPI_TCTRL_CPHA_SHIFT                (0)
162 #define SPI_TCTRL_CPHA_MASK                 (0x1U << SPI_TCTRL_CPHA_SHIFT)
163 typedef enum
164 {
165     SPI_TCTRL_CPHA_PHASE0  = 0 << SPI_TCTRL_CPHA_SHIFT,
166     SPI_TCTRL_CPHA_PHASE1  = 1 << SPI_TCTRL_CPHA_SHIFT
167 } SPI_TCTRL_Cpha;
168 
169 typedef enum
170 {
171     SPI_SCLK_Mode0 = 0 << SPI_TCTRL_CPHA_SHIFT,
172     SPI_SCLK_Mode1 = 1 << SPI_TCTRL_CPHA_SHIFT,
173     SPI_SCLK_Mode2 = 2 << SPI_TCTRL_CPHA_SHIFT,
174     SPI_SCLK_Mode3 = 3 << SPI_TCTRL_CPHA_SHIFT
175 } SPI_SCLK_Mode;
176 
177 /*
178  * @brief SPI Interrupt Control Register
179  */
180 #define SPI_IER_SS_INT_EN_SHIFT             (13)
181 #define SPI_IER_SS_INT_EN_MASK              (0x1U << SPI_IER_SS_INT_EN_SHIFT)
182 
183 #define SPI_IER_TC_INT_EN_SHIFT             (12)
184 #define SPI_IER_TC_INT_EN_MASK              (0x1U << SPI_IER_TC_INT_EN_SHIFT)
185 
186 #define SPI_IER_TF_UDR_INT_EN_SHIFT         (11)
187 #define SPI_IER_TF_UDR_INT_EN_MASK          (0x1U << SPI_IER_TF_UDR_INT_EN_SHIFT)
188 
189 #define SPI_IER_TF_OVF_INT_EN_SHIFT         (10)
190 #define SPI_IER_TF_OVF_INT_EN_MASK          (0x1U << SPI_IER_TF_OVF_INT_EN_SHIFT)
191 
192 #define SPI_IER_RF_UDR_INT_EN_SHIFT         (9)
193 #define SPI_IER_RF_UDR_INT_EN_MASK          (0x1U << SPI_IER_RF_UDR_INT_EN_SHIFT)
194 
195 #define SPI_IER_RF_OVF_INT_EN_SHIFT         (8)
196 #define SPI_IER_RF_OVF_INT_EN_MASK          (0x1U << SPI_IER_RF_OVF_INT_EN_SHIFT)
197 
198 #define SPI_IER_TF_FUL_INT_EN_SHIFT         (6)
199 #define SPI_IER_TF_FUL_INT_EN_MASK          (0x1U << SPI_IER_TF_FUL_INT_EN_SHIFT)
200 
201 #define SPI_IER_TX_EMP_INT_EN_SHIFT         (5)
202 #define SPI_IER_TX_EMP_INT_EN_MASK          (0x1U << SPI_IER_TX_EMP_INT_EN_SHIFT)
203 
204 #define SPI_IER_TX_ERQ_INT_EN_SHIFT         (4)
205 #define SPI_IER_TX_ERQ_INT_EN_MASK          (0x1U << SPI_IER_TX_ERQ_INT_EN_SHIFT)
206 
207 #define SPI_IER_RF_FUL_INT_EN_SHIFT         (2)
208 #define SPI_IER_RF_FUL_INT_EN_MASK          (0x1U << SPI_IER_RF_FUL_INT_EN_SHIFT)
209 
210 #define SPI_IER_RX_EMP_INT_EN_SHIFT         (1)
211 #define SPI_IER_RX_EMP_INT_EN_MASK          (0x1U << SPI_IER_RX_EMP_INT_EN_SHIFT)
212 
213 #define SPI_IER_RF_RDY_INT_EN_SHIFT         (0)
214 #define SPI_IER_RF_RDY_INT_EN_MASK          (0x1U << SPI_IER_RF_RDY_INT_EN_SHIFT)
215 
216 /*
217  * @brief SPI Interrupt Status Register
218  */
219 #define SPI_STA_SSI_SHIFT                   (13)
220 #define SPI_STA_SSI_MASK                    (0x1U << SPI_STA_SSI_SHIFT)
221 
222 #define SPI_STA_TC_SHIFT                    (12)
223 #define SPI_STA_TC_MASK                     (0x1U << SPI_STA_TC_SHIFT)
224 
225 #define SPI_STA_TF_UDF_SHIFT                (11)
226 #define SPI_STA_TF_UDF_MASK                 (0x1U << SPI_STA_TF_UDF_SHIFT)
227 
228 #define SPI_STA_TF_OVF_SHIFT                (10)
229 #define SPI_STA_TF_OVF_MASK                 (0x1U << SPI_STA_TF_OVF_SHIFT)
230 
231 #define SPI_STA_RX_UDF_SHIFT                (9)
232 #define SPI_STA_RX_UDF_MASK                 (0x1U << SPI_STA_RX_UDF_SHIFT)
233 
234 #define SPI_STA_RX_OVF_SHIFT                (8)
235 #define SPI_STA_RX_OVF_MASK                 (0x1U << SPI_STA_RX_OVF_SHIFT)
236 
237 #define SPI_STA_TX_FULL_SHIFT               (6)
238 #define SPI_STA_TX_FULL_MASK                (0x1U << SPI_STA_TX_FULL_SHIFT)
239 
240 #define SPI_STA_TX_EMP_SHIFT                (5)
241 #define SPI_STA_TX_EMP_MASK                 (0x1U << SPI_STA_TX_EMP_SHIFT)
242 
243 #define SPI_STA_TX_READY_SHIFT              (4)
244 #define SPI_STA_TX_READY_MASK               (0x1U << SPI_STA_TX_READY_SHIFT)
245 
246 #define SPI_STA_RX_FULL_SHIFT               (2)
247 #define SPI_STA_RX_FULL_MASK                (0x1U << SPI_STA_RX_FULL_SHIFT)
248 
249 #define SPI_STA_RX_EMP_SHIFT                (1)
250 #define SPI_STA_RX_EMP_MASK                 (0x1U << SPI_STA_RX_EMP_SHIFT)
251 
252 #define SPI_STA_RX_RDY_SHIFT                (0)
253 #define SPI_STA_RX_RDY_MASK                 (0x1U << SPI_STA_RX_RDY_SHIFT)
254 
255 /*
256  * @brief SPI FIFO Control Register
257  */
258 #define SPI_FCTL_TF_RST_SHIFT               (31)
259 #define SPI_FCTL_TF_RST_MASK                (0x1U << SPI_FCTL_TF_RST_SHIFT)
260 
261 #define SPI_FCTL_TF_TEST_EN_SHIFT           (30)
262 #define SPI_FCTL_TF_TEST_EN_MASK            (0x1U << SPI_FCTL_TF_TEST_EN_SHIFT)
263 
264 #define SPI_FCTL_TF_DRQ_EN_SHIFT            (24)
265 #define SPI_FCTL_TF_DRQ_EN_MASK             (0x1U << SPI_FCTL_TF_DRQ_EN_SHIFT)
266 #define SPI_FCTL_TF_DRQ_EN_BIT              HAL_BIT(24)
267 
268 #define SPI_FCTL_TX_TRIG_LEVEL_SHIFT        (16)
269 #define SPI_FCTL_TX_TRIG_LEVEL_MASK         (0xFFU << SPI_FCTL_TX_TRIG_LEVEL_SHIFT)
270 
271 #define SPI_FCTL_RF_RST_SHIFT               (15)
272 #define SPI_FCTL_RF_RST_MASK                (0x1U << SPI_FCTL_RF_RST_SHIFT)
273 
274 #define SPI_FCTL_RF_TEST_SHIFT              (14)
275 #define SPI_FCTL_RF_TEST_MASK               (0x1U << SPI_FCTL_RF_TEST_SHIFT)
276 
277 #define SPI_FCTL_RF_DRQ_EN_SHIFT            (8)
278 #define SPI_FCTL_RF_DRQ_EN_MASK             (0x1U << SPI_FCTL_RF_DRQ_EN_SHIFT)
279 
280 #define SPI_FCTL_RX_TRIG_LEVEL_SHIFT        (0)
281 #define SPI_FCTL_RX_TRIG_LEVEL_MASK         (0xFFU << SPI_FCTL_RX_TRIG_LEVEL_SHIFT)
282 
283 /*
284  * @brief SPI FIFO Status Registe
285  */
286 #define SPI_FST_TB_WR_SHIFT                 (31)
287 #define SPI_FST_TB_WR_MASK                  (0x1U << SPI_FST_TB_WR_SHIFT)
288 
289 #define SPI_FST_TB_CNT_SHIFT                (28)
290 #define SPI_FST_TB_CNT_MASK                 (0x7U << SPI_FST_TB_CNT_SHIFT)
291 
292 #define SPI_FST_TF_CNT_SHIFT                (16)
293 #define SPI_FST_TF_CNT_MASK                 (0xFFU << SPI_FST_TF_CNT_SHIFT)
294 
295 #define SPI_FST_RB_WR_SHIFT                 (15)
296 #define SPI_FST_RB_WR_MASK                  (0x1U << SPI_FST_RB_WR_SHIFT)
297 
298 #define SPI_FST_RB_CNT_SHIFT                (12)
299 #define SPI_FST_RB_CNT_MASK                 (0x7U << SPI_FST_RB_CNT_SHIFT)
300 
301 #define SPI_FST_RF_CNT_SHIFT                (0)
302 #define SPI_FST_RF_CNT_MASK                 (0xFFU << SPI_FST_RF_CNT_SHIFT)
303 
304 /*
305  * @brief SPI Wait Clock Counter Register
306  */
307 #define SPI_WAIT_SWC_SHIFT                  (16)
308 #define SPI_WAIT_SWC_MASK                   (0xFU << SPI_WAIT_SWC_SHIFT)
309 
310 #define SPI_WAIT_WCC_SHIFT                  (0)
311 #define SPI_WAIT_WCC_MASK                   (0xFFFFU << SPI_WAIT_WCC_SHIFT)
312 
313 /*
314  * @brief SPI Clock Rate Control Register
315  */
316 #define SPI_CCTR_DRS_SHIFT                  (12)
317 #define SPI_CCTR_DRS_MASK                   (0x1U << SPI_CCTR_DRS_SHIFT)
318 typedef enum
319 {
320     SPI_CCTR_DRS_type_divRate1 = 0 << SPI_CCTR_DRS_SHIFT,
321     SPI_CCTR_DRS_type_divRate2 = 1 << SPI_CCTR_DRS_SHIFT
322 } SPI_CCTR_DRS_type;
323 
324 #define SPI_CCTR_CDR1_SHIFT                 (8)
325 #define SPI_CCTR_CDR1_MASK                  (0xFU << SPI_CCTR_CDR1_SHIFT)
326 
327 #define SPI_CCTR_CDR2_SHIFT                 (0)
328 #define SPI_CCTR_CDR2_MASK                  (0xFFU << SPI_CCTR_CDR2_SHIFT)
329 
330 /*
331  * @brief SPI Master mode Burst Control Register
332  */
333 #define SPI_BC_MBC_SHIFT                    (0)
334 #define SPI_BC_MBC_MASK                     (0xFFFFFFU << SPI_BC_MBC_SHIFT)
335 
336 /*
337  * @brief SPI Master mode Transmit Counter Register
338  */
339 #define SPI_TC_MWTC_SHIFT                   (0)
340 #define SPI_TC_MWTC_MASK                    (0xFFFFFFU << SPI_TC_MWTC_SHIFT)
341 
342 /*
343  * @brief SPI Burst Control Register
344  */
345 #define SPI_BCC_DRM_SHIFT                   (28)
346 #define SPI_BCC_DRM_MASK                    (0x1U << SPI_BCC_DRM_SHIFT)
347 
348 #define SPI_BCC_DBC_SHIFT                   (24)
349 #define SPI_BCC_DBC_MASK                    (0xFU << SPI_BCC_DBC_SHIFT)
350 
351 #define SPI_BCC_STC_SHIFT                   (0)
352 #define SPI_BCC_STC_MASK                    (0xFFFFFFU << SPI_BCC_STC_SHIFT)
353 
354 /*
355  * @brief SPI Nomal DMA Mode Control Regist
356  */
357 #define SPI_NDMA_MODE_CTRL_SHIFT            (0)
358 #define SPI_NDMA_MODE_CTRL_MASK             (0xFFU << SPI_NDMA_MODE_CTRL_SHIFT)
359 
360 /*
361  * @brief SPI TX Date Register
362  */
363 #define SPI_TXD_SHIFT                       (0)
364 #define SPI_TXD_MASK                        (0xFFFFFFFFU << SPI_TXD_SHIFT)
365 
366 /*
367  * @brief SPI RX Date Register
368  */
369 #define SPI_RXD_SHIFT                       (0)
370 #define SPI_RXD_MASK                        (0xFFFFFFFFU << SPI_RXD_SHIFT)
371 
372 /* other */
373 #define SPI_FIFO_SIZE                       (64)
374 #define SPI_MAX_WAIT_MS (2000)
375 #define SPI_SOURCE_CLK (24 * 1000 * 1000)
376 
377 /* io ops */
378 #define HAL_BIT(pos)                        (1U << (pos))
379 
380 #define HAL_SET_BIT(reg, mask)              ((reg) |= (mask))
381 #define HAL_CLR_BIT(reg, mask)              ((reg) &= ~(mask))
382 #define HAL_GET_BIT(reg, mask)              ((reg) & (mask))
383 #define HAL_GET_BIT_VAL(reg, shift, vmask)  (((reg) >> (shift)) & (vmask))
384 
385 #define HAL_MODIFY_REG(reg, clr_mask, set_mask) \
386     ((reg) = (((reg) & (~(clr_mask))) | (set_mask)))
387 
388 /* access LSBs of a 32-bit register (little endian only) */
389 #define HAL_REG_32BIT(reg_addr)  (*((volatile rt_uint32_t *)(reg_addr)))
390 #define HAL_REG_16BIT(reg_addr)  (*((volatile rt_uint16_t *)(reg_addr)))
391 #define HAL_REG_8BIT(reg_addr)   (*((volatile rt_uint8_t  *)(reg_addr)))
392 
393 #define HAL_WAIT_FOREVER    OS_WAIT_FOREVER
394 
395 #define HAL_ARRAY_SIZE(a)   (sizeof((a)) / sizeof((a)[0]))
396 
397 struct tina_spi
398 {
399     SPI_T *spi;
400     unsigned int spi_gate;
401     struct rt_spi_bus *spi_bus;
402 };
403 
404 struct tina_spi_cs
405 {
406     SPI_TCTRL_SS_Sel cs;
407 };
408 /* public function */
409 rt_err_t r6_spi_bus_register(SPI_T *spi, const char *spi_bus_name);
410 
411 #ifdef __cplusplus
412 }
413 #endif
414 #endif //
415