OpenOCD
max32xxx_qspi.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2016 - 2019 by Andreas Bolsch *
5  * andreas.bolsch@mni.thm.de *
6  * *
7  * Copyright (C) 2010 by Antonio Borneo *
8  * borneo.antonio@gmail.com *
9  * *
10  * Portions Copyright (C) 2025-2026 Analog Devices, Inc. *
11  * pete.johanson@analog.com *
12  ***************************************************************************/
13 
14 #ifdef HAVE_CONFIG_H
15 #include "config.h"
16 #endif
17 
18 #include "imp.h"
19 #include "max32xxx_options.h"
21 #include <helper/binarybuffer.h>
22 #include <helper/bits.h>
23 #include <helper/time_support.h>
24 #include <target/algorithm.h>
25 #include <target/armv7m.h>
26 #include <target/image.h>
27 #include "spi.h"
28 #include "sfdp.h"
29 
30 #define SPIXFC_FIFO_DEPTH 16
31 // 16-bit filler magic word indicating this isn't a header
32 #define SPIXFC_HEADER_NULL 0xF000
33 
34 #define SPIXF_BASE 0x40026000
35 #define SPIXF_CFG (SPIXF_BASE | 0x00)
36 #define SPIXF_FETCH_CTRL (SPIXF_BASE | 0x04)
37 #define SPIXF_MODE_CTRL (SPIXF_BASE | 0x08)
38 #define SPIXF_MODE_DATA (SPIXF_BASE | 0x0C)
39 #define SPIXF_SCLK_FB_CTRL (SPIXF_BASE | 0x10)
40 #define SPIXF_IO_CTRL (SPIXF_BASE | 0x1C)
41 #define SPIXF_MEMSECCN (SPIXF_BASE | 0x20)
42 #define SPIXF_BUS_IDLE (SPIXF_BASE | 0x24)
43 
44 #define SPIXF_MEMSECCN_ENC_ENABLE 0x1
45 #define SPIXF_MEMSECCN_AUTH_DISABLE 0x2
46 
47 #define SPI_ICC_BASE 0x4002F000
48 #define SPI_ICC_CTRL (SPI_ICC_BASE | 0x100)
49 #define SPI_ICC_INV (SPI_ICC_BASE | 0x700)
50 
51 #define SPI_ICC_CTRL_EN_POS 0
52 #define SPI_ICC_CTRL_EN (0x1UL << SPI_ICC_CTRL_EN_POS)
53 #define SPI_ICC_CTRL_RDY_POS 16
54 #define SPI_ICC_CTRL_RDY (0x1UL << SPI_ICC_CTRL_RDY_POS)
55 
56 #define GCR_BASE 0x40000000
57 #define GCR_SCON (GCR_BASE | 0x00)
58 #define GCR_RST1 (GCR_BASE | 0x44)
59 #define GCR_RST1_XSPIM (0x1 << 4)
60 #define GCR_RST1_SPIXIP (0x1 << 5)
61 
62 // Set the number of system clocks per low/high period of the SPI clock
63 #define SPI_CLOCK_PERIOD 2
64 
65 // Flash timeout values in milliseconds.
66 #define MAX32XXX_QSPI_MASS_ERASE_TIMEOUT_MS 100000
67 #define MAX32XXX_QSPI_ERASE_TIMEOUT_MS 10000
68 #define MAX32XXX_QSPI_WE_TIMEOUT_MS 100
69 #define MAX32XXX_QSPI_FIFO_TIMEOUT_MS 100
70 
71 // Set this to 1 to enable dual (1-2-2) reads if available from SFDP
72 #ifndef SPI_DUAL_MODE
73 #define SPI_DUAL_MODE 0
74 #endif
75 
76 static const uint8_t write_code[] = {
77 #include "contrib/loaders/flash/max32xxx_qspi/max32xxx_qspi.inc"
78 };
79 
81  bool probed;
82  char devname[32];
83  struct flash_device dev;
84  unsigned int options;
85 };
86 
87 FLASH_BANK_COMMAND_HANDLER(max32xxx_qspi_flash_bank_command)
88 {
89  LOG_DEBUG("%s", __func__);
90 
91  if (CMD_ARGC < 7 || CMD_ARGC > 7) {
92  LOG_ERROR("incorrect flash bank max32xxx_qspi configuration: "
93  "<flash_addr_base> <flash_addr_size> 0 0 <target> <opitons>");
95  }
96 
98  info = malloc(sizeof(struct max32xxx_qspi_flash_bank));
99  if (!info) {
100  LOG_ERROR("not enough memory");
101  return ERROR_FAIL;
102  }
103 
104  bank->driver_priv = info;
105 
106  info->probed = false;
107  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[6], info->options);
108  bank->driver_priv = info;
109 
110  return ERROR_OK;
111 }
112 
114 {
115  struct target *target = bank->target;
116  // Set the number of system clocks for the SPI clock low and high period
117  int retval = target_write_u32(target, SPIXFC_CFG, (SPI_CLOCK_PERIOD << 8) | (SPI_CLOCK_PERIOD << 12));
118  if (retval != ERROR_OK)
119  return retval;
120 
121  // Enable the peripheral, FIFOs and SCK feedback
122  retval = target_write_u32(target, SPIXFC_GEN_CTRL, (0x7 << 0) | (0x1 << 5) | (0x1 << 24));
123  if (retval != ERROR_OK)
124  return retval;
125 
126  return retval;
127 }
128 
130 {
131  struct target *target = bank->target;
132  // Disable the SPI ICC
133  int retval = target_write_u32(target, SPI_ICC_CTRL, 0);
134  if (retval != ERROR_OK)
135  return retval;
136 
137  // Disable SPIXFC
139  if (retval != ERROR_OK)
140  return retval;
141 
142  // Reset SPI peripherals
144  if (retval != ERROR_OK)
145  return retval;
146 
147  // Wait for reset to complete
148  uint32_t temp32 = 1;
149  while (temp32) {
150  retval = target_read_u32(target, GCR_RST1, &temp32);
151  if (retval != ERROR_OK)
152  return retval;
153  }
154 
155  // Invalidate cache
156  retval = target_write_u32(target, SPI_ICC_INV, 1);
157  if (retval != ERROR_OK)
158  return retval;
159 
160  // Wait for the ready bit
161  temp32 = 0;
162  while (!temp32) {
163  retval = target_read_u32(target, SPI_ICC_CTRL, &temp32);
164  if (retval != ERROR_OK)
165  return retval;
166  temp32 &= SPI_ICC_CTRL_RDY;
167  }
168 
169  // Set the number of system clocks for the SPI clock low and high period
170  retval = target_write_u32(target, SPIXF_CFG, (SPI_CLOCK_PERIOD << 8) | (SPI_CLOCK_PERIOD << 12) | (0x1 << 2));
171  if (retval != ERROR_OK)
172  return retval;
173 
174  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
175  // Enter 1-2-2 mode
176  if (SPI_DUAL_MODE && max32xxx_qspi_info->dev.dread_cmd != 0x0) {
177  LOG_DEBUG("Entering 1-2-2 read mode");
178 
179  // Set the read command
181  (0x1 << 10) | (0x1 << 12) | max32xxx_qspi_info->dev.dread_cmd);
182  if (retval != ERROR_OK)
183  return retval;
184 
185  // Set mode control
187  max32xxx_qspi_info->dev.dread_mode + max32xxx_qspi_info->dev.dread_dclk);
188  if (retval != ERROR_OK)
189  return retval;
190  } else {
191  // Set the read command
192  temp32 = max32xxx_qspi_info->dev.read_cmd;
193  // Enable 4 byte addresses if using read command 0x13
194  if (max32xxx_qspi_info->dev.read_cmd == 0x13)
195  temp32 |= 0x1 << 16;
196  retval = target_write_u32(target, SPIXF_FETCH_CTRL, temp32);
197  if (retval != ERROR_OK)
198  return retval;
199 
200  // Set mode control
202  if (retval != ERROR_OK)
203  return retval;
204  }
205 
206  // Setup the encryption options
207  if (max32xxx_qspi_info->options & OPTIONS_ENC) {
208  temp32 = SPIXF_MEMSECCN_ENC_ENABLE;
209 
210  if (!(max32xxx_qspi_info->options & OPTIONS_AUTH))
211  temp32 |= SPIXF_MEMSECCN_AUTH_DISABLE;
212  retval = target_write_u32(target, SPIXF_MEMSECCN, temp32);
213  if (retval != ERROR_OK)
214  return retval;
215  } else {
216  retval = target_write_u32(target, SPIXF_MEMSECCN, 0);
217  if (retval != ERROR_OK)
218  return retval;
219  }
220 
221  // Enable feedback mode
223  if (retval != ERROR_OK)
224  return retval;
225 
226  // Bus idle timeout
227  retval = target_write_u32(target, SPIXF_BUS_IDLE, 1);
228  if (retval != ERROR_OK)
229  return retval;
230 
231  // Enable cache
233  if (retval != ERROR_OK)
234  return retval;
235 
236  // Clear the code cache
237  retval = target_read_u32(target, GCR_SCON, &temp32);
238  if (retval != ERROR_OK)
239  return retval;
240  temp32 |= (0x1 << 6);
241  retval = target_write_u32(target, GCR_SCON, temp32);
242  if (retval != ERROR_OK)
243  return retval;
244 
245  return retval;
246 }
247 
249  const uint8_t *data, unsigned int len)
250 {
251  int retval = ERROR_OK;
252  unsigned int data_i = 0;
253 
254  while (len - data_i) {
255  unsigned int write_len;
256 
257  // Calculate how many bytes we can write on this round
258  if (len - data_i > SPIXFC_FIFO_DEPTH)
259  write_len = SPIXFC_FIFO_DEPTH;
260  else
261  write_len = len - data_i;
262 
263  // Wait for there to be room in the TX FIFO
264  const int64_t start_time = timeval_ms();
265  unsigned int tx_fifo_avail;
266  do {
267  uint32_t temp32;
268  retval = target_read_u32(target, SPIXFC_FIFO_CTRL, &temp32);
269  if (retval != ERROR_OK)
270  return retval;
271  tx_fifo_avail = SPIXFC_FIFO_DEPTH -
272  ((temp32 & SPIXFC_FIFO_CTRL_TX_FIFO_CNT) >>
274 
275  if (timeval_ms() - start_time > MAX32XXX_QSPI_FIFO_TIMEOUT_MS)
277 
278  keep_alive();
279  } while (tx_fifo_avail < write_len);
280 
281  while (write_len) {
282  uint16_t write_data = data[data_i++];
283 
284  if (data_i < len) {
285  write_data |= (data[data_i++] << 8);
286  write_len -= 2;
287  } else {
289  write_len -= 1;
290  }
292  if (retval != ERROR_OK)
293  return retval;
294  }
295  }
296 
297  return retval;
298 }
299 
300 static int max32xxx_qspi_read_rxfifo(struct target *target, uint8_t *data,
301  unsigned int len)
302 {
303  int retval = ERROR_OK;
304  unsigned int data_i = 0;
305 
306  while (len - data_i) {
307  unsigned int read_len;
308 
309  // Wait for there to be data in the RX FIFO
310  const int64_t start_time = timeval_ms();
311  unsigned int rx_fifo_avail;
312  do {
313  uint32_t temp32;
314  retval = target_read_u32(target, SPIXFC_FIFO_CTRL, &temp32);
315  if (retval != ERROR_OK)
316  return retval;
317  rx_fifo_avail = (temp32 & SPIXFC_FIFO_CTRL_RX_FIFO_CNT) >>
319 
320  if (timeval_ms() - start_time > MAX32XXX_QSPI_FIFO_TIMEOUT_MS)
322 
323  keep_alive();
324  } while (!rx_fifo_avail);
325 
326  // Calculate how many bytes we can write on this round
327  if (len - data_i > rx_fifo_avail)
328  read_len = rx_fifo_avail;
329  else
330  read_len = len - data_i;
331 
332  while (read_len) {
333  retval = target_read_u8(target, SPIXFC_FIFO_RX, &data[data_i++]);
334  if (retval != ERROR_OK)
335  return retval;
336  read_len--;
337  }
338  }
339 
340  return retval;
341 }
342 
343 static int max32xxx_qspi_write_bytes(struct target *target, const uint8_t *data,
344  unsigned int len, bool deass)
345 {
346  int retval = ERROR_OK;
347  unsigned int data_i = 0;
348 
349  // Wrap the length
350  while (len - data_i) {
351  unsigned int chunk_len;
352  // Max transaction length is 32 units
353  if (len - data_i > 32)
354  chunk_len = 32;
355  else
356  chunk_len = len - data_i;
357 
358  // Setup the SPI header, 32 maps to 0 in the size field
359  uint16_t header = SPIXFC_HEADER_TX | SPIXFC_HEADER_BYTE;
360  if (chunk_len != 32)
361  header |= chunk_len << SPIXFC_HEADER_SIZE_POS;
362 
363  // If we de-asserting and this is the final chunk
364  if (deass && (len - data_i - chunk_len == 0))
365  header |= SPIXFC_HEADER_SS_DEASS;
366 
367  // Write the header to the TX FIFO
368  retval = max32xxx_qspi_write_txfifo(target, (uint8_t *)&header,
369  sizeof(header));
370  if (retval != ERROR_OK)
371  return retval;
372 
373  // Write the data to the TX FIFO
374  retval = max32xxx_qspi_write_txfifo(target, &data[data_i], chunk_len);
375  if (retval != ERROR_OK)
376  return retval;
377  data_i += chunk_len;
378  }
379 
380  return retval;
381 }
382 
383 static int max32xxx_qspi_read_bytes(struct target *target, uint8_t *data,
384  unsigned int len, bool deass)
385 {
386  int retval = ERROR_OK;
387  unsigned int data_i = 0;
388 
389  // Wrap the length
390  while (len - data_i) {
391  unsigned int chunk_len;
392  // Max transaction length is 32 units
393  if (len - data_i > 32)
394  chunk_len = 32;
395  else
396  chunk_len = len - data_i;
397 
398  // Setup the SPI header, 32 maps to 0 in the size field
399  uint16_t header = SPIXFC_HEADER_RX | SPIXFC_HEADER_BYTE;
400  if (chunk_len != 32)
401  header |= chunk_len << SPIXFC_HEADER_SIZE_POS;
402 
403  // If we de-asserting and this is the final chunk
404  if (deass && (len - data_i - chunk_len == 0))
405  header |= SPIXFC_HEADER_SS_DEASS;
406 
407  // Write the header to the TX FIFO
408  retval = max32xxx_qspi_write_txfifo(target, (uint8_t *)&header,
409  sizeof(header));
410  if (retval != ERROR_OK)
411  return retval;
412 
413  // Read the data to the TX FIFO, convert to number of bytes
414  retval = max32xxx_qspi_read_rxfifo(target, (uint8_t *)&data[data_i],
415  chunk_len);
416  if (retval != ERROR_OK)
417  return retval;
418  data_i += chunk_len;
419  }
420 
421  return retval;
422 }
423 
424 static int max32xxx_qspi_read_words(struct target *target, uint32_t *data,
425  unsigned int len, bool deass)
426 {
427  uint32_t temp32;
428  unsigned int data_i = 0;
429 
430  // Configure the page size
431  int retval = target_read_u32(target, SPIXFC_CFG, &temp32);
432  if (retval != ERROR_OK)
433  return retval;
434  temp32 = (temp32 & ~(SPIXFC_CONFIG_PAGE_SIZE)) |
436  retval = target_write_u32(target, SPIXFC_CFG, temp32);
437  if (retval != ERROR_OK)
438  return retval;
439 
440  while (len - data_i) {
441  unsigned int chunk_len;
442  // Max transaction length is 32 units
443  if (len - data_i > 32)
444  chunk_len = 32;
445  else
446  chunk_len = len - data_i;
447 
448  // Setup the SPI header
449  uint16_t header = SPIXFC_HEADER_RX | SPIXFC_HEADER_PAGE;
450  if (chunk_len != 32)
451  header |= chunk_len << SPIXFC_HEADER_SIZE_POS;
452 
453  // If we de-asserting and this is the final chunk
454  if (deass && (len - data_i - chunk_len == 0))
455  header |= SPIXFC_HEADER_SS_DEASS;
456 
457  // Write the header to the TX FIFO
458  retval = max32xxx_qspi_write_txfifo(target, (uint8_t *)&header,
459  sizeof(header));
460  if (retval != ERROR_OK)
461  return retval;
462 
463  // Read the data to the TX FIFO, convert to number of bytes
464  uint8_t *data8 = (uint8_t *)data;
466  (uint8_t *)&data8[data_i * 4], chunk_len * 4);
467  if (retval != ERROR_OK)
468  return retval;
469  data_i += chunk_len;
470  }
471 
472  return retval;
473 }
474 
475 static int max32xxx_qspi_poll_wip(struct target *target, unsigned int timeout)
476 {
477  const int64_t start_time = timeval_ms();
478  uint8_t read_data;
479  int retval;
480 
481  do {
482  uint8_t cmd_data = SPIFLASH_READ_STATUS;
483  retval = max32xxx_qspi_write_bytes(target, &cmd_data, 1, false);
484  if (retval != ERROR_OK)
485  return retval;
486 
487  read_data = SPIFLASH_BSY_BIT;
488  retval = max32xxx_qspi_read_bytes(target, &read_data, 1, true);
489  if (retval != ERROR_OK) {
490  LOG_ERROR("Failed to read the status bytes");
491  return retval;
492  }
493 
494  // Prevent GDB warnings
495  keep_alive();
496 
497  if (timeval_ms() - start_time > timeout) {
498  LOG_ERROR("Timed out waiting for flash");
499  return ERROR_TIMEOUT_REACHED;
500  }
501 
502  } while (read_data & SPIFLASH_BSY_BIT);
503 
504  return ERROR_OK;
505 }
506 
508 {
509  const int64_t start_time = timeval_ms();
510  uint8_t read_data;
511  int retval;
512 
513  do {
514  uint8_t cmd_data = SPIFLASH_READ_STATUS;
515  retval = max32xxx_qspi_write_bytes(target, &cmd_data, 1, false);
516  if (retval != ERROR_OK) {
517  LOG_ERROR("Failed to write the read status bytes");
518  return retval;
519  }
520 
521  read_data = 0;
522  retval = max32xxx_qspi_read_bytes(target, &read_data, 1, true);
523  if (retval != ERROR_OK) {
524  LOG_ERROR("Failed to read the status bytes");
525  return retval;
526  }
527 
528  // Prevent GDB warnings
529  keep_alive();
530 
531  if (timeval_ms() - start_time > MAX32XXX_QSPI_WE_TIMEOUT_MS) {
532  LOG_ERROR("Timed out waiting for write enable");
533  return ERROR_TIMEOUT_REACHED;
534  }
535 
536  } while (!(read_data & SPIFLASH_WE_BIT));
537 
538  return ERROR_OK;
539 }
540 
541 static int max32xxx_qspi_set_we(struct target *target)
542 {
543  uint8_t cmd_data = SPIFLASH_WRITE_ENABLE;
544 
545  // TODO: Could also be instruction 0x50
546  int retval = max32xxx_qspi_write_bytes(target, &cmd_data, 1, true);
547  if (retval != ERROR_OK) {
548  LOG_ERROR("Failed to write the write-enable bytes");
549  return retval;
550  }
551 
553 }
554 
555 static int max32xxx_qspi_erase(struct flash_bank *bank, unsigned int first,
556  unsigned int last)
557 {
558  struct target *target = bank->target;
559  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
560 
561  LOG_DEBUG("%s: first = %d last = %d\n", __func__, first, last);
562 
563  if (target->state != TARGET_HALTED) {
564  LOG_ERROR("Target not halted");
566  }
567 
568  int retval = max32xxx_qspi_pre_op(bank);
569  if (retval != ERROR_OK)
570  return retval;
571 
572  while (first <= last) {
573  // Set the write enable
574  retval = max32xxx_qspi_set_we(target);
575  if (retval != ERROR_OK) {
576  LOG_ERROR("Failed to set the write-enable bit!");
577  goto exit;
578  }
579 
580  uint8_t cmd_data[5];
581  // Send the erase command
582  cmd_data[0] = max32xxx_qspi_info->dev.erase_cmd;
583  // Address is MSB first
584  uint32_t addr = (first++) * ((max32xxx_qspi_info)->dev.sectorsize);
585 
586  if (max32xxx_qspi_info->dev.erase_cmd == 0xdc) {
587  cmd_data[4] = (addr & 0x000000FF) >> 0;
588  cmd_data[3] = (addr & 0x0000FF00) >> 8;
589  cmd_data[2] = (addr & 0x00FF0000) >> 16;
590  cmd_data[1] = (addr & 0xFF000000) >> 24;
591  retval = max32xxx_qspi_write_bytes(target, cmd_data, 5, true);
592  } else {
593  cmd_data[3] = (addr & 0x0000FF) >> 0;
594  cmd_data[2] = (addr & 0x00FF00) >> 8;
595  cmd_data[1] = (addr & 0xFF0000) >> 16;
596  retval = max32xxx_qspi_write_bytes(target, cmd_data, 4, true);
597  }
598 
599  if (retval != ERROR_OK)
600  goto exit;
601 
602  // Poll WIP until erase is complete
604  if (retval != ERROR_OK) {
605  LOG_ERROR("Flash bank didn't respond to status request after erase");
606  goto exit;
607  }
608  }
609 
610 exit:
611  {
612  int post_retval = max32xxx_qspi_post_op(bank);
613  if (retval == ERROR_OK)
614  retval = post_retval;
615  }
616 
617  return retval;
618 }
619 
621  const uint8_t *buffer, uint32_t offset, uint32_t len)
622 {
623  struct target *target = bank->target;
624  struct working_area *write_algorithm;
625 
626  LOG_DEBUG("max32xxx_write_block bank=%p buffer=%p offset=%08" PRIx32
627  " len=%08" PRIx32 "",
628  bank, buffer, offset, len);
629 
630  // flash write code
631  int retval = target_alloc_working_area(target, sizeof(write_code),
632  &write_algorithm);
633  if (retval != ERROR_OK)
635 
636  // memory buffer
638  struct working_area *source;
639  const uint32_t algo_overhead = SPIX_ALGO_TAIL_SIZE;
640  const uint32_t minimal_buffer_size = algo_overhead + 256;
641 
642  if (buffer_size > 16384)
643  buffer_size = 16384;
644 
645  if (buffer_size <= minimal_buffer_size) {
646  target_free_working_area(target, write_algorithm);
647  LOG_WARNING("Insufficient working area for block write algorithm");
649  }
650 
652  if (retval != ERROR_OK) {
653  target_free_working_area(target, write_algorithm);
655  }
656 
657  retval = target_write_buffer(target, write_algorithm->address,
658  sizeof(write_code), write_code);
659  if (retval != ERROR_OK) {
660  target_free_working_area(target, write_algorithm);
662  return retval;
663  }
664 
665  struct armv7m_algorithm armv7m_info;
666  armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
667  armv7m_info.core_mode = ARM_MODE_THREAD;
668 
669  struct reg_param reg_params[5];
670  init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
671  init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
672  init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
673  init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
674  init_reg_param(&reg_params[4], "sp", 32, PARAM_OUT);
675 
676  buf_set_u32(reg_params[0].value, 0, 32, source->address);
677  buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size);
678  buf_set_u32(reg_params[2].value, 0, 32, len);
679  buf_set_u32(reg_params[3].value, 0, 32, offset);
680  buf_set_u32(reg_params[4].value, 0, 32, source->address + source->size);
681 
682  /* mem_params for options and command live in the shared tail layout. */
683  struct mem_param mem_param[2];
684  const uint32_t tail_base = source->address + source->size - SPIX_ALGO_TAIL_SIZE;
686  tail_base + SPIX_ALGO_OPTIONS_OFFSET, 4,
687  PARAM_OUT);
689  tail_base + SPIX_ALGO_SPI_WRITE_CMD_OFFSET, 4,
690  PARAM_OUT);
691  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
692  buf_set_u32(mem_param[0].value, 0, 32, max32xxx_qspi_info->options);
693  buf_set_u32(mem_param[1].value, 0, 32, max32xxx_qspi_info->dev.pprog_cmd);
694 
695  LOG_DEBUG("max32xxx_write_block source->address=" TARGET_ADDR_FMT
696  " source->size=0x%08" PRIx32,
697  source->address, source->size);
698 
699  const uint32_t source_data_size = source->size - algo_overhead;
700  const uint32_t algo_end = write_algorithm->address + sizeof(write_code) - 2;
701 
703  buffer, len, 1,
705  ARRAY_SIZE(reg_params), reg_params,
706  source->address, source_data_size,
707  write_algorithm->address, algo_end,
708  &armv7m_info);
709 
710  if (retval == ERROR_FLASH_OPERATION_FAILED)
711  LOG_ERROR("error executing max32xxx qspi write algorithm at " TARGET_ADDR_FMT,
712  write_algorithm->address);
713 
714  target_free_working_area(target, write_algorithm);
716  destroy_reg_param(&reg_params[0]);
717  destroy_reg_param(&reg_params[1]);
718  destroy_reg_param(&reg_params[2]);
719  destroy_reg_param(&reg_params[3]);
720  destroy_reg_param(&reg_params[4]);
721 
722  return retval;
723 }
724 
725 static int max32xxx_qspi_write(struct flash_bank *bank, const uint8_t *buffer,
726  uint32_t offset, uint32_t count)
727 {
728  struct target *target = bank->target;
729 
730  LOG_DEBUG("%s: offset=0x%08" PRIx32 " count=0x%08" PRIx32, __func__, offset,
731  count);
732 
733  if (target->state != TARGET_HALTED) {
734  LOG_ERROR("Target not halted");
736  }
737 
738  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
739 
740  if (offset + count > bank->size) {
741  LOG_ERROR("Write beyond end of flash.");
743  }
744 
745  int retval = ERROR_OK;
746  // Determine if we want to use the on-chip algorithm
747  if (max32xxx_qspi_info->options & OPTIONS_ENC || count > 16) {
748  if (max32xxx_qspi_info->options & OPTIONS_AUTH) {
749  /* Need to erase extra length if we're writing authentication data
750  */
751  uint32_t max_sector_plain =
752  (offset + count) / max32xxx_qspi_info->dev.sectorsize;
753  uint32_t max_sector_auth = (offset + count * 10 / 8) /
754  max32xxx_qspi_info->dev.sectorsize;
755  if (max_sector_auth > max_sector_plain) {
756  LOG_WARNING("Erasing extra flash for authentication data");
757  retval = max32xxx_qspi_erase(bank, max_sector_plain,
758  max_sector_auth);
759  if (retval != ERROR_OK)
760  return retval;
761  }
762  }
763 
764  retval = max32xxx_qspi_pre_op(bank);
765  if (retval != ERROR_OK)
766  return retval;
767 
769 
770  if (retval != ERROR_OK) {
771  if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE) {
772  if (max32xxx_qspi_info->options & OPTIONS_ENC) {
773  LOG_ERROR("Must use algorithm in working area for "
774  "encryption");
775  goto exit;
776  }
777  LOG_DEBUG("working area algorithm not available");
778  } else {
779  LOG_ERROR("Error with flash algorithm");
780  goto exit;
781  }
782  } else {
783  goto exit;
784  }
785  } else {
786  retval = max32xxx_qspi_pre_op(bank);
787  if (retval != ERROR_OK)
788  return retval;
789  }
790 
791  // Send the page program command
792  uint8_t cmd_data[5];
793  cmd_data[0] = max32xxx_qspi_info->dev.pprog_cmd;
794 
795  unsigned int buffer_i = 0;
796 
797  while (count - buffer_i) {
798  // Set the write enable
799  retval = max32xxx_qspi_set_we(target);
800  if (retval != ERROR_OK)
801  goto exit;
802 
803  unsigned int write_len = SPI_WRITE_BOUNDARY - (offset % SPI_WRITE_BOUNDARY);
804 
805  if (write_len > count - buffer_i)
806  write_len = count - buffer_i;
807 
808  if (max32xxx_qspi_info->dev.pprog_cmd == 0x12) {
809  cmd_data[4] = (offset & 0x000000FF) >> 0;
810  cmd_data[3] = (offset & 0x0000FF00) >> 8;
811  cmd_data[2] = (offset & 0x00FF0000) >> 16;
812  cmd_data[1] = (offset & 0xFF000000) >> 24;
813  // Write the command
814  retval = max32xxx_qspi_write_bytes(target, cmd_data, 5, false);
815  } else {
816  // Address is MSB first
817  cmd_data[3] = (offset & 0x0000FF) >> 0;
818  cmd_data[2] = (offset & 0x00FF00) >> 8;
819  cmd_data[1] = (offset & 0xFF0000) >> 16;
820  // Write the command
821  retval = max32xxx_qspi_write_bytes(target, cmd_data, 4, false);
822  }
823 
824  if (retval != ERROR_OK)
825  goto exit;
826 
827  // Write the data
829  &buffer[buffer_i], write_len, true);
830  if (retval != ERROR_OK)
831  goto exit;
832 
833  // Increment the pointers
834  buffer_i += write_len;
835  offset += write_len;
836  }
837 
838 exit:
839  {
840  int post_retval = max32xxx_qspi_post_op(bank);
841  if (retval == ERROR_OK)
842  retval = post_retval;
843  }
844 
845  return retval;
846 }
847 
848 static int read_sfdp_block(struct flash_bank *bank, uint32_t addr,
849  uint32_t words, uint32_t *buffer)
850 {
851  struct target *target = bank->target;
852  uint8_t cmd_data[5];
853 
854  // Write the command
855  cmd_data[0] = SPIFLASH_READ_SFDP;
856 
857  // Address is MSB first
858  cmd_data[3] = (addr & 0x0000FF) >> 0;
859  cmd_data[2] = (addr & 0x00FF00) >> 8;
860  cmd_data[1] = (addr & 0xFF0000) >> 16;
861 
862  // 1 dummy bytes
863  cmd_data[4] = 0;
864 
865  int retval = max32xxx_qspi_write_bytes(target, cmd_data, sizeof(cmd_data), false);
866  if (retval != ERROR_OK)
867  return retval;
868 
869  // Read the response, convert words to number of bytes
870  retval = max32xxx_qspi_read_words(target, buffer, words, true);
871 
872  return retval;
873 }
874 
876 {
877  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
878  bool pre_op_done = false;
879 
880  LOG_DEBUG("%s", __func__);
881 
882  if (max32xxx_qspi_info->probed) {
883  bank->size = 0;
884  bank->num_sectors = 0;
885  free(bank->sectors);
886  bank->sectors = NULL;
887  memset(&max32xxx_qspi_info->dev, 0, sizeof(max32xxx_qspi_info->dev));
888  max32xxx_qspi_info->probed = false;
889  }
890 
891  int retval = max32xxx_qspi_pre_op(bank);
892  if (retval != ERROR_OK)
893  return retval;
894  pre_op_done = true;
895 
896  struct target *target = bank->target;
897  uint32_t temp32;
898  retval = target_read_u32(target, SPIXFC_CFG, &temp32);
899  if (retval != ERROR_OK)
900  goto exit;
901  LOG_DEBUG("SPIXFC_CFG = 0x%08X", temp32);
902 
903  retval = target_read_u32(target, SPIXFC_SS_POL, &temp32);
904  if (retval != ERROR_OK)
905  goto exit;
906  LOG_DEBUG("SPIXFC_SS_POL = 0x%08X", temp32);
907 
908  retval = target_read_u32(target, SPIXFC_GEN_CTRL, &temp32);
909  if (retval != ERROR_OK)
910  goto exit;
911  LOG_DEBUG("SPIXFC_GEN_CTRL = 0x%08X", temp32);
912 
913  retval = target_read_u32(target, SPIXFC_FIFO_CTRL, &temp32);
914  if (retval != ERROR_OK)
915  goto exit;
916  LOG_DEBUG("SPIXFC_FIFO_CTRL = 0x%08X", temp32);
917 
918  // Read the SFDP settings from the flash device
919  struct flash_device temp_flash_device;
920  retval = spi_sfdp(bank, &temp_flash_device, &read_sfdp_block);
921  if (retval != ERROR_OK)
922  goto exit;
923  LOG_INFO("max32xxx flash \'%s\' size = %" PRIu32 " kbytes",
924  temp_flash_device.name, temp_flash_device.size_in_bytes / 1024);
925 
926  max32xxx_qspi_info->dev = temp_flash_device;
927 
928  // Read the device ID
929  uint8_t cmd = SPIFLASH_READ_ID;
930  retval = max32xxx_qspi_write_bytes(target, &cmd, 1, false);
931  if (retval != ERROR_OK)
932  goto exit;
933 
935  (uint8_t *)&max32xxx_qspi_info->dev.device_id, 3, true);
936  if (retval != ERROR_OK)
937  goto exit;
938 
939  // Set correct size value
940  bank->size = max32xxx_qspi_info->dev.size_in_bytes;
941  bank->write_start_alignment =
942  (max32xxx_qspi_info->options & OPTIONS_AUTH) ? 0x80 : 16;
943  bank->write_end_alignment = bank->write_start_alignment;
944 
945  // TODO: Get more than 1 erase command
946 
947  // Create and fill sectors array
948  bank->num_sectors = max32xxx_qspi_info->dev.size_in_bytes /
949  max32xxx_qspi_info->dev.sectorsize;
950  struct flash_sector *sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
951  if (!sectors) {
952  LOG_ERROR("not enough memory");
953  retval = ERROR_FAIL;
954  goto exit;
955  }
956 
957  for (unsigned int sector = 0; sector < bank->num_sectors; sector++) {
958  sectors[sector].offset = sector * max32xxx_qspi_info->dev.sectorsize;
959  sectors[sector].size = max32xxx_qspi_info->dev.sectorsize;
960  sectors[sector].is_erased = -1;
961  sectors[sector].is_protected = 0;
962  }
963 
964  bank->sectors = sectors;
965 
966  max32xxx_qspi_info->probed = true;
967 
968  // Setup memory mapped mode
969  retval = max32xxx_qspi_post_op(bank);
970  if (retval != ERROR_OK)
971  goto exit;
972  pre_op_done = false;
973 
974  retval = target_read_u32(target, SPIXF_CFG, &temp32);
975  if (retval != ERROR_OK)
976  goto exit;
977  LOG_DEBUG("SPIXF_CFG = 0x%08X", temp32);
978  retval = target_read_u32(target, SPIXF_FETCH_CTRL, &temp32);
979  if (retval != ERROR_OK)
980  goto exit;
981  LOG_DEBUG("SPIXF_FETCH_CTRL = 0x%08X", temp32);
982  retval = target_read_u32(target, SPIXF_MODE_CTRL, &temp32);
983  if (retval != ERROR_OK)
984  goto exit;
985  LOG_DEBUG("SPIXF_MODE_CTRL = 0x%08X", temp32);
986  retval = target_read_u32(target, SPIXF_MODE_DATA, &temp32);
987  if (retval != ERROR_OK)
988  goto exit;
989  LOG_DEBUG("SPIXF_MODE_DATA = 0x%08X", temp32);
990  retval = target_read_u32(target, SPIXF_SCLK_FB_CTRL, &temp32);
991  if (retval != ERROR_OK)
992  goto exit;
993  LOG_DEBUG("SPIXF_SCLK_FB_CTRL = 0x%08X", temp32);
994  retval = target_read_u32(target, SPIXF_IO_CTRL, &temp32);
995  if (retval != ERROR_OK)
996  goto exit;
997  LOG_DEBUG("SPIXF_IO_CTRL = 0x%08X", temp32);
998  retval = target_read_u32(target, SPIXF_MEMSECCN, &temp32);
999  if (retval != ERROR_OK)
1000  goto exit;
1001  LOG_DEBUG("SPIXF_MEMSECCN = 0x%08X", temp32);
1002  retval = target_read_u32(target, SPIXF_BUS_IDLE, &temp32);
1003  if (retval != ERROR_OK)
1004  goto exit;
1005  LOG_DEBUG("SPIXF_BUS_IDLE = 0x%08X", temp32);
1006 
1007 exit:
1008  if (pre_op_done) {
1009  int post_retval = max32xxx_qspi_post_op(bank);
1010  if (retval == ERROR_OK)
1011  retval = post_retval;
1012  }
1013 
1014  return retval;
1015 }
1016 
1018 {
1019  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
1020 
1021  if (max32xxx_qspi_info->probed)
1022  return ERROR_OK;
1023  return max32xxx_qspi_probe(bank);
1024 }
1025 
1026 COMMAND_HANDLER(max32xxx_qspi_handle_mem_mapping_setup_command)
1027 {
1028  int retval;
1029 
1030  struct flash_bank *bank;
1031  retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1032  if (retval != ERROR_OK)
1033  return retval;
1034 
1035  return max32xxx_qspi_post_op(bank);
1036 }
1037 
1038 COMMAND_HANDLER(max32xxx_qspi_handle_mass_erase_command)
1039 {
1040  struct flash_bank *bank;
1041 
1042  LOG_DEBUG("%s", __func__);
1043 
1044  if (CMD_ARGC != 1)
1046 
1047  int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1048  if (retval != ERROR_OK)
1049  return retval;
1050 
1051  struct target *target = bank->target;
1052  if (target->state != TARGET_HALTED) {
1053  LOG_ERROR("Target not halted");
1054  return ERROR_TARGET_NOT_HALTED;
1055  }
1056 
1057  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
1058  if (!(max32xxx_qspi_info->probed)) {
1059  LOG_ERROR("Flash bank not probed");
1061  }
1062 
1063  if (max32xxx_qspi_info->dev.chip_erase_cmd == 0x00) {
1064  LOG_ERROR("Mass erase not available for this device");
1066  }
1067 
1068  retval = max32xxx_qspi_pre_op(bank);
1069  if (retval != ERROR_OK)
1070  return retval;
1071 
1072  // Set the write enable
1073  retval = max32xxx_qspi_set_we(target);
1074  if (retval != ERROR_OK)
1075  goto exit;
1076 
1077  // Send the mass erase command
1078  uint8_t cmd_data[1];
1079  cmd_data[0] = max32xxx_qspi_info->dev.chip_erase_cmd;
1080 
1081  retval = max32xxx_qspi_write_bytes(target, cmd_data, 1, true);
1082  if (retval != ERROR_OK)
1083  goto exit;
1084 
1085  // Poll WIP until erase is complete
1087 
1088 exit:
1089  {
1090  int post_retval = max32xxx_qspi_post_op(bank);
1091  if (retval == ERROR_OK)
1092  retval = post_retval;
1093  }
1094 
1095  return retval;
1096 }
1097 
1099  struct command_invocation *cmd)
1100 {
1101  struct max32xxx_qspi_flash_bank *max32xxx_qspi_info = bank->driver_priv;
1102 
1103  if (!(max32xxx_qspi_info->probed)) {
1104  command_print_sameline(cmd, "\nQSPI flash bank not probed yet\n");
1106  }
1107 
1108  command_print_sameline(cmd, "\nQSPI flash:\n");
1109 
1110  command_print_sameline(cmd, " name : \'%s\'\n",
1111  max32xxx_qspi_info->dev.name);
1112  command_print_sameline(cmd, " ID : 0x%06" PRIx32 "\n",
1113  max32xxx_qspi_info->dev.device_id);
1114  command_print_sameline(cmd, " size : 0x%08" PRIx32 " B\n",
1115  max32xxx_qspi_info->dev.size_in_bytes);
1116  command_print_sameline(cmd, " page size : 0x%08" PRIx32 " B\n",
1117  max32xxx_qspi_info->dev.pagesize);
1118  command_print_sameline(cmd, " sector size : 0x%08" PRIx32 " B\n",
1119  max32xxx_qspi_info->dev.sectorsize);
1120  command_print_sameline(cmd, " read cmd : 0x%02" PRIx32 "\n",
1121  max32xxx_qspi_info->dev.read_cmd);
1122  command_print_sameline(cmd, " dread cmd : 0x%02" PRIx32 "\n",
1123  max32xxx_qspi_info->dev.dread_cmd);
1124  command_print_sameline(cmd, " dread mode : 0x%02" PRIx32 "\n",
1125  max32xxx_qspi_info->dev.dread_mode);
1126  command_print_sameline(cmd, " dread dclk : 0x%02" PRIx32 "\n",
1127  max32xxx_qspi_info->dev.dread_dclk);
1128  command_print_sameline(cmd, " qread cmd : 0x%02" PRIx32 "\n",
1129  max32xxx_qspi_info->dev.qread_cmd);
1130  command_print_sameline(cmd, " pprog cmd : 0x%02" PRIx32 "\n",
1131  max32xxx_qspi_info->dev.pprog_cmd);
1132  command_print_sameline(cmd, " erase cmd : 0x%02" PRIx32 "\n",
1133  max32xxx_qspi_info->dev.erase_cmd);
1134  command_print_sameline(cmd, " chip_erase cmd: 0x%02" PRIx32 "\n",
1135  max32xxx_qspi_info->dev.chip_erase_cmd);
1136 
1137  return ERROR_OK;
1138 }
1139 
1141  {
1142  .name = "mem_mapping_setup",
1143  .handler = max32xxx_qspi_handle_mem_mapping_setup_command,
1144  .mode = COMMAND_EXEC,
1145  .usage = "",
1146  .help = "Setup memory-mapped QSPI access.",
1147  },
1148  {
1149  .name = "mass_erase",
1150  .handler = max32xxx_qspi_handle_mass_erase_command,
1151  .mode = COMMAND_EXEC,
1152  .usage = "bank_id",
1153  .help = "Mass erase entire flash device.",
1154  },
1156 };
1157 
1158 static const struct command_registration max32xxx_qspi_command_handlers[] = {
1159  {
1160  .name = "max32xxx_qspi",
1161  .mode = COMMAND_ANY,
1162  .help = "max32xxx_qspi flash command group",
1163  .usage = "",
1165  },
1167 };
1168 
1169 const struct flash_driver max32xxx_qspi_flash = {
1170  .name = "max32xxx_qspi",
1171  .commands = max32xxx_qspi_command_handlers,
1172  .flash_bank_command = max32xxx_qspi_flash_bank_command,
1173  .erase = max32xxx_qspi_erase,
1174  .protect = NULL,
1175  .write = max32xxx_qspi_write,
1176  .read = default_flash_read,
1177  .verify = default_flash_verify,
1178  .probe = max32xxx_qspi_probe,
1179  .auto_probe = max32xxx_qspi_auto_probe,
1180  .erase_check = default_flash_blank_check,
1181  .protect_check = NULL,
1182  .info = get_max32xxx_qspi_info,
1183  .free_driver_priv = default_flash_free_driver_priv,
1184 };
void init_reg_param(struct reg_param *param, const char *reg_name, uint32_t size, enum param_direction direction)
Definition: algorithm.c:29
void destroy_reg_param(struct reg_param *param)
Definition: algorithm.c:38
void init_mem_param(struct mem_param *param, uint32_t address, uint32_t size, enum param_direction direction)
Definition: algorithm.c:15
@ PARAM_OUT
Definition: algorithm.h:16
@ ARM_MODE_THREAD
Definition: arm.h:94
#define ARMV7M_COMMON_MAGIC
Definition: armv7m.h:229
Support functions to access arbitrary bits in a byte array.
static void buf_set_u32(uint8_t *_buffer, unsigned int first, unsigned int num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:34
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
Definition: command.c:378
#define CALL_COMMAND_HANDLER(name, extra ...)
Use this to macro to call a command helper (or a nested handler).
Definition: command.h:123
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:161
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:405
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:156
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
Definition: command.h:445
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:256
@ COMMAND_ANY
Definition: command.h:42
@ COMMAND_EXEC
Definition: command.h:40
uint64_t buffer
Pointer to data buffer to send over SPI.
Definition: dw-spi-helper.h:0
uint32_t buffer_size
Size of dw_spi_program::buffer.
Definition: dw-spi-helper.h:5
uint8_t bank
Definition: esirisc.c:135
#define ERROR_FLASH_OPER_UNSUPPORTED
Definition: flash/common.h:36
#define ERROR_FLASH_BANK_NOT_PROBED
Definition: flash/common.h:35
#define ERROR_FLASH_OPERATION_FAILED
Definition: flash/common.h:30
#define ERROR_FLASH_DST_OUT_OF_BANK
Definition: flash/common.h:31
int default_flash_verify(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default verify implementation for flash memory.
int default_flash_blank_check(struct flash_bank *bank)
Provides default erased-bank check handling.
int default_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default read implementation for flash memory.
void default_flash_free_driver_priv(struct flash_bank *bank)
Deallocates bank->driver_priv.
void keep_alive(void)
Definition: log.c:437
#define LOG_WARNING(expr ...)
Definition: log.h:144
#define ERROR_FAIL
Definition: log.h:188
#define LOG_ERROR(expr ...)
Definition: log.h:147
#define ERROR_TIMEOUT_REACHED
Definition: log.h:191
#define LOG_INFO(expr ...)
Definition: log.h:141
#define LOG_DEBUG(expr ...)
Definition: log.h:124
#define ERROR_OK
Definition: log.h:182
#define OPTIONS_ENC
#define OPTIONS_AUTH
#define GCR_RST1_SPIXIP
Definition: max32xxx_qspi.c:60
static int max32xxx_qspi_read_rxfifo(struct target *target, uint8_t *data, unsigned int len)
#define SPIXF_IO_CTRL
Definition: max32xxx_qspi.c:40
static int max32xxx_qspi_read_words(struct target *target, uint32_t *data, unsigned int len, bool deass)
static int max32xxx_qspi_probe(struct flash_bank *bank)
#define SPIXF_MODE_CTRL
Definition: max32xxx_qspi.c:37
#define SPIXF_MEMSECCN_AUTH_DISABLE
Definition: max32xxx_qspi.c:45
static int max32xxx_qspi_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
const struct flash_driver max32xxx_qspi_flash
#define SPIXFC_FIFO_DEPTH
Definition: max32xxx_qspi.c:30
static int max32xxx_qspi_post_op(struct flash_bank *bank)
static const uint8_t write_code[]
Definition: max32xxx_qspi.c:76
#define MAX32XXX_QSPI_FIFO_TIMEOUT_MS
Definition: max32xxx_qspi.c:69
static int read_sfdp_block(struct flash_bank *bank, uint32_t addr, uint32_t words, uint32_t *buffer)
#define SPIXF_SCLK_FB_CTRL
Definition: max32xxx_qspi.c:39
#define MAX32XXX_QSPI_MASS_ERASE_TIMEOUT_MS
Definition: max32xxx_qspi.c:66
#define MAX32XXX_QSPI_ERASE_TIMEOUT_MS
Definition: max32xxx_qspi.c:67
#define SPIXF_MEMSECCN
Definition: max32xxx_qspi.c:41
#define SPIXF_CFG
Definition: max32xxx_qspi.c:35
static const struct command_registration max32xxx_qspi_command_handlers[]
#define SPI_ICC_CTRL_RDY
Definition: max32xxx_qspi.c:54
static int max32xxx_qspi_write_txfifo(struct target *target, const uint8_t *data, unsigned int len)
#define SPI_ICC_INV
Definition: max32xxx_qspi.c:49
#define MAX32XXX_QSPI_WE_TIMEOUT_MS
Definition: max32xxx_qspi.c:68
#define SPIXF_MEMSECCN_ENC_ENABLE
Definition: max32xxx_qspi.c:44
static int max32xxx_qspi_auto_probe(struct flash_bank *bank)
static int max32xxx_qspi_poll_wip(struct target *target, unsigned int timeout)
static int max32xxx_qspi_pre_op(struct flash_bank *bank)
static int max32xxx_qspi_write_bytes(struct target *target, const uint8_t *data, unsigned int len, bool deass)
static int max32xxx_qspi_write_block(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t len)
static int max32xxx_qspi_read_bytes(struct target *target, uint8_t *data, unsigned int len, bool deass)
static const struct command_registration max32xxx_qspi_exec_command_handlers[]
#define SPI_ICC_CTRL_EN
Definition: max32xxx_qspi.c:52
#define SPI_CLOCK_PERIOD
Definition: max32xxx_qspi.c:63
static int get_max32xxx_qspi_info(struct flash_bank *bank, struct command_invocation *cmd)
#define SPIXF_FETCH_CTRL
Definition: max32xxx_qspi.c:36
static int max32xxx_qspi_poll_we(struct target *target)
#define SPIXF_MODE_DATA
Definition: max32xxx_qspi.c:38
static int max32xxx_qspi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
#define GCR_SCON
Definition: max32xxx_qspi.c:57
FLASH_BANK_COMMAND_HANDLER(max32xxx_qspi_flash_bank_command)
Definition: max32xxx_qspi.c:87
#define GCR_RST1_XSPIM
Definition: max32xxx_qspi.c:59
COMMAND_HANDLER(max32xxx_qspi_handle_mem_mapping_setup_command)
#define GCR_RST1
Definition: max32xxx_qspi.c:58
#define SPIXFC_HEADER_NULL
Definition: max32xxx_qspi.c:32
#define SPIXF_BUS_IDLE
Definition: max32xxx_qspi.c:42
#define SPI_ICC_CTRL
Definition: max32xxx_qspi.c:48
#define SPI_DUAL_MODE
Definition: max32xxx_qspi.c:73
static int max32xxx_qspi_set_we(struct target *target)
#define SPIXFC_SS_POL
#define SPI_WRITE_BOUNDARY
#define SPIXFC_HEADER_BYTE
#define SPIXFC_HEADER_PAGE
#define SPIXFC_CFG
#define SPIX_ALGO_OPTIONS_OFFSET
#define SPIXFC_FIFO_TX
#define SPIXFC_HEADER_RX
#define SPIXFC_HEADER_SS_DEASS
#define SPIXFC_FIFO_CTRL
#define SPIXFC_HEADER_TX
#define SPIXFC_FIFO_CTRL_TX_FIFO_CNT
#define SPIXFC_HEADER_SIZE_POS
#define SPIXFC_CONFIG_PAGE_SIZE_4_BYTES
#define SPIXFC_FIFO_CTRL_RX_FIFO_CNT_POS
#define SPIX_ALGO_TAIL_SIZE
#define SPIXFC_FIFO_RX
#define SPIXFC_FIFO_CTRL_RX_FIFO_CNT
#define SPIXFC_GEN_CTRL
#define SPIXFC_CONFIG_PAGE_SIZE
#define SPIXFC_FIFO_CTRL_TX_FIFO_CNT_POS
#define SPIX_ALGO_SPI_WRITE_CMD_OFFSET
target_addr_t addr
Start address to search for the control block.
Definition: rtt/rtt.c:28
struct rtt_source source
Definition: rtt/rtt.c:23
int spi_sfdp(struct flash_bank *bank, struct flash_device *dev, read_sfdp_block_t read_sfdp_block)
Definition: sfdp.c:60
#define SPIFLASH_READ_SFDP
Definition: spi.h:83
#define SPIFLASH_READ_STATUS
Definition: spi.h:77
#define SPIFLASH_READ_ID
Definition: spi.h:75
#define SPIFLASH_WRITE_ENABLE
Definition: spi.h:78
#define SPIFLASH_WE_BIT
Definition: spi.h:72
#define SPIFLASH_BSY_BIT
Definition: spi.h:70
unsigned int common_magic
Definition: armv7m.h:306
enum arm_mode core_mode
Definition: armv7m.h:308
When run_command is called, a new instance will be created on the stack, filled with the proper value...
Definition: command.h:76
const char * name
Definition: command.h:239
Provides details of a flash bank, available either on-chip or through a major interface.
Definition: nor/core.h:75
uint8_t dread_mode
Definition: spi.h:24
uint8_t read_cmd
Definition: spi.h:22
uint32_t sectorsize
Definition: spi.h:32
uint32_t device_id
Definition: spi.h:30
uint8_t chip_erase_cmd
Definition: spi.h:29
const char * name
Definition: spi.h:21
uint32_t pagesize
Definition: spi.h:31
uint32_t size_in_bytes
Definition: spi.h:33
uint8_t pprog_cmd
Definition: spi.h:27
uint8_t dread_dclk
Definition: spi.h:25
uint8_t erase_cmd
Definition: spi.h:28
uint8_t qread_cmd
Definition: spi.h:26
uint8_t dread_cmd
Definition: spi.h:23
Provides the implementation-independent structure that defines all of the callbacks required by OpenO...
Definition: nor/driver.h:39
const char * name
Gives a human-readable name of this flash driver, This field is used to select and initialize the dri...
Definition: nor/driver.h:44
Describes the geometry and status of a single flash sector within a flash bank.
Definition: nor/core.h:28
int is_erased
Indication of erasure status: 0 = not erased, 1 = erased, other = unknown.
Definition: nor/core.h:42
uint32_t offset
Bus offset from start of the flash chip (in bytes).
Definition: nor/core.h:30
int is_protected
Indication of protection status: 0 = unprotected/unlocked, 1 = protected/locked, other = unknown.
Definition: nor/core.h:55
uint32_t size
Number of bytes in this flash sector.
Definition: nor/core.h:32
struct flash_device dev
Definition: max32xxx_qspi.c:83
uint8_t * value
Definition: algorithm.h:30
Definition: target.h:119
enum target_state state
Definition: target.h:167
Definition: psoc6.c:83
target_addr_t address
Definition: target.h:89
int target_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
Definition: target.c:2410
int target_write_u16(struct target *target, target_addr_t address, uint16_t value)
Definition: target.c:2693
int target_read_u8(struct target *target, target_addr_t address, uint8_t *value)
Definition: target.c:2642
uint32_t target_get_working_area_avail(struct target *target)
Definition: target.c:2220
int target_alloc_working_area(struct target *target, uint32_t size, struct working_area **area)
Definition: target.c:2118
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
Definition: target.c:2676
int target_free_working_area(struct target *target, struct working_area *area)
Free a working area.
Definition: target.c:2174
int target_run_flash_async_algorithm(struct target *target, const uint8_t *buffer, uint32_t count, int block_size, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, uint32_t buffer_start, uint32_t buffer_size, uint32_t entry_point, uint32_t exit_point, void *arch_info)
Streams data to a circular buffer on target intended for consumption by code running asynchronously o...
Definition: target.c:946
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
Definition: target.c:2602
static void write_data(FILE *f, const void *data, size_t len)
Definition: target.c:4210
#define ERROR_TARGET_NOT_HALTED
Definition: target.h:818
@ TARGET_HALTED
Definition: target.h:58
#define ERROR_TARGET_RESOURCE_NOT_AVAILABLE
Definition: target.h:822
int64_t timeval_ms(void)
#define TARGET_ADDR_FMT
Definition: types.h:286
#define ARRAY_SIZE(x)
Compute the number of elements of a variable length array.
Definition: types.h:57
static struct ublast_lowlevel_priv info
#define NULL
Definition: usb.h:16
uint8_t cmd
Definition: vdebug.c:1
uint8_t offset[4]
Definition: vdebug.c:9
uint8_t count[4]
Definition: vdebug.c:22