• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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