1 /*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /**
8 * @brief File containing QSPI device interface specific definitions for the
9 * Zephyr OS layer of the Wi-Fi driver.
10 */
11
12 #include <errno.h>
13 #include <string.h>
14
15 #include <zephyr/init.h>
16 #include <zephyr/logging/log.h>
17 #include <zephyr/drivers/pinctrl.h>
18 #include <zephyr/drivers/wifi/nrf_wifi/bus/qspi_if.h>
19
20 #include <soc.h>
21 #include <nrf_erratas.h>
22 #include <nrfx_qspi.h>
23 #include <hal/nrf_clock.h>
24 #include <hal/nrf_gpio.h>
25
26 #include "spi_nor.h"
27 #include "osal_api.h"
28
29 /* The QSPI bus node which the NRF70 is on */
30 #define QSPI_IF_BUS_NODE DT_NODELABEL(qspi)
31
32 /* QSPI bus properties from the devicetree */
33 #define QSPI_IF_BUS_IRQN DT_IRQN(QSPI_IF_BUS_NODE)
34 #define QSPI_IF_BUS_IRQ_PRIO DT_IRQ(QSPI_IF_BUS_NODE, priority)
35 #define QSPI_IF_BUS_SCK_PIN DT_PROP(QSPI_IF_BUS_NODE, sck_pin)
36 #define QSPI_IF_BUS_CSN_PIN DT_PROP(QSPI_IF_BUS_NODE, csn_pins)
37 #define QSPI_IF_BUS_IO0_PIN DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 0)
38 #define QSPI_IF_BUS_IO1_PIN DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 1)
39 #define QSPI_IF_BUS_IO2_PIN DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 2)
40 #define QSPI_IF_BUS_IO3_PIN DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 3)
41
42 #define QSPI_IF_BUS_HAS_4_IO_PINS \
43 (DT_PROP_LEN(QSPI_IF_BUS_NODE, io_pins) == 4)
44
45 #define QSPI_IF_BUS_PINCTRL_DT_DEV_CONFIG_GET \
46 PINCTRL_DT_DEV_CONFIG_GET(QSPI_IF_BUS_NODE)
47
48 /* The NRF70 device node which is on the QSPI bus */
49 #define QSPI_IF_DEVICE_NODE DT_NODELABEL(nrf70)
50
51 /* NRF70 device QSPI properties */
52 #define QSPI_IF_DEVICE_FREQUENCY DT_PROP(QSPI_IF_DEVICE_NODE, qspi_frequency)
53 #define QSPI_IF_DEVICE_CPHA DT_PROP(QSPI_IF_DEVICE_NODE, qspi_cpha)
54 #define QSPI_IF_DEVICE_CPOL DT_PROP(QSPI_IF_DEVICE_NODE, qspi_cpol)
55 #define QSPI_IF_DEVICE_QUAD_MODE DT_PROP(QSPI_IF_DEVICE_NODE, qspi_quad_mode)
56 #define QSPI_IF_DEVICE_RX_DELAY DT_PROP(QSPI_IF_DEVICE_NODE, qspi_rx_delay)
57
58 static struct qspi_config *qspi_cfg;
59 #if NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC
60 static unsigned int nonce_last_addr;
61 static unsigned int nonce_cnt;
62 #endif /*NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC*/
63
64 /* Main config structure */
65 static nrfx_qspi_config_t QSPIconfig;
66
67 /*
68 * According to the respective specifications, the nRF52 QSPI supports clock
69 * frequencies 2 - 32 MHz and the nRF53 one supports 6 - 96 MHz.
70 */
71 BUILD_ASSERT(QSPI_IF_DEVICE_FREQUENCY >= (NRF_QSPI_BASE_CLOCK_FREQ / 16),
72 "Unsupported SCK frequency.");
73
74 /*
75 * Determine a configuration value (INST_0_SCK_CFG) and, if needed, a divider
76 * (BASE_CLOCK_DIV) for the clock from which the SCK frequency is derived that
77 * need to be used to achieve the SCK frequency as close as possible (but not
78 * higher) to the one specified in DT.
79 */
80 #if defined(CONFIG_SOC_SERIES_NRF53X)
81 /*
82 * On nRF53 Series SoCs, the default /4 divider for the HFCLK192M clock can
83 * only be used when the QSPI peripheral is idle. When a QSPI operation is
84 * performed, the divider needs to be changed to /1 or /2 (particularly,
85 * the specification says that the peripheral "supports 192 MHz and 96 MHz
86 * PCLK192M frequency"), but after that operation is complete, the default
87 * divider needs to be restored to avoid increased current consumption.
88 */
89 #if (QSPI_IF_DEVICE_FREQUENCY >= NRF_QSPI_BASE_CLOCK_FREQ)
90 /* For requested SCK >= 96 MHz, use HFCLK192M / 1 / (2*1) = 96 MHz */
91 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_1
92 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV1
93 /* If anomaly 159 is to be prevented, only /1 divider can be used. */
94 #elif NRF53_ERRATA_159_ENABLE_WORKAROUND
95 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_1
96 #define INST_0_SCK_CFG (DIV_ROUND_UP(NRF_QSPI_BASE_CLOCK_FREQ, \
97 QSPI_IF_DEVICE_FREQUENCY) - 1)
98 #elif (QSPI_IF_DEVICE_FREQUENCY >= (NRF_QSPI_BASE_CLOCK_FREQ / 2))
99 /* For 96 MHz > SCK >= 48 MHz, use HFCLK192M / 2 / (2*1) = 48 MHz */
100 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_2
101 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV1
102 #elif (QSPI_IF_DEVICE_FREQUENCY >= (NRF_QSPI_BASE_CLOCK_FREQ / 3))
103 /* For 48 MHz > SCK >= 32 MHz, use HFCLK192M / 1 / (2*3) = 32 MHz */
104 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_1
105 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV3
106 #else
107 /* For requested SCK < 32 MHz, use divider /2 for HFCLK192M. */
108 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_2
109 #define INST_0_SCK_CFG (DIV_ROUND_UP(NRF_QSPI_BASE_CLOCK_FREQ / 2, \
110 QSPI_IF_DEVICE_FREQUENCY) - 1)
111 #endif
112
113 #if BASE_CLOCK_DIV == NRF_CLOCK_HFCLK_DIV_1
114 /* For 8 MHz, use HFCLK192M / 1 / (2*12) */
115 #define INST_0_SCK_CFG_WAKE NRF_QSPI_FREQ_DIV12
116 #elif BASE_CLOCK_DIV == NRF_CLOCK_HFCLK_DIV_2
117 /* For 8 MHz, use HFCLK192M / 2 / (2*6) */
118 #define INST_0_SCK_CFG_WAKE NRF_QSPI_FREQ_DIV6
119 #else
120 #error "Unsupported base clock divider for wake-up frequency."
121 #endif
122
123 /* After the base clock divider is changed, some time is needed for the new
124 * setting to take effect. This value specifies the delay (in microseconds)
125 * to be applied to ensure that the clock is ready when the QSPI operation
126 * starts. It was measured with a logic analyzer (unfortunately, the nRF5340
127 * specification does not provide any numbers in this regard).
128 */
129 /* FIXME: This has adverse impact on performance, ~3Mbps, so, for now, it is
130 * disabled till further investigation.
131 */
132 #define BASE_CLOCK_SWITCH_DELAY_US 0
133
134 #else
135 /*
136 * On nRF52 Series SoCs, the base clock divider is not configurable,
137 * so BASE_CLOCK_DIV is not defined.
138 */
139 #if (QSPI_IF_DEVICE_FREQUENCY >= NRF_QSPI_BASE_CLOCK_FREQ)
140 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV1
141 #else
142 #define INST_0_SCK_CFG (DIV_ROUND_UP(NRF_QSPI_BASE_CLOCK_FREQ, \
143 QSPI_IF_DEVICE_FREQUENCY) - 1)
144 #endif
145
146 /* For 8 MHz, use PCLK32M / 4 */
147 #define INST_0_SCK_CFG_WAKE NRF_QSPI_FREQ_DIV4
148
149 #endif /* defined(CONFIG_SOC_SERIES_NRF53X) */
150
151 static int qspi_device_init(const struct device *dev);
152 static void qspi_device_uninit(const struct device *dev);
153
154 #define WORD_SIZE 4
155
156 LOG_MODULE_DECLARE(wifi_nrf_bus, CONFIG_WIFI_NRF70_BUSLIB_LOG_LEVEL);
157
158 /**
159 * @brief QSPI buffer structure
160 * Structure used both for TX and RX purposes.
161 *
162 * @param buf is a valid pointer to a data buffer.
163 * Can not be NULL.
164 * @param len is the length of the data to be handled.
165 * If no data to transmit/receive - pass 0.
166 */
167 struct qspi_buf {
168 uint8_t *buf;
169 size_t len;
170 };
171
172 /**
173 * @brief QSPI command structure
174 * Structure used for custom command usage.
175 *
176 * @param op_code is a command value (i.e 0x9F - get Jedec ID)
177 * @param tx_buf structure used for TX purposes. Can be NULL if not used.
178 * @param rx_buf structure used for RX purposes. Can be NULL if not used.
179 */
180 struct qspi_cmd {
181 uint8_t op_code;
182 const struct qspi_buf *tx_buf;
183 const struct qspi_buf *rx_buf;
184 };
185
186 /**
187 * @brief Structure for defining the QSPI NOR access
188 */
189 struct qspi_nor_data {
190 #ifdef CONFIG_MULTITHREADING
191 /* The semaphore to control exclusive access on write/erase. */
192 struct k_sem trans;
193 /* The semaphore to control exclusive access to the device. */
194 struct k_sem sem;
195 /* The semaphore to indicate that transfer has completed. */
196 struct k_sem sync;
197 /* The semaphore to control driver init/uninit. */
198 struct k_sem count;
199 #else /* CONFIG_MULTITHREADING */
200 /* A flag that signals completed transfer when threads are
201 * not enabled.
202 */
203 volatile bool ready;
204 #endif /* CONFIG_MULTITHREADING */
205 };
206
qspi_get_mode(bool cpol,bool cpha)207 static inline int qspi_get_mode(bool cpol, bool cpha)
208 {
209 register int ret = -EINVAL;
210
211 if ((!cpol) && (!cpha)) {
212 ret = 0;
213 } else if (cpol && cpha) {
214 ret = 1;
215 }
216
217 __ASSERT(ret != -EINVAL, "Invalid QSPI mode");
218
219 return ret;
220 }
221
qspi_write_is_quad(nrf_qspi_writeoc_t lines)222 static inline bool qspi_write_is_quad(nrf_qspi_writeoc_t lines)
223 {
224 switch (lines) {
225 case NRF_QSPI_WRITEOC_PP4IO:
226 case NRF_QSPI_WRITEOC_PP4O:
227 return true;
228 default:
229 return false;
230 }
231 }
232
qspi_read_is_quad(nrf_qspi_readoc_t lines)233 static inline bool qspi_read_is_quad(nrf_qspi_readoc_t lines)
234 {
235 switch (lines) {
236 case NRF_QSPI_READOC_READ4IO:
237 case NRF_QSPI_READOC_READ4O:
238 return true;
239 default:
240 return false;
241 }
242 }
243
qspi_get_lines_write(uint8_t lines)244 static inline int qspi_get_lines_write(uint8_t lines)
245 {
246 register int ret = -EINVAL;
247
248 switch (lines) {
249 case 3:
250 ret = NRF_QSPI_WRITEOC_PP4IO;
251 break;
252 case 2:
253 ret = NRF_QSPI_WRITEOC_PP4O;
254 break;
255 case 1:
256 ret = NRF_QSPI_WRITEOC_PP2O;
257 break;
258 case 0:
259 ret = NRF_QSPI_WRITEOC_PP;
260 break;
261 default:
262 break;
263 }
264
265 __ASSERT(ret != -EINVAL, "Invalid QSPI write line");
266
267 return ret;
268 }
269
qspi_get_lines_read(uint8_t lines)270 static inline int qspi_get_lines_read(uint8_t lines)
271 {
272 register int ret = -EINVAL;
273
274 switch (lines) {
275 case 4:
276 ret = NRF_QSPI_READOC_READ4IO;
277 break;
278 case 3:
279 ret = NRF_QSPI_READOC_READ4O;
280 break;
281 case 2:
282 ret = NRF_QSPI_READOC_READ2IO;
283 break;
284 case 1:
285 ret = NRF_QSPI_READOC_READ2O;
286 break;
287 case 0:
288 ret = NRF_QSPI_READOC_FASTREAD;
289 break;
290 default:
291 break;
292 }
293
294 __ASSERT(ret != -EINVAL, "Invalid QSPI read line");
295
296 return ret;
297 }
298
_nrfx_qspi_read(void * p_rx_buffer,size_t rx_buffer_length,uint32_t src_address)299 nrfx_err_t _nrfx_qspi_read(void *p_rx_buffer, size_t rx_buffer_length, uint32_t src_address)
300 {
301 return nrfx_qspi_read(p_rx_buffer, rx_buffer_length, src_address);
302 }
303
_nrfx_qspi_write(void const * p_tx_buffer,size_t tx_buffer_length,uint32_t dst_address)304 nrfx_err_t _nrfx_qspi_write(void const *p_tx_buffer, size_t tx_buffer_length, uint32_t dst_address)
305 {
306 return nrfx_qspi_write(p_tx_buffer, tx_buffer_length, dst_address);
307 }
308
_nrfx_qspi_init(nrfx_qspi_config_t const * p_config,nrfx_qspi_handler_t handler,void * p_context)309 nrfx_err_t _nrfx_qspi_init(nrfx_qspi_config_t const *p_config, nrfx_qspi_handler_t handler,
310 void *p_context)
311 {
312 NRF_QSPI_Type *p_reg = NRF_QSPI;
313
314 nrfx_qspi_init(p_config, handler, p_context);
315
316 /* RDC4IO = 4'hA (register IFTIMING), which means 10 Dummy Cycles for READ4. */
317 p_reg->IFTIMING |= qspi_cfg->RDC4IO;
318
319 /* LOG_DBG("%04x : IFTIMING", p_reg->IFTIMING & qspi_cfg->RDC4IO); */
320
321 /* ACTIVATE task fails for slave bitfile so ignore it */
322 return NRFX_SUCCESS;
323 }
324
325
326 /**
327 * @brief Main configuration structure
328 */
329 static struct qspi_nor_data qspi_nor_memory_data = {
330 #ifdef CONFIG_MULTITHREADING
331 .trans = Z_SEM_INITIALIZER(qspi_nor_memory_data.trans, 1, 1),
332 .sem = Z_SEM_INITIALIZER(qspi_nor_memory_data.sem, 1, 1),
333 .sync = Z_SEM_INITIALIZER(qspi_nor_memory_data.sync, 0, 1),
334 .count = Z_SEM_INITIALIZER(qspi_nor_memory_data.count, 0, K_SEM_MAX_LIMIT),
335 #endif /* CONFIG_MULTITHREADING */
336 };
337
338 NRF_DT_CHECK_NODE_HAS_PINCTRL_SLEEP(QSPI_IF_BUS_NODE);
339
340 IF_ENABLED(CONFIG_PINCTRL, (PINCTRL_DT_DEFINE(QSPI_IF_BUS_NODE)));
341
342 /**
343 * @brief Converts NRFX return codes to the zephyr ones
344 */
qspi_get_zephyr_ret_code(nrfx_err_t res)345 static inline int qspi_get_zephyr_ret_code(nrfx_err_t res)
346 {
347 switch (res) {
348 case NRFX_SUCCESS:
349 return 0;
350 case NRFX_ERROR_INVALID_PARAM:
351 case NRFX_ERROR_INVALID_ADDR:
352 return -EINVAL;
353 case NRFX_ERROR_INVALID_STATE:
354 return -ECANCELED;
355 #if NRF53_ERRATA_159_ENABLE_WORKAROUND
356 case NRFX_ERROR_FORBIDDEN:
357 LOG_ERR("nRF5340 anomaly 159 conditions detected");
358 LOG_ERR("Set the CPU clock to 64 MHz before starting QSPI operation");
359 return -ECANCELED;
360 #endif
361 case NRFX_ERROR_BUSY:
362 case NRFX_ERROR_TIMEOUT:
363 default:
364 return -EBUSY;
365 }
366 }
367
get_dev_data(const struct device * dev)368 static inline struct qspi_nor_data *get_dev_data(const struct device *dev)
369 {
370 return dev->data;
371 }
372
qspi_lock(const struct device * dev)373 static inline void qspi_lock(const struct device *dev)
374 {
375 #ifdef CONFIG_MULTITHREADING
376 struct qspi_nor_data *dev_data = get_dev_data(dev);
377
378 k_sem_take(&dev_data->sem, K_FOREVER);
379 #else /* CONFIG_MULTITHREADING */
380 ARG_UNUSED(dev);
381 #endif /* CONFIG_MULTITHREADING */
382
383 /*
384 * Change the base clock divider only for the time the driver is locked
385 * to perform a QSPI operation, otherwise the power consumption would be
386 * increased also when the QSPI peripheral is idle.
387 */
388 #if defined(CONFIG_SOC_SERIES_NRF53X)
389 nrf_clock_hfclk192m_div_set(NRF_CLOCK, BASE_CLOCK_DIV);
390 k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
391 #endif
392 }
393
qspi_unlock(const struct device * dev)394 static inline void qspi_unlock(const struct device *dev)
395 {
396 #if defined(CONFIG_SOC_SERIES_NRF53X)
397 /* Restore the default base clock divider to reduce power consumption.
398 */
399 nrf_clock_hfclk192m_div_set(NRF_CLOCK, NRF_CLOCK_HFCLK_DIV_4);
400 k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
401 #endif
402
403 #ifdef CONFIG_MULTITHREADING
404 struct qspi_nor_data *dev_data = get_dev_data(dev);
405
406 k_sem_give(&dev_data->sem);
407 #else /* CONFIG_MULTITHREADING */
408 ARG_UNUSED(dev);
409 #endif /* CONFIG_MULTITHREADING */
410 }
411
qspi_trans_lock(const struct device * dev)412 static inline void qspi_trans_lock(const struct device *dev)
413 {
414 #ifdef CONFIG_MULTITHREADING
415 struct qspi_nor_data *dev_data = get_dev_data(dev);
416
417 k_sem_take(&dev_data->trans, K_FOREVER);
418 #else /* CONFIG_MULTITHREADING */
419 ARG_UNUSED(dev);
420 #endif /* CONFIG_MULTITHREADING */
421 }
422
qspi_trans_unlock(const struct device * dev)423 static inline void qspi_trans_unlock(const struct device *dev)
424 {
425 #ifdef CONFIG_MULTITHREADING
426 struct qspi_nor_data *dev_data = get_dev_data(dev);
427
428 k_sem_give(&dev_data->trans);
429 #else /* CONFIG_MULTITHREADING */
430 ARG_UNUSED(dev);
431 #endif /* CONFIG_MULTITHREADING */
432 }
433
qspi_wait_for_completion(const struct device * dev,nrfx_err_t res)434 static inline void qspi_wait_for_completion(const struct device *dev, nrfx_err_t res)
435 {
436 struct qspi_nor_data *dev_data = get_dev_data(dev);
437
438 if (res == NRFX_SUCCESS) {
439 #ifdef CONFIG_MULTITHREADING
440 k_sem_take(&dev_data->sync, K_FOREVER);
441 #else /* CONFIG_MULTITHREADING */
442 unsigned int key = irq_lock();
443
444 while (!dev_data->ready) {
445 k_cpu_atomic_idle(key);
446 key = irq_lock();
447 }
448
449 dev_data->ready = false;
450 irq_unlock(key);
451 #endif /* CONFIG_MULTITHREADING */
452 }
453 }
454
qspi_complete(struct qspi_nor_data * dev_data)455 static inline void qspi_complete(struct qspi_nor_data *dev_data)
456 {
457 #ifdef CONFIG_MULTITHREADING
458 k_sem_give(&dev_data->sync);
459 #else /* CONFIG_MULTITHREADING */
460 dev_data->ready = true;
461 #endif /* CONFIG_MULTITHREADING */
462 }
463
_qspi_complete(struct qspi_nor_data * dev_data)464 static inline void _qspi_complete(struct qspi_nor_data *dev_data)
465 {
466 if (!qspi_cfg->easydma) {
467 return;
468 }
469
470 qspi_complete(dev_data);
471 }
_qspi_wait_for_completion(const struct device * dev,nrfx_err_t res)472 static inline void _qspi_wait_for_completion(const struct device *dev, nrfx_err_t res)
473 {
474 if (!qspi_cfg->easydma) {
475 return;
476 }
477
478 qspi_wait_for_completion(dev, res);
479 }
480
481 /**
482 * @brief QSPI handler
483 *
484 * @param event Driver event type
485 * @param p_context Pointer to context. Use in interrupt handler.
486 * @retval None
487 */
qspi_handler(nrfx_qspi_evt_t event,void * p_context)488 static void qspi_handler(nrfx_qspi_evt_t event, void *p_context)
489 {
490 struct qspi_nor_data *dev_data = p_context;
491
492 if (event == NRFX_QSPI_EVENT_DONE) {
493 _qspi_complete(dev_data);
494 }
495 }
496
497 static bool qspi_initialized;
498
qspi_device_init(const struct device * dev)499 static int qspi_device_init(const struct device *dev)
500 {
501 struct qspi_nor_data *dev_data = get_dev_data(dev);
502 nrfx_err_t res;
503 int ret = 0;
504
505 if (!IS_ENABLED(CONFIG_NRF70_QSPI_LOW_POWER)) {
506 return 0;
507 }
508
509 qspi_lock(dev);
510
511 /* In multithreading, driver can call qspi_device_init more than once
512 * before calling qspi_device_uninit. Keepping count, so QSPI is
513 * uninitialized only at the last call (count == 0).
514 */
515 #ifdef CONFIG_MULTITHREADING
516 k_sem_give(&dev_data->count);
517 #endif
518
519 if (!qspi_initialized) {
520 res = nrfx_qspi_init(&QSPIconfig, qspi_handler, dev_data);
521 ret = qspi_get_zephyr_ret_code(res);
522 NRF_QSPI->IFTIMING |= qspi_cfg->RDC4IO;
523 qspi_initialized = (ret == 0);
524 }
525
526 qspi_unlock(dev);
527
528 return ret;
529 }
530
qspi_device_uninit(const struct device * dev)531 static void qspi_device_uninit(const struct device *dev)
532 {
533 bool last = true;
534
535 if (!IS_ENABLED(CONFIG_NRF70_QSPI_LOW_POWER)) {
536 return;
537 }
538
539 qspi_lock(dev);
540
541 #ifdef CONFIG_MULTITHREADING
542 struct qspi_nor_data *dev_data = get_dev_data(dev);
543
544 /* The last thread to finish using the driver uninit the QSPI */
545 (void)k_sem_take(&dev_data->count, K_NO_WAIT);
546 last = (k_sem_count_get(&dev_data->count) == 0);
547 #endif
548
549 if (last) {
550 while (nrfx_qspi_mem_busy_check() != NRFX_SUCCESS) {
551 if (IS_ENABLED(CONFIG_MULTITHREADING)) {
552 k_msleep(50);
553 } else {
554 k_busy_wait(50000);
555 }
556 }
557
558 nrfx_qspi_uninit();
559
560 #ifndef CONFIG_PINCTRL
561 nrf_gpio_cfg_output(QSPI_PROP_AT(csn_pins, 0));
562 nrf_gpio_pin_set(QSPI_PROP_AT(csn_pins, 0));
563 #endif
564
565 qspi_initialized = false;
566 }
567
568 qspi_unlock(dev);
569 }
570
571 /* QSPI send custom command.
572 *
573 * If this is used for both send and receive the buffer sizes must be
574 * equal and cover the whole transaction.
575 */
qspi_send_cmd(const struct device * dev,const struct qspi_cmd * cmd,bool wren)576 static int qspi_send_cmd(const struct device *dev, const struct qspi_cmd *cmd, bool wren)
577 {
578 /* Check input parameters */
579 if (!cmd) {
580 return -EINVAL;
581 }
582
583 const void *tx_buf = NULL;
584 size_t tx_len = 0;
585 void *rx_buf = NULL;
586 size_t rx_len = 0;
587 size_t xfer_len = sizeof(cmd->op_code);
588
589 if (cmd->tx_buf) {
590 tx_buf = cmd->tx_buf->buf;
591 tx_len = cmd->tx_buf->len;
592 }
593
594 if (cmd->rx_buf) {
595 rx_buf = cmd->rx_buf->buf;
596 rx_len = cmd->rx_buf->len;
597 }
598
599 if ((rx_len != 0) && (tx_len != 0)) {
600 if (rx_len != tx_len) {
601 return -EINVAL;
602 }
603
604 xfer_len += tx_len;
605 } else {
606 /* At least one of these is zero. */
607 xfer_len += tx_len + rx_len;
608 }
609
610 if (xfer_len > NRF_QSPI_CINSTR_LEN_9B) {
611 LOG_WRN("cinstr %02x transfer too long: %zu", cmd->op_code, xfer_len);
612
613 return -EINVAL;
614 }
615
616 nrf_qspi_cinstr_conf_t cinstr_cfg = {
617 .opcode = cmd->op_code,
618 .length = xfer_len,
619 .io2_level = true,
620 .io3_level = true,
621 .wipwait = false,
622 .wren = wren,
623 };
624
625 qspi_lock(dev);
626
627 int res = nrfx_qspi_cinstr_xfer(&cinstr_cfg, tx_buf, rx_buf);
628
629 qspi_unlock(dev);
630 return qspi_get_zephyr_ret_code(res);
631 }
632
633 /* RDSR wrapper. Negative value is error. */
qspi_rdsr(const struct device * dev)634 static int qspi_rdsr(const struct device *dev)
635 {
636 uint8_t sr = -1;
637 const struct qspi_buf sr_buf = {
638 .buf = &sr,
639 .len = sizeof(sr),
640 };
641 struct qspi_cmd cmd = {
642 .op_code = SPI_NOR_CMD_RDSR,
643 .rx_buf = &sr_buf,
644 };
645 int ret = qspi_send_cmd(dev, &cmd, false);
646
647 return (ret < 0) ? ret : sr;
648 }
649
650 /* Wait until RDSR confirms write is not in progress. */
qspi_wait_while_writing(const struct device * dev)651 static int qspi_wait_while_writing(const struct device *dev)
652 {
653 int ret;
654
655 do {
656 ret = qspi_rdsr(dev);
657 } while ((ret >= 0) && ((ret & SPI_NOR_WIP_BIT) != 0U));
658
659 return (ret < 0) ? ret : 0;
660 }
661
662 /**
663 * @brief Fills init struct
664 *
665 * @param config Pointer to the config struct provided by user
666 * @param initstruct Pointer to the configuration struct
667 * @retval None
668 */
qspi_fill_init_struct(nrfx_qspi_config_t * initstruct)669 static inline void qspi_fill_init_struct(nrfx_qspi_config_t *initstruct)
670 {
671 /* Configure XIP offset */
672 initstruct->xip_offset = 0;
673
674 #ifdef CONFIG_PINCTRL
675 initstruct->skip_gpio_cfg = true,
676 initstruct->skip_psel_cfg = true,
677 #else
678 /* Configure pins */
679 initstruct->pins.sck_pin = QSPI_IF_BUS_SCK_PIN;
680 initstruct->pins.csn_pin = QSPI_IF_BUS_CSN_PIN;
681 initstruct->pins.io0_pin = QSPI_IF_BUS_IO0_PIN;
682 initstruct->pins.io1_pin = QSPI_IF_BUS_IO1_PIN;
683 #if QSPI_IF_BUS_HAS_4_IO_PINS
684 initstruct->pins.io2_pin = QSPI_IF_BUS_IO2_PIN;
685 initstruct->pins.io3_pin = QSPI_IF_BUS_IO3_PIN;
686 #else
687 initstruct->pins.io2_pin = NRF_QSPI_PIN_NOT_CONNECTED;
688 initstruct->pins.io3_pin = NRF_QSPI_PIN_NOT_CONNECTED;
689 #endif
690 #endif /* CONFIG_PINCTRL */
691 /* Configure Protocol interface */
692 initstruct->prot_if.addrmode = NRF_QSPI_ADDRMODE_24BIT;
693
694 initstruct->prot_if.dpmconfig = false;
695
696 /* Configure physical interface */
697 initstruct->phy_if.sck_freq = INST_0_SCK_CFG;
698
699 /* Using MHZ fails checkpatch constant check */
700 if (QSPI_IF_DEVICE_FREQUENCY >= 16000000) {
701 qspi_cfg->qspi_slave_latency = 1;
702 }
703 initstruct->phy_if.sck_delay = QSPI_IF_DEVICE_RX_DELAY;
704 initstruct->phy_if.spi_mode = qspi_get_mode(QSPI_IF_DEVICE_CPOL, QSPI_IF_DEVICE_CPHA);
705
706 if (QSPI_IF_DEVICE_QUAD_MODE) {
707 initstruct->prot_if.readoc = NRF_QSPI_READOC_READ4IO;
708 initstruct->prot_if.writeoc = NRF_QSPI_WRITEOC_PP4IO;
709 } else {
710 initstruct->prot_if.readoc = NRF_QSPI_READOC_FASTREAD;
711 initstruct->prot_if.writeoc = NRF_QSPI_WRITEOC_PP;
712 }
713
714 initstruct->phy_if.dpmen = false;
715 }
716
717 /* Configures QSPI memory for the transfer */
qspi_nrfx_configure(const struct device * dev)718 static int qspi_nrfx_configure(const struct device *dev)
719 {
720 if (!dev) {
721 return -ENXIO;
722 }
723
724 struct qspi_nor_data *dev_data = dev->data;
725
726 qspi_fill_init_struct(&QSPIconfig);
727
728 #if defined(CONFIG_SOC_SERIES_NRF53X)
729 /* When the QSPI peripheral is activated, during the nrfx_qspi driver
730 * initialization, it reads the status of the connected flash chip.
731 * Make sure this transaction is performed with a valid base clock
732 * divider.
733 */
734 nrf_clock_hfclk192m_div_set(NRF_CLOCK, BASE_CLOCK_DIV);
735 k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
736 #endif
737
738 nrfx_err_t res = _nrfx_qspi_init(&QSPIconfig, qspi_handler, dev_data);
739
740 #if defined(CONFIG_SOC_SERIES_NRF53X)
741 /* Restore the default /4 divider after the QSPI initialization. */
742 nrf_clock_hfclk192m_div_set(NRF_CLOCK, NRF_CLOCK_HFCLK_DIV_4);
743 k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
744 #endif
745
746 int ret = qspi_get_zephyr_ret_code(res);
747
748 if (ret == 0) {
749 /* Set QE to match transfer mode. If not using quad
750 * it's OK to leave QE set, but doing so prevents use
751 * of WP#/RESET#/HOLD# which might be useful.
752 *
753 * Note build assert above ensures QER is S1B6. Other
754 * options require more logic.
755 */
756 ret = qspi_rdsr(dev);
757
758 if (ret < 0) {
759 LOG_ERR("RDSR failed: %d", ret);
760 return ret;
761 }
762
763 uint8_t sr = (uint8_t)ret;
764 bool qe_value = (qspi_write_is_quad(QSPIconfig.prot_if.writeoc)) ||
765 (qspi_read_is_quad(QSPIconfig.prot_if.readoc));
766 const uint8_t qe_mask = BIT(6); /* only S1B6 */
767 bool qe_state = ((sr & qe_mask) != 0U);
768
769 LOG_DBG("RDSR %02x QE %d need %d: %s", sr, qe_state, qe_value,
770 (qe_state != qe_value) ? "updating" : "no-change");
771
772 ret = 0;
773
774 if (qe_state != qe_value) {
775 const struct qspi_buf sr_buf = {
776 .buf = &sr,
777 .len = sizeof(sr),
778 };
779 struct qspi_cmd cmd = {
780 .op_code = SPI_NOR_CMD_WRSR,
781 .tx_buf = &sr_buf,
782 };
783
784 sr ^= qe_mask;
785 ret = qspi_send_cmd(dev, &cmd, true);
786
787 /* Writing SR can take some time, and further
788 * commands sent while it's happening can be
789 * corrupted. Wait.
790 */
791 if (ret == 0) {
792 ret = qspi_wait_while_writing(dev);
793 }
794 }
795
796 if (ret < 0) {
797 LOG_ERR("QE %s failed: %d", qe_value ? "set" : "clear", ret);
798 }
799 }
800
801 return ret;
802 }
803
read_non_aligned(const struct device * dev,int addr,void * dest,size_t size)804 static inline nrfx_err_t read_non_aligned(const struct device *dev, int addr, void *dest,
805 size_t size)
806 {
807 uint8_t __aligned(WORD_SIZE) buf[WORD_SIZE * 2];
808 uint8_t *dptr = dest;
809
810 int flash_prefix = (WORD_SIZE - (addr % WORD_SIZE)) % WORD_SIZE;
811
812 if (flash_prefix > size) {
813 flash_prefix = size;
814 }
815
816 int dest_prefix = (WORD_SIZE - (int)dptr % WORD_SIZE) % WORD_SIZE;
817
818 if (dest_prefix > size) {
819 dest_prefix = size;
820 }
821
822 int flash_suffix = (size - flash_prefix) % WORD_SIZE;
823 int flash_middle = size - flash_prefix - flash_suffix;
824 int dest_middle = size - dest_prefix - (size - dest_prefix) % WORD_SIZE;
825
826 if (flash_middle > dest_middle) {
827 flash_middle = dest_middle;
828 flash_suffix = size - flash_prefix - flash_middle;
829 }
830
831 nrfx_err_t res = NRFX_SUCCESS;
832
833 /* read from aligned flash to aligned memory */
834 if (flash_middle != 0) {
835 res = _nrfx_qspi_read(dptr + dest_prefix, flash_middle, addr + flash_prefix);
836
837 _qspi_wait_for_completion(dev, res);
838
839 if (res != NRFX_SUCCESS) {
840 return res;
841 }
842
843 /* perform shift in RAM */
844 if (flash_prefix != dest_prefix) {
845 memmove(dptr + flash_prefix, dptr + dest_prefix, flash_middle);
846 }
847 }
848
849 /* read prefix */
850 if (flash_prefix != 0) {
851 res = _nrfx_qspi_read(buf, WORD_SIZE, addr - (WORD_SIZE - flash_prefix));
852
853 _qspi_wait_for_completion(dev, res);
854
855 if (res != NRFX_SUCCESS) {
856 return res;
857 }
858
859 memcpy(dptr, buf + WORD_SIZE - flash_prefix, flash_prefix);
860 }
861
862 /* read suffix */
863 if (flash_suffix != 0) {
864 res = _nrfx_qspi_read(buf, WORD_SIZE * 2, addr + flash_prefix + flash_middle);
865
866 _qspi_wait_for_completion(dev, res);
867
868 if (res != NRFX_SUCCESS) {
869 return res;
870 }
871
872 memcpy(dptr + flash_prefix + flash_middle, buf, flash_suffix);
873 }
874
875 return res;
876 }
877
qspi_nor_read(const struct device * dev,int addr,void * dest,size_t size)878 static int qspi_nor_read(const struct device *dev, int addr, void *dest, size_t size)
879 {
880 if (!dest) {
881 return -EINVAL;
882 }
883
884 /* read size must be non-zero */
885 if (!size) {
886 return 0;
887 }
888
889 int rc = qspi_device_init(dev);
890
891 if (rc != 0) {
892 goto out;
893 }
894
895 qspi_lock(dev);
896
897 nrfx_err_t res = read_non_aligned(dev, addr, dest, size);
898
899 qspi_unlock(dev);
900
901 rc = qspi_get_zephyr_ret_code(res);
902
903 out:
904 qspi_device_uninit(dev);
905 return rc;
906 }
907
908 /* addr aligned, sptr not null, slen less than 4 */
write_sub_word(const struct device * dev,int addr,const void * sptr,size_t slen)909 static inline nrfx_err_t write_sub_word(const struct device *dev, int addr, const void *sptr,
910 size_t slen)
911 {
912 uint8_t __aligned(4) buf[4];
913 nrfx_err_t res;
914
915 /* read out the whole word so that unchanged data can be
916 * written back
917 */
918 res = _nrfx_qspi_read(buf, sizeof(buf), addr);
919 _qspi_wait_for_completion(dev, res);
920
921 if (res == NRFX_SUCCESS) {
922 memcpy(buf, sptr, slen);
923 res = _nrfx_qspi_write(buf, sizeof(buf), addr);
924 _qspi_wait_for_completion(dev, res);
925 }
926
927 return res;
928 }
929
qspi_nor_write(const struct device * dev,int addr,const void * src,size_t size)930 static int qspi_nor_write(const struct device *dev, int addr, const void *src, size_t size)
931 {
932 if (!src) {
933 return -EINVAL;
934 }
935
936 /* write size must be non-zero, less than 4, or a multiple of 4 */
937 if ((size == 0) || ((size > 4) && ((size % 4U) != 0))) {
938 return -EINVAL;
939 }
940
941 /* address must be 4-byte aligned */
942 if ((addr % 4U) != 0) {
943 return -EINVAL;
944 }
945
946 nrfx_err_t res = NRFX_SUCCESS;
947
948 int rc = qspi_device_init(dev);
949
950 if (rc != 0) {
951 goto out;
952 }
953
954 qspi_trans_lock(dev);
955
956 qspi_lock(dev);
957
958 if (size < 4U) {
959 res = write_sub_word(dev, addr, src, size);
960 } else {
961 res = _nrfx_qspi_write(src, size, addr);
962 _qspi_wait_for_completion(dev, res);
963 }
964
965 qspi_unlock(dev);
966
967 qspi_trans_unlock(dev);
968
969 rc = qspi_get_zephyr_ret_code(res);
970 out:
971 qspi_device_uninit(dev);
972 return rc;
973 }
974
975 /**
976 * @brief Configure the flash
977 *
978 * @param dev The flash device structure
979 * @param info The flash info structure
980 * @return 0 on success, negative errno code otherwise
981 */
qspi_nor_configure(const struct device * dev)982 static int qspi_nor_configure(const struct device *dev)
983 {
984 int ret = qspi_nrfx_configure(dev);
985
986 if (ret != 0) {
987 return ret;
988 }
989
990 qspi_device_uninit(dev);
991
992 return 0;
993 }
994
995 /**
996 * @brief Initialize and configure the flash
997 *
998 * @param name The flash name
999 * @return 0 on success, negative errno code otherwise
1000 */
qspi_nor_init(const struct device * dev)1001 static int qspi_nor_init(const struct device *dev)
1002 {
1003 #ifdef CONFIG_PINCTRL
1004 int ret = pinctrl_apply_state(QSPI_IF_BUS_PINCTRL_DT_DEV_CONFIG_GET,
1005 PINCTRL_STATE_DEFAULT);
1006
1007 if (ret < 0) {
1008 return ret;
1009 }
1010 #endif
1011
1012 IRQ_CONNECT(QSPI_IF_BUS_IRQN,
1013 QSPI_IF_BUS_IRQ_PRIO,
1014 nrfx_isr,
1015 nrfx_qspi_irq_handler,
1016 0);
1017
1018 return qspi_nor_configure(dev);
1019 }
1020
1021 #if defined(CONFIG_SOC_SERIES_NRF53X)
qspi_cmd_encryption(const struct device * dev,nrf_qspi_encryption_t * p_cfg)1022 static int qspi_cmd_encryption(const struct device *dev, nrf_qspi_encryption_t *p_cfg)
1023 {
1024 const struct qspi_buf tx_buf = { .buf = (uint8_t *)&p_cfg->nonce[1],
1025 .len = sizeof(p_cfg->nonce[1]) };
1026 const struct qspi_cmd cmd = {
1027 .op_code = 0x4f,
1028 .tx_buf = &tx_buf,
1029 };
1030
1031 int ret = qspi_device_init(dev);
1032
1033 if (ret == 0) {
1034 ret = qspi_send_cmd(dev, &cmd, false);
1035 }
1036
1037 qspi_device_uninit(dev);
1038
1039 if (ret < 0) {
1040 LOG_DBG("cmd_encryption failed %d", ret);
1041 }
1042
1043 return ret;
1044 }
1045 #endif
1046
qspi_RDSR2(const struct device * dev,uint8_t * rdsr2)1047 int qspi_RDSR2(const struct device *dev, uint8_t *rdsr2)
1048 {
1049 int ret = 0;
1050 uint8_t sr = 0;
1051
1052 const struct qspi_buf sr_buf = {
1053 .buf = &sr,
1054 .len = sizeof(sr),
1055 };
1056 struct qspi_cmd cmd = {
1057 .op_code = 0x2f,
1058 .rx_buf = &sr_buf,
1059 };
1060
1061 ret = qspi_device_init(dev);
1062
1063 ret = qspi_send_cmd(dev, &cmd, false);
1064
1065 qspi_device_uninit(dev);
1066
1067 LOG_DBG("RDSR2 = 0x%x", sr);
1068
1069 if (ret == 0) {
1070 *rdsr2 = sr;
1071 }
1072
1073 return ret;
1074 }
1075
1076 /* Wait until RDSR2 confirms RPU_WAKE write is successful */
qspi_validate_rpu_wake_writecmd(const struct device * dev)1077 int qspi_validate_rpu_wake_writecmd(const struct device *dev)
1078 {
1079 int ret = 0;
1080 uint8_t rdsr2 = 0;
1081
1082 for (int ii = 0; ii < 1; ii++) {
1083 ret = qspi_RDSR2(dev, &rdsr2);
1084 if (!ret && (rdsr2 & RPU_WAKEUP_NOW)) {
1085 return 0;
1086 }
1087 }
1088
1089 return -1;
1090 }
1091
1092
qspi_RDSR1(const struct device * dev,uint8_t * rdsr1)1093 int qspi_RDSR1(const struct device *dev, uint8_t *rdsr1)
1094 {
1095 int ret = 0;
1096 uint8_t sr = 0;
1097
1098 const struct qspi_buf sr_buf = {
1099 .buf = &sr,
1100 .len = sizeof(sr),
1101 };
1102 struct qspi_cmd cmd = {
1103 .op_code = 0x1f,
1104 .rx_buf = &sr_buf,
1105 };
1106
1107 ret = qspi_device_init(dev);
1108
1109 ret = qspi_send_cmd(dev, &cmd, false);
1110
1111 qspi_device_uninit(dev);
1112
1113 LOG_DBG("RDSR1 = 0x%x", sr);
1114
1115 if (ret == 0) {
1116 *rdsr1 = sr;
1117 }
1118
1119 return ret;
1120 }
1121
1122 /* Wait until RDSR1 confirms RPU_AWAKE/RPU_READY */
qspi_wait_while_rpu_awake(const struct device * dev)1123 int qspi_wait_while_rpu_awake(const struct device *dev)
1124 {
1125 int ret;
1126 uint8_t val = 0;
1127
1128 for (int ii = 0; ii < 10; ii++) {
1129 ret = qspi_RDSR1(dev, &val);
1130
1131 LOG_DBG("RDSR1 = 0x%x", val);
1132
1133 if (!ret && (val & RPU_AWAKE_BIT)) {
1134 break;
1135 }
1136
1137 k_msleep(1);
1138 }
1139
1140 if (ret || !(val & RPU_AWAKE_BIT)) {
1141 LOG_ERR("RPU is not awake even after 10ms");
1142 return -1;
1143 }
1144
1145 /* Restore QSPI clock frequency from DTS */
1146 QSPIconfig.phy_if.sck_freq = INST_0_SCK_CFG;
1147
1148 return val;
1149 }
1150
qspi_WRSR2(const struct device * dev,uint8_t data)1151 int qspi_WRSR2(const struct device *dev, uint8_t data)
1152 {
1153 const struct qspi_buf tx_buf = {
1154 .buf = &data,
1155 .len = sizeof(data),
1156 };
1157 const struct qspi_cmd cmd = {
1158 .op_code = 0x3f,
1159 .tx_buf = &tx_buf,
1160 };
1161 int ret = qspi_device_init(dev);
1162
1163 if (ret == 0) {
1164 ret = qspi_send_cmd(dev, &cmd, false);
1165 }
1166
1167 qspi_device_uninit(dev);
1168
1169 if (ret < 0) {
1170 LOG_ERR("cmd_wakeup RPU failed %d", ret);
1171 }
1172
1173 return ret;
1174 }
1175
qspi_cmd_wakeup_rpu(const struct device * dev,uint8_t data)1176 int qspi_cmd_wakeup_rpu(const struct device *dev, uint8_t data)
1177 {
1178 int ret;
1179
1180 /* Waking RPU works reliably only with lowest frequency (8MHz) */
1181 QSPIconfig.phy_if.sck_freq = INST_0_SCK_CFG_WAKE;
1182
1183 ret = qspi_WRSR2(dev, data);
1184
1185 return ret;
1186 }
1187
1188 struct device qspi_perip = {
1189 .data = &qspi_nor_memory_data,
1190 };
1191
qspi_deinit(void)1192 int qspi_deinit(void)
1193 {
1194 LOG_DBG("TODO : %s", __func__);
1195
1196 return 0;
1197 }
1198
qspi_init(struct qspi_config * config)1199 int qspi_init(struct qspi_config *config)
1200 {
1201 unsigned int rc;
1202
1203 qspi_cfg = config;
1204
1205 config->readoc = config->quad_spi ? NRF_QSPI_READOC_READ4IO : NRF_QSPI_READOC_FASTREAD;
1206 config->writeoc = config->quad_spi ? NRF_QSPI_WRITEOC_PP4IO : NRF_QSPI_WRITEOC_PP;
1207
1208 rc = qspi_nor_init(&qspi_perip);
1209
1210 k_sem_init(&qspi_cfg->lock, 1, 1);
1211
1212 return rc;
1213 }
1214
qspi_update_nonce(unsigned int addr,int len,int hlread)1215 void qspi_update_nonce(unsigned int addr, int len, int hlread)
1216 {
1217 #if NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC
1218
1219 NRF_QSPI_Type *p_reg = NRF_QSPI;
1220
1221 if (!qspi_cfg->encryption) {
1222 return;
1223 }
1224
1225 if (nonce_last_addr == 0 || hlread) {
1226 p_reg->DMA_ENC.NONCE2 = ++nonce_cnt;
1227 } else if ((nonce_last_addr + 4) != addr) {
1228 p_reg->DMA_ENC.NONCE2 = ++nonce_cnt;
1229 }
1230
1231 nonce_last_addr = addr + len - 4;
1232
1233 #endif /*NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC*/
1234 }
1235
qspi_addr_check(unsigned int addr,const void * data,unsigned int len)1236 void qspi_addr_check(unsigned int addr, const void *data, unsigned int len)
1237 {
1238 if ((addr % 4 != 0) || (((unsigned int)data) % 4 != 0) || (len % 4 != 0)) {
1239 LOG_ERR("%s : Unaligned address %x %x %d %x %x", __func__, addr,
1240 (unsigned int)data, (addr % 4 != 0), (((unsigned int)data) % 4 != 0),
1241 (len % 4 != 0));
1242 }
1243 }
1244
qspi_write(unsigned int addr,const void * data,int len)1245 int qspi_write(unsigned int addr, const void *data, int len)
1246 {
1247 int status;
1248
1249 qspi_addr_check(addr, data, len);
1250
1251 addr |= qspi_cfg->addrmask;
1252
1253 k_sem_take(&qspi_cfg->lock, K_FOREVER);
1254
1255 qspi_update_nonce(addr, len, 0);
1256
1257 status = qspi_nor_write(&qspi_perip, addr, data, len);
1258
1259 k_sem_give(&qspi_cfg->lock);
1260
1261 return status;
1262 }
1263
qspi_read(unsigned int addr,void * data,int len)1264 int qspi_read(unsigned int addr, void *data, int len)
1265 {
1266 int status;
1267
1268 qspi_addr_check(addr, data, len);
1269
1270 addr |= qspi_cfg->addrmask;
1271
1272 k_sem_take(&qspi_cfg->lock, K_FOREVER);
1273
1274 qspi_update_nonce(addr, len, 0);
1275
1276 status = qspi_nor_read(&qspi_perip, addr, data, len);
1277
1278 k_sem_give(&qspi_cfg->lock);
1279
1280 return status;
1281 }
1282
qspi_hl_readw(unsigned int addr,void * data)1283 int qspi_hl_readw(unsigned int addr, void *data)
1284 {
1285 int status;
1286 uint8_t *rxb = NULL;
1287 uint32_t len = 4;
1288
1289 len = len + (4 * qspi_cfg->qspi_slave_latency);
1290
1291 rxb = nrf_wifi_osal_mem_alloc(len);
1292
1293 if (rxb == NULL) {
1294 LOG_ERR("%s: ERROR ENOMEM line %d", __func__, __LINE__);
1295 return -ENOMEM;
1296 }
1297
1298 memset(rxb, 0, len);
1299
1300 k_sem_take(&qspi_cfg->lock, K_FOREVER);
1301
1302 qspi_update_nonce(addr, 4, 1);
1303
1304 status = qspi_nor_read(&qspi_perip, addr, rxb, len);
1305
1306 k_sem_give(&qspi_cfg->lock);
1307
1308 *(uint32_t *)data = *(uint32_t *)(rxb + (len - 4));
1309
1310 nrf_wifi_osal_mem_free(rxb);
1311
1312 return status;
1313 }
1314
qspi_hl_read(unsigned int addr,void * data,int len)1315 int qspi_hl_read(unsigned int addr, void *data, int len)
1316 {
1317 int count = 0;
1318
1319 qspi_addr_check(addr, data, len);
1320
1321 while (count < (len / 4)) {
1322 qspi_hl_readw(addr + (4 * count), ((char *)data + (4 * count)));
1323 count++;
1324 }
1325
1326 return 0;
1327 }
1328
qspi_cmd_sleep_rpu(const struct device * dev)1329 int qspi_cmd_sleep_rpu(const struct device *dev)
1330 {
1331 uint8_t data = 0x0;
1332
1333 /* printf("TODO : %s:", __func__); */
1334 const struct qspi_buf tx_buf = {
1335 .buf = &data,
1336 .len = sizeof(data),
1337 };
1338
1339 const struct qspi_cmd cmd = {
1340 .op_code = 0x3f, /* 0x3f, //WRSR2(0x3F) WakeUP RPU. */
1341 .tx_buf = &tx_buf,
1342 };
1343
1344 int ret = qspi_device_init(dev);
1345
1346 if (ret == 0) {
1347 ret = qspi_send_cmd(dev, &cmd, false);
1348 }
1349
1350 qspi_device_uninit(dev);
1351
1352 if (ret < 0) {
1353 LOG_ERR("cmd_wakeup RPU failed: %d", ret);
1354 }
1355
1356 return ret;
1357 }
1358
1359 /* Encryption public API */
1360
qspi_enable_encryption(uint8_t * key)1361 int qspi_enable_encryption(uint8_t *key)
1362 {
1363 #if defined(CONFIG_SOC_SERIES_NRF53X)
1364 int err = 0;
1365
1366 if (qspi_cfg->encryption) {
1367 return -EALREADY;
1368 }
1369
1370 int ret = qspi_device_init(&qspi_perip);
1371
1372 if (ret != 0) {
1373 LOG_ERR("qspi_device_init failed: %d", ret);
1374 return -EIO;
1375 }
1376
1377 memcpy(qspi_cfg->p_cfg.key, key, 16);
1378
1379 err = nrfx_qspi_dma_encrypt(&qspi_cfg->p_cfg);
1380 if (err != NRFX_SUCCESS) {
1381 LOG_ERR("nrfx_qspi_dma_encrypt failed: %d", err);
1382 return -EIO;
1383 }
1384
1385 err = qspi_cmd_encryption(&qspi_perip, &qspi_cfg->p_cfg);
1386 if (err != 0) {
1387 LOG_ERR("qspi_cmd_encryption failed: %d", err);
1388 return -EIO;
1389 }
1390
1391 qspi_cfg->encryption = true;
1392
1393 qspi_device_uninit(&qspi_perip);
1394
1395 return 0;
1396 #else
1397 return -ENOTSUP;
1398 #endif
1399 }
1400