1 /**
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 *
15 * Description: Provides spi port UT \n
16 *
17 * History: \n
18 * 2022-08-18, Create file. \n
19 */
20 #include "hal_spi_v151_regs_def.h"
21 #include "hal_spi_v151_regs_op.h"
22 #include "hal_spi_v151.h"
23 #include "hal_spi.h"
24 #include "osal_interrupt.h"
25 #include "pinctrl.h"
26 #include "lpm_dev_ops.h"
27 #include "chip_io.h"
28 #include "std_def.h"
29 #include "platform_core.h"
30 #include "osal_interrupt.h"
31 #include "chip_core_irq.h"
32 #include "arch_port.h"
33 #include "soc_porting.h"
34 #include "spi_porting.h"
35
36 /** -----------------------------------------------------
37 * Reg Bit fild Max and Shift Value
38 * ---------------------------------------------------- */
39 /**
40 * @brief CTRLR0 : Control register 0.
41 */
42 #define HAL_SPI_CTRLR0_REG_MAX 0xFFFFFFFF
43 #define HAL_SPI_CE_LIN_TOGGLE_ENABLE (BIT(24))
44
45 /**
46 * @brief FRF : Frame format.
47 */
48 #define HAL_SPI_FRAME_FORMAT_MAX 0x03
49 #define HAL_SPI_FRAME_FORMAT_SHIFT 0x15
50
51 /**
52 * @brief DFS : Data frame size.
53 */
54 #define HAL_SPI_FRAME_SIZE_MAX 0x1F
55 #define HAL_SPI_FRAME_SIZE_SHIFT 0x10
56 #define HAL_SPI_FRAME_SIZE_8 0x07
57 #define HAL_SPI_FRAME_SIZE_16 0x0F
58 #define HAL_SPI_FRAME_SIZE_32 0x1F
59
60 /**
61 * @brief TMOD : Trans mode.
62 */
63 #define HAL_SPI_TRANS_MODE_MAX 0x03
64 #define HAL_SPI_TRANS_MODE_SHIFT 0x08
65 #define HAL_SPI_TRANS_MODE_TXRX 0x00
66 #define HAL_SPI_TRANS_MODE_TX 0x01
67 #define HAL_SPI_TRANS_MODE_RX 0x02
68 #define HAL_SPI_TRANS_MODE_EEPROM 0x03
69
70 /**
71 * @brief CLOCK : SCPOL and SCPH.
72 */
73 #define HAL_SPI_CLKS_MODE_MAX 0x03
74 #define HAL_SPI_CLKS_MODE_SHIFT 0x06
75
76 /**
77 * @brief CTRLR1 : Control register 1.
78 */
79 #define HAL_SPI_RECEIVED_DATA_REG_MAX 0xFFFF
80
81 /**
82 * @brief SSIENR : SSI enable register.
83 */
84 #define HAL_SPI_ENABLE 0x01
85
86 /**
87 * @brief SER : Slave enable register.
88 */
89 #define HAL_SPI_SLAVE_ENABLE_REG_MAX 0xFFFFFFFF
90
91 /**
92 * @brief BAUDR : Baud rate select.
93 */
94 #define HAL_SPI_CLK_DIV_REG_MAX 0xFFFF
95
96 /**
97 * @brief SR : Status register.
98 */
99 #define HAL_SPI_RX_FIFO_FULL_FLAG (BIT(4))
100 #define HAL_SPI_RX_FIFO_NOT_EMPTY_FLAG (BIT(3))
101 #define HAL_SPI_TX_FIFO_EMPTY_FLAG (BIT(2))
102 #define HAL_SPI_TX_FIFO_NOT_FULL_FLAG (BIT(1))
103 #define HAL_SPI_BUSY_FLAG (BIT(0))
104
105 /**
106 * @brief IMR : Interrupt mask register.
107 */
108 #define HAL_SPI_INTERRUPT_REG_MAX 0x3F
109
110
111 /**
112 * @brief SPI_CTRLR0: SPI control register.
113 */
114 #define HAL_QSPI_CTRLR0_REG_MAX 0xFFFFFFFF
115
116 /**
117 * @brief Wait cycles.
118 */
119 #define HAL_QSPI_WAIT_CYCLE_MAX 0x1F
120 #define HAL_QSPI_WAIT_CYCLE_SHIFT 0x0B
121 #define HAL_QSPI_WAIT_CYCLE_6 0x06
122 #define HAL_QSPI_WAIT_CYCLE_4 0x04
123 #define HAL_QSPI_WAIT_CYCLE_2 0x02
124
125 #define HAL_SPI_RX_SAMPLE_DLY_MAX 0xFF
126 #define HAL_SPI_RX_SAMPLE_DLY_SHIFT 0
127
128 /**
129 * @brief Command length.
130 */
131 #define HAL_QSPI_CMD_LENTH_MAX 0x03
132 #define HAL_QSPI_CMD_LENTH_SHIFT 0x08
133 #define HAL_QSPI_CMD_LENTH_8 0x02
134
135 /**
136 * @brief Address length.
137 */
138 #define HAL_QSPI_ADDR_LENTH_MAX 0x0F
139 #define HAL_QSPI_ADDR_LENTH_SHIFT 0x02
140 #define HAL_QSPI_ADDR_LENTH_24 0x06
141
142 /**
143 * @brief Trans type.
144 */
145 #define HAL_QSPI_TRANS_TYPES_MAX 0x03
146 #define HAL_QSPI_TRANS_TYPES_SHIFT 0x00
147 #define HAL_QSPI_TRANS_TYPES_CMD_S_ADDR_Q 0x01
148
149 #define HAL_SPI_BUS_MAX_NUM (SPI_BUS_MAX_NUMBER)
150
151 #define HAL_SPI_DR_REG_SIZE 36
152
153 /** -----------------------------------------------------
154 * SPI Register Address
155 * ----------------------------------------------------
156 */
157 #define HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT 0x00
158 #define HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT_MAX 0x01
159 #define HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT_SHIFT 0x00
160 #define HAL_SPI_BUS_2_DEVICE_MODE_MASTER 0x01
161 #define HAL_SPI_BUS_2_DEVICE_MODE_SET_BIT_MAX 0x01
162 #define HAL_SPI_BUS_2_DEVICE_MODE_SET_BIT_SHIFT 0x01
163
164 #define HAL_QSPI_DMA_CFG (*(volatile unsigned short *)(0x5C000404))
165 #define HAL_QSPI_1_DMA_CFG_MASK 0x0FU
166 #define HAL_QSPI_1_DMA_SEC_CORE 0x05
167 #define HAL_QSPI_1_DMA_APP_CORE 0x0A
168 #define HAL_QSPI_1_DMA_DSP_CORE 0x0F
169 #define HAL_QSPI_2_DMA_CFG_MASK 0xF0U
170 #define HAL_QSPI_2_DMA_SEC_CORE 0x50
171 #define HAL_QSPI_2_DMA_APP_CORE 0xA0
172 #define HAL_QSPI_2_DMA_DSP_CORE 0xF0
173
174 #define HAL_QSPI_INT_CFG (*(volatile unsigned short *)(0x5C000408))
175 #define HAL_QSPI_1_INT_SEC_CORE_MASK (BIT(0))
176 #define HAL_QSPI_1_INT_APP_CORE_MASK (BIT(2))
177 #define HAL_QSPI_2_INT_SEC_CORE_MASK (BIT(4))
178 #define HAL_QSPI_2_INT_APP_CORE_MASK (BIT(6))
179
180 #define HAL_SPI_DATA_FRAME_SIZE_BIT 16
181 #define HAL_SPI_DATA_FRAME_SIZE_BITFILD 5
182 #define hal_spi_frame_size_trans_to_frame_bytes(x) (((x) + 1) >> 0x03)
183
184 #define HAL_SPI_MINUMUM_CLK_DIV 2
185 #define HAL_SPI_MAXIMUM_CLK_DIV 65534
186
187 #define hal_spi_mhz_to_hz(x) ((x) * 1000000)
188
189 #define HAL_SPI_RXDS_EN BIT(18)
190 #define HAL_SPI_INST_DDR_EN BIT(17)
191 #define HAL_SPI_DDR_EN BIT(16)
192 #define HAL_SPI_INST_L_POSE 8
193 #define HAL_SPI_ADDR_L_POSE 2
194
195 #define HAL_SPI_RSVD_NONE 0
196 #define HAL_SPI_RSVD_X8 0
197 #define HAL_SPI_RSVD_X8_X8 1
198 #define HAL_SPI_RSVD_X16 0x11
199 #define HAL_SPI_CLK_DIV_2 2
200 #define HAL_SPI_CLK_DIV_4 4
201 #define HAL_SPI_CLK_DIV_20 20
202
203 #define HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT 0x00
204 #define HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT_MAX 0x01
205 #define HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT_SHIFT 0x00
206 #define HAL_SPI_BUS_2_DEVICE_MODE_MASTER 0x01
207 #define HAL_SPI_BUS_2_DEVICE_MODE_SET_BIT_MAX 0x01
208 #define HAL_SPI_BUS_2_DEVICE_MODE_SET_BIT_SHIFT 0x01
209
210 #define SPI_DMA_TX_DATA_LEVEL_4 4
211 #define QSPI_DMA_TX_DATA_LEVEL_8 8
212
213 #define CLDO_CRG_DIV_CTL3 0x44001114
214 #define CLDO_SUB_CRG_CKEN_CTL1 0x44001104
215 #define CLDO_CRG_CLK_SEL 0x44001134
216 #define SPI_DIV_LEN 5
217 #define PLL_CLK480M 480
218
219 spi_v151_regs_t *g_spi_base_addrs[SPI_BUS_MAX_NUM] = {
220 (spi_v151_regs_t *)SPI_BUS_0_BASE_ADDR,
221 (spi_v151_regs_t *)SPI_BUS_1_BASE_ADDR,
222 };
223
224 typedef struct spi_interrupt {
225 core_irq_t irq_num;
226 osal_irq_handler irq_func;
227 }
228 hal_spi_interrupt_t;
229
230 static int irq_spi0_handler(int i, void *p);
231 static int irq_spi1_handler(int i, void *p);
232
233 static const hal_spi_interrupt_t g_spi_interrupt_lines[SPI_BUS_MAX_NUMBER] = {
234 { QSPI0_2CS_IRQN, irq_spi0_handler },
235 { QSPI_IRQN, irq_spi1_handler },
236 };
237
irq_spi0_handler(int i,void * p)238 static int irq_spi0_handler(int i, void *p)
239 {
240 unused(i);
241 unused(p);
242 hal_spi_v151_irq_handler(SPI_BUS_0);
243 osal_irq_clear(g_spi_interrupt_lines[SPI_BUS_0].irq_num);
244 return 0;
245 }
246
irq_spi1_handler(int i,void * p)247 static int irq_spi1_handler(int i, void *p)
248 {
249 unused(i);
250 unused(p);
251 hal_spi_v151_irq_handler(SPI_BUS_1);
252 osal_irq_clear(g_spi_interrupt_lines[SPI_BUS_1].irq_num);
253 return 0;
254 }
255
spi_port_register_irq(spi_bus_t bus)256 void spi_port_register_irq(spi_bus_t bus)
257 {
258 osal_irq_request(g_spi_interrupt_lines[bus].irq_num, g_spi_interrupt_lines[bus].irq_func, NULL, NULL, NULL);
259 osal_irq_set_priority(g_spi_interrupt_lines[bus].irq_num, irq_prio(g_spi_interrupt_lines[bus].irq_num));
260 osal_irq_enable(g_spi_interrupt_lines[bus].irq_num);
261 }
262
spi_port_unregister_irq(spi_bus_t bus)263 void spi_port_unregister_irq(spi_bus_t bus)
264 {
265 osal_irq_disable(g_spi_interrupt_lines[bus].irq_num);
266 }
267
spi_porting_base_addr_get(spi_bus_t index)268 uintptr_t spi_porting_base_addr_get(spi_bus_t index)
269 {
270 return (uintptr_t)g_spi_base_addrs[index];
271 }
272
spi_porting_max_slave_select_get(spi_bus_t bus)273 uint32_t spi_porting_max_slave_select_get(spi_bus_t bus)
274 {
275 unused(bus);
276 return (uint32_t)SPI_SLAVE0;
277 }
278
spi_porting_set_device_mode(spi_bus_t bus,spi_mode_t mode)279 void spi_porting_set_device_mode(spi_bus_t bus, spi_mode_t mode)
280 {
281 UNUSED(bus);
282 HAL_SPI_DEVICE_MODE_SET_REG &= ~((uint16_t)(HAL_SPI_BUS_1_DEVICE_MODE_SET_BIT_MAX));
283 HAL_SPI_DEVICE_MODE_SET_REG |= (uint16_t)mode;
284 }
285
spi_porting_get_device_mode(spi_bus_t bus)286 spi_mode_t spi_porting_get_device_mode(spi_bus_t bus)
287 {
288 spi_mode_t mode = SPI_MODE_NONE;
289 UNUSED(bus);
290 mode = ((HAL_SPI_DEVICE_MODE_SET_REG & (uint16_t)1) != 0) ? SPI_MODE_MASTER : SPI_MODE_SLAVE;
291 return mode;
292 }
293
294 #ifdef TEST_SUITE
295 /* ws63 SPI testsuit pinctrl config, no config required now. */
spi_porting_test_spi_init_pin(void)296 void spi_porting_test_spi_init_pin(void)
297 {
298 return;
299 }
300 #endif
301
302 // opi使用cfbb_spi接口适配
hal_opi_set_fifo_threshold(spi_bus_t bus,uint32_t threshold)303 bool hal_opi_set_fifo_threshold(spi_bus_t bus, uint32_t threshold)
304 {
305 if (bus >= HAL_SPI_BUS_MAX_NUM) {
306 return false;
307 }
308
309 g_spi_base_addrs[bus]->spi_twlr = threshold;
310 g_spi_base_addrs[bus]->spi_rwlr = threshold;
311 return true;
312 }
313
hal_opi_reset_config(spi_bus_t bus)314 bool hal_opi_reset_config(spi_bus_t bus)
315 {
316 if (bus >= HAL_SPI_BUS_MAX_NUM) {
317 return false;
318 }
319
320 // reset register
321 g_spi_base_addrs[bus]->spi_ctra &= ~HAL_SPI_CTRLR0_REG_MAX;
322 g_spi_base_addrs[bus]->spi_enhctl &= ~HAL_QSPI_CTRLR0_REG_MAX;
323 return true;
324 }
325
hal_opi_set_frame_size(spi_bus_t bus,uint32_t frame_size)326 bool hal_opi_set_frame_size(spi_bus_t bus, uint32_t frame_size)
327 {
328 if (bus >= HAL_SPI_BUS_MAX_NUM) {
329 return false;
330 }
331
332 reg32_setbits(&g_spi_base_addrs[bus]->spi_ctra, HAL_SPI_DATA_FRAME_SIZE_BIT,
333 HAL_SPI_DATA_FRAME_SIZE_BITFILD, frame_size);
334
335 return true;
336 }
337
hal_opi_set_frame_format(spi_bus_t bus,hal_spi_frame_format_t frame_format)338 bool hal_opi_set_frame_format(spi_bus_t bus, hal_spi_frame_format_t frame_format)
339 {
340 if (bus >= HAL_SPI_BUS_MAX_NUM) {
341 return false;
342 }
343
344 switch (frame_format) {
345 case HAL_SPI_FRAME_FORMAT_STANDARD:
346 g_spi_base_addrs[bus]->spi_ctra |= (HAL_SPI_FRAME_FORMAT_STANDARD << HAL_SPI_FRAME_FORMAT_SHIFT);
347 g_spi_base_addrs[bus]->spi_rsvd = HAL_SPI_RSVD_NONE;
348 break;
349 case HAL_SPI_FRAME_FORMAT_QUAD:
350 g_spi_base_addrs[bus]->spi_ctra |= (HAL_SPI_FRAME_FORMAT_QUAD << HAL_SPI_FRAME_FORMAT_SHIFT);
351 g_spi_base_addrs[bus]->spi_enhctl |= (HAL_QSPI_CMD_LENTH_8 << HAL_QSPI_CMD_LENTH_SHIFT);
352 g_spi_base_addrs[bus]->spi_enhctl |= (HAL_QSPI_ADDR_LENTH_24 << HAL_QSPI_ADDR_LENTH_SHIFT);
353 g_spi_base_addrs[bus]->spi_enhctl |= (HAL_QSPI_TRANS_TYPES_CMD_S_ADDR_Q << HAL_QSPI_TRANS_TYPES_SHIFT);
354 g_spi_base_addrs[bus]->spi_rsvd = HAL_SPI_RSVD_NONE;
355 break;
356 #if (SPI_WITH_OPI == YES)
357 case HAL_SPI_FRAME_FORMAT_OCTAL:
358 g_spi_base_addrs[bus]->spi_ctra |= (HAL_SPI_FRAME_FORMAT_OCTAL << HAL_SPI_FRAME_FORMAT_SHIFT);
359 g_spi_base_addrs[bus]->spi_rsvd = HAL_SPI_RSVD_X8;
360 break;
361 case HAL_SPI_FRAME_FORMAT_DOUBLE_OCTAL:
362 g_spi_base_addrs[bus]->spi_ctra |= (HAL_SPI_FRAME_FORMAT_OCTAL << HAL_SPI_FRAME_FORMAT_SHIFT);
363 g_spi_base_addrs[bus]->spi_rsvd = HAL_SPI_RSVD_X8_X8;
364 break;
365 case HAL_SPI_FRAME_FORMAT_SIXT:
366 g_spi_base_addrs[bus]->spi_ctra |= (HAL_SPI_FRAME_FORMAT_OCTAL << HAL_SPI_FRAME_FORMAT_SHIFT);
367 g_spi_base_addrs[bus]->spi_rsvd = HAL_SPI_RSVD_X16;
368 break;
369 #endif
370 default:
371 return false;
372 }
373 return true;
374 }
375
hal_opi_set_trans_mode(spi_bus_t bus,uint32_t tmod)376 bool hal_opi_set_trans_mode(spi_bus_t bus, uint32_t tmod)
377 {
378 if (bus >= HAL_SPI_BUS_MAX_NUM) {
379 return false;
380 }
381
382 g_spi_base_addrs[bus]->spi_ctra &= ~(HAL_SPI_TRANS_MODE_MAX << HAL_SPI_TRANS_MODE_SHIFT);
383 g_spi_base_addrs[bus]->spi_ctra |= (tmod << HAL_SPI_TRANS_MODE_SHIFT);
384 return true;
385 }
386
hal_opi_set_freq(spi_bus_t bus,uint32_t clk_in_mhz)387 bool hal_opi_set_freq(spi_bus_t bus, uint32_t clk_in_mhz)
388 {
389 if (bus >= HAL_SPI_BUS_MAX_NUM) {
390 return false;
391 }
392
393 uint32_t clk_div;
394 uint32_t bus_clk;
395 #ifdef BUILD_APPLICATION_ATE
396 bus_clk = 0;
397 #else
398 bus_clk = (uint32_t)lpm_dev_get_freq(DEV_SPI);
399 #endif
400
401 clk_div = (uint32_t)(bus_clk / hal_spi_mhz_to_hz(clk_in_mhz));
402 if (clk_div < HAL_SPI_MINUMUM_CLK_DIV) {
403 clk_div = HAL_SPI_MINUMUM_CLK_DIV;
404 }
405
406 if (clk_div > HAL_SPI_MAXIMUM_CLK_DIV) {
407 clk_div = HAL_SPI_MAXIMUM_CLK_DIV;
408 }
409
410 g_spi_base_addrs[bus]->spi_brs &= ~HAL_SPI_CLK_DIV_REG_MAX;
411 #ifdef PRE_ASIC
412 g_spi_base_addrs[bus]->spi_brs |= clk_div;
413 #else
414 g_spi_base_addrs[bus]->spi_brs |= HAL_SPI_CLK_DIV_20;
415 UNUSED(clk_div);
416 #endif
417
418 #if (SPI_WITH_OPI == YES)
419 if (bus == OPI_BUS) {
420 g_spi_base_addrs[bus]->spi_brs = HAL_SPI_CLK_DIV_2;
421 }
422 #endif
423
424 #ifdef BUILD_APPLICATION_ATE
425 if (bus == SPI_BUS_3) {
426 g_spi_base_addrs[bus]->spi_brs = HAL_SPI_CLK_DIV_4;
427 }
428 #endif
429 return true;
430 }
431
hal_opi_set_inst_len(spi_bus_t bus,hal_spi_inst_len_t inst_len)432 void hal_opi_set_inst_len(spi_bus_t bus, hal_spi_inst_len_t inst_len)
433 {
434 g_spi_base_addrs[bus]->spi_enhctl &= (~(HAL_SPI_INST_LEN_MAX << HAL_SPI_INST_L_POSE));
435 g_spi_base_addrs[bus]->spi_enhctl |= ((uint32_t)inst_len << HAL_SPI_INST_L_POSE);
436 }
437
hal_opi_set_addr_len(spi_bus_t bus,hal_spi_addr_len_t addr_len)438 void hal_opi_set_addr_len(spi_bus_t bus, hal_spi_addr_len_t addr_len)
439 {
440 g_spi_base_addrs[bus]->spi_enhctl &= (~(0xf << HAL_SPI_ADDR_L_POSE));
441 g_spi_base_addrs[bus]->spi_enhctl |= ((uint32_t)addr_len << HAL_SPI_ADDR_L_POSE);
442 }
443
hal_opi_cmd_trans_mode(spi_bus_t bus,uint32_t mode)444 void hal_opi_cmd_trans_mode(spi_bus_t bus, uint32_t mode)
445 {
446 g_spi_base_addrs[bus]->spi_enhctl &= (~0x3);
447 g_spi_base_addrs[bus]->spi_enhctl |= (uint32_t)mode;
448 }
449
hal_opi_set_received_data_num(spi_bus_t bus,uint32_t number)450 bool hal_opi_set_received_data_num(spi_bus_t bus, uint32_t number)
451 {
452 if (bus >= HAL_SPI_BUS_MAX_NUM) {
453 return false;
454 }
455 number--;
456 g_spi_base_addrs[bus]->spi_ctrb &= ~HAL_SPI_RECEIVED_DATA_REG_MAX;
457 g_spi_base_addrs[bus]->spi_ctrb = number;
458 return true;
459 }
460
hal_opi_set_tx_fifo_threshold(spi_bus_t bus,uint32_t threshold)461 bool hal_opi_set_tx_fifo_threshold(spi_bus_t bus, uint32_t threshold)
462 {
463 if (bus >= HAL_SPI_BUS_MAX_NUM) {
464 return false;
465 }
466 g_spi_base_addrs[bus]->spi_twlr = threshold;
467 return true;
468 }
469
hal_opi_ddr_en(spi_bus_t bus,bool on)470 void hal_opi_ddr_en(spi_bus_t bus, bool on)
471 {
472 if (on) {
473 g_spi_base_addrs[bus]->spi_enhctl |= (HAL_SPI_DDR_EN | HAL_SPI_RXDS_EN | HAL_SPI_INST_DDR_EN);
474 } else {
475 g_spi_base_addrs[bus]->spi_enhctl &= (~(HAL_SPI_DDR_EN | HAL_SPI_RXDS_EN | HAL_SPI_INST_DDR_EN));
476 }
477 }
478
hal_qspi_set_wait_cycles(spi_bus_t bus,uint32_t wait_cyc)479 bool hal_qspi_set_wait_cycles(spi_bus_t bus, uint32_t wait_cyc)
480 {
481 if (bus >= HAL_SPI_BUS_MAX_NUM) {
482 return false;
483 }
484 g_spi_base_addrs[bus]->spi_enhctl &= ~(HAL_QSPI_WAIT_CYCLE_MAX << HAL_QSPI_WAIT_CYCLE_SHIFT);
485 g_spi_base_addrs[bus]->spi_enhctl |= (wait_cyc << HAL_QSPI_WAIT_CYCLE_SHIFT);
486 return true;
487 }
488
hal_opi_set_trans_type(spi_bus_t bus,hal_spi_trans_type_t trans_type)489 bool hal_opi_set_trans_type(spi_bus_t bus, hal_spi_trans_type_t trans_type)
490 {
491 if (bus >= HAL_SPI_BUS_MAX_NUM) {
492 return false;
493 }
494
495 g_spi_base_addrs[bus]->spi_enhctl &= (~0x3);
496 g_spi_base_addrs[bus]->spi_enhctl |= (uint32_t)trans_type;
497 return true;
498 }
499
hal_opi_disable_slave(spi_bus_t bus)500 void hal_opi_disable_slave(spi_bus_t bus)
501 {
502 // Disable all slave
503 g_spi_base_addrs[bus]->spi_slenr &= ~HAL_SPI_SLAVE_ENABLE_REG_MAX;
504 }
505
hal_opi_read_data(spi_bus_t bus)506 uint32_t hal_opi_read_data(spi_bus_t bus)
507 {
508 if (bus >= HAL_SPI_BUS_MAX_NUM) {
509 return false;
510 }
511 return (g_spi_base_addrs[bus]->spi_drnm[0]);
512 }
513
hal_opi_write_data(spi_bus_t bus,uint32_t data)514 bool hal_opi_write_data(spi_bus_t bus, uint32_t data)
515 {
516 if (bus >= HAL_SPI_BUS_MAX_NUM) {
517 return false;
518 }
519 g_spi_base_addrs[bus]->spi_drnm[0] = data;
520 return true;
521 }
522
hal_opi_select_slave(spi_bus_t bus,uint32_t slave_num)523 bool hal_opi_select_slave(spi_bus_t bus, uint32_t slave_num)
524 {
525 if (bus >= HAL_SPI_BUS_MAX_NUM) {
526 return false;
527 }
528
529 // Disable all slave
530 g_spi_base_addrs[bus]->spi_slenr &= ~HAL_SPI_SLAVE_ENABLE_REG_MAX;
531 g_spi_base_addrs[bus]->spi_slenr = BIT(slave_num);
532
533 return true;
534 }
535
hal_opi_disable(spi_bus_t bus)536 bool hal_opi_disable(spi_bus_t bus)
537 {
538 if (bus >= HAL_SPI_BUS_MAX_NUM) {
539 return false;
540 }
541 g_spi_base_addrs[bus]->spi_er &= ~HAL_SPI_ENABLE;
542 return true;
543 }
544
545
hal_opi_enable(spi_bus_t bus)546 bool hal_opi_enable(spi_bus_t bus)
547 {
548 if (bus >= HAL_SPI_BUS_MAX_NUM) {
549 return false;
550 }
551
552 g_spi_base_addrs[bus]->spi_ctra &= ~HAL_SPI_CE_LIN_TOGGLE_ENABLE;
553 g_spi_base_addrs[bus]->spi_er |= HAL_SPI_ENABLE;
554 return true;
555 }
556
hal_opi_tx_fifo_is_not_full(spi_bus_t bus)557 bool hal_opi_tx_fifo_is_not_full(spi_bus_t bus)
558 {
559 if (bus >= HAL_SPI_BUS_MAX_NUM) {
560 return false;
561 }
562 return (bool)hal_spi_v151_spi_wsr_get_tfnf(bus);
563 }
564
hal_opi_tx_fifo_is_empty(spi_bus_t bus)565 bool hal_opi_tx_fifo_is_empty(spi_bus_t bus)
566 {
567 if (bus >= HAL_SPI_BUS_MAX_NUM) {
568 return false;
569 }
570 return (g_spi_base_addrs[bus]->spi_wsr & HAL_SPI_TX_FIFO_EMPTY_FLAG);
571 }
572
hal_opi_rx_fifo_is_full(spi_bus_t bus)573 bool hal_opi_rx_fifo_is_full(spi_bus_t bus)
574 {
575 if (bus >= HAL_SPI_BUS_MAX_NUM) {
576 return false;
577 }
578 return (g_spi_base_addrs[bus]->spi_wsr & HAL_SPI_RX_FIFO_FULL_FLAG);
579 }
580
hal_opi_rx_fifo_is_not_empty(spi_bus_t bus)581 bool hal_opi_rx_fifo_is_not_empty(spi_bus_t bus)
582 {
583 if (bus >= HAL_SPI_BUS_MAX_NUM) {
584 return false;
585 }
586 return (g_spi_base_addrs[bus]->spi_wsr & HAL_SPI_RX_FIFO_NOT_EMPTY_FLAG);
587 }
588
hal_opi_is_busy(spi_bus_t bus)589 bool hal_opi_is_busy(spi_bus_t bus)
590 {
591 if (bus >= HAL_SPI_BUS_MAX_NUM) {
592 return false;
593 }
594 return (g_spi_base_addrs[bus]->spi_wsr & HAL_SPI_BUSY_FLAG);
595 }
596
hal_opi_set_rx_sample_dly(spi_bus_t bus,uint8_t delay)597 bool hal_opi_set_rx_sample_dly(spi_bus_t bus, uint8_t delay)
598 {
599 if (bus >= HAL_SPI_BUS_MAX_NUM) {
600 return false;
601 }
602
603 g_spi_base_addrs[bus]->spi_rsdr &= ~(HAL_SPI_RX_SAMPLE_DLY_MAX << HAL_SPI_RX_SAMPLE_DLY_SHIFT);
604 g_spi_base_addrs[bus]->spi_rsdr |= (delay << HAL_SPI_RX_SAMPLE_DLY_SHIFT);
605 return true;
606 }
607
hal_opi_set_dma_rx_data_level(spi_bus_t bus,uint32_t data_level)608 bool hal_opi_set_dma_rx_data_level(spi_bus_t bus, uint32_t data_level)
609 {
610 if (bus >= HAL_SPI_BUS_MAX_NUM) {
611 return false;
612 }
613
614 g_spi_base_addrs[bus]->spi_drdl = data_level;
615 return true;
616 }
617
hal_opi_dma_control(spi_bus_t bus,hal_spi_dma_control_t operation)618 bool hal_opi_dma_control(spi_bus_t bus, hal_spi_dma_control_t operation)
619 {
620 if (bus >= HAL_SPI_BUS_MAX_NUM) {
621 return false;
622 }
623
624 if (operation >= HAL_SPI_DMA_CONTROL_MAX_NUM) {
625 return false;
626 }
627
628 g_spi_base_addrs[bus]->spi_dcr = (uint32_t)operation;
629 return true;
630 }
631
spi_porting_lock(spi_bus_t bus)632 uint32_t spi_porting_lock(spi_bus_t bus)
633 {
634 unused(bus);
635 return osal_irq_lock();
636 }
637
spi_porting_unlock(spi_bus_t bus,uint32_t irq_sts)638 void spi_porting_unlock(spi_bus_t bus, uint32_t irq_sts)
639 {
640 unused(bus);
641 osal_irq_restore(irq_sts);
642 }
643
spi_port_get_dma_trans_dest_handshaking(spi_bus_t bus)644 uint8_t spi_port_get_dma_trans_dest_handshaking(spi_bus_t bus)
645 {
646 switch (bus) {
647 case SPI_BUS_0:
648 return (uint8_t)DMA_HANDSHAKE_SPI_BUS_0_TX;
649 case SPI_BUS_1:
650 return (uint8_t)DMA_HANDSHAKE_SPI_BUS_1_TX;
651 default:
652 return (uint8_t)HAL_DMA_HANDSHAKING_MAX_NUM;
653 }
654 }
655
spi_port_get_dma_trans_src_handshaking(spi_bus_t bus)656 uint8_t spi_port_get_dma_trans_src_handshaking(spi_bus_t bus)
657 {
658 switch (bus) {
659 case SPI_BUS_0:
660 return (uint8_t)DMA_HANDSHAKE_SPI_BUS_0_RX;
661 case SPI_BUS_1:
662 return (uint8_t)DMA_HANDSHAKE_SPI_BUS_1_RX;
663 default:
664 return (uint8_t)HAL_DMA_HANDSHAKING_MAX_NUM;
665 }
666 }
667
spi_port_tx_data_level_get(spi_bus_t bus)668 uint8_t spi_port_tx_data_level_get(spi_bus_t bus)
669 {
670 switch (bus) {
671 case SPI_BUS_0:
672 case SPI_BUS_1:
673 return (uint8_t)SPI_DMA_TX_DATA_LEVEL_4;
674 default:
675 return 0;
676 }
677 }
678
spi_port_rx_data_level_get(spi_bus_t bus)679 uint8_t spi_port_rx_data_level_get(spi_bus_t bus)
680 {
681 unused(bus);
682 return 0;
683 }
684
spi_porting_clock_init(uint32_t bus_clk)685 void spi_porting_clock_init(uint32_t bus_clk)
686 {
687 uint8_t div = PLL_CLK480M / (bus_clk / 1000000); // 1000000: div 1M,covert hz to mhz
688 reg_clrbit(CLDO_CRG_DIV_CTL3, 0, POS_10);
689 reg32_setbits(CLDO_CRG_DIV_CTL3, POS_5, SPI_DIV_LEN, div);
690 reg32_setbits(CLDO_CRG_DIV_CTL3, POS_0, SPI_DIV_LEN, 1);
691 reg_setbit(CLDO_CRG_DIV_CTL3, 0, POS_10);
692
693 reg_clrbit(CLDO_SUB_CRG_CKEN_CTL1, 0, POS_25); // close spi clock
694 reg_setbit(CLDO_CRG_CLK_SEL, 0, POS_6); // switch spi clock to pll
695 reg_setbit(CLDO_SUB_CRG_CKEN_CTL1, 0, POS_25); // open spi clock
696 }
697