OpenOCD
at91sam7.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2006 by Magnus Lundin *
5  * lundin@mlu.mine.nu *
6  * *
7  * Copyright (C) 2008 by Gheorghe Guran (atlas) *
8 ****************************************************************************/
9 
10 /***************************************************************************
11 *
12 * New flash setup command:
13 *
14 * flash bank <driver> <base_addr> <size> <chip_width> <bus_width> <target_id>
15 * [<chip_type> <banks>
16 * <sectors_per_bank> <pages_per_sector>
17 * <page_size> <num_nvmbits>
18 * <ext_freq_khz>]
19 *
20 * <ext_freq_khz> - MUST be used if clock is from external source,
21 * CAN be used if main oscillator frequency is known (recommended)
22 * Examples:
23 * ==== RECOMMENDED (covers clock speed) ============
24 * flash bank at91sam7 0x00100000 0 0 4 $_TARGETNAME AT91SAM7XC256 1 16 64 256 3 25000
25 * (if auto-detect fails; provides clock spec)
26 * flash bank at91sam7 0 0 0 0 $_TARGETNAME 0 0 0 0 0 0 25000
27 * (auto-detect everything except the clock)
28 * ==== NOT RECOMMENDED !!! (clock speed is not configured) ====
29 * flash bank at91sam7 0x00100000 0 0 4 $_TARGETNAME AT91SAM7XC256 1 16 64 256 3 0
30 * (if auto-detect fails)
31 * flash bank at91sam7 0 0 0 0 $_TARGETNAME
32 * (old style, auto-detect everything)
33 ****************************************************************************/
34 
35 #ifdef HAVE_CONFIG_H
36 #include "config.h"
37 #endif
38 
39 #include "imp.h"
40 #include <helper/binarybuffer.h>
41 
42 /* AT91SAM7 control registers */
43 #define DBGU_CIDR 0xFFFFF240
44 #define CKGR_MCFR 0xFFFFFC24
45 #define CKGR_MOR 0xFFFFFC20
46 #define CKGR_MCFR_MAINRDY 0x10000
47 #define CKGR_PLLR 0xFFFFFC2c
48 #define CKGR_PLLR_DIV 0xff
49 #define CKGR_PLLR_MUL 0x07ff0000
50 #define PMC_MCKR 0xFFFFFC30
51 #define PMC_MCKR_CSS 0x03
52 #define PMC_MCKR_PRES 0x1c
53 
54 /* Flash Controller Commands */
55 #define WP 0x01
56 #define SLB 0x02
57 #define WPL 0x03
58 #define CLB 0x04
59 #define EA 0x08
60 #define SGPB 0x0B
61 #define CGPB 0x0D
62 #define SSB 0x0F
63 
64 /* MC_FSR bit definitions */
65 #define MC_FSR_FRDY 1
66 #define MC_FSR_EOL 2
67 
68 /* AT91SAM7 constants */
69 #define RC_FREQ 32000
70 
71 /* Flash timing modes */
72 #define FMR_TIMING_NONE 0
73 #define FMR_TIMING_NVBITS 1
74 #define FMR_TIMING_FLASH 2
75 
76 /* Flash size constants */
77 #define FLASH_SIZE_8KB 1
78 #define FLASH_SIZE_16KB 2
79 #define FLASH_SIZE_32KB 3
80 #define FLASH_SIZE_64KB 5
81 #define FLASH_SIZE_128KB 7
82 #define FLASH_SIZE_256KB 9
83 #define FLASH_SIZE_512KB 10
84 #define FLASH_SIZE_1024KB 12
85 #define FLASH_SIZE_2048KB 14
86 
87 static int at91sam7_protect_check(struct flash_bank *bank);
88 static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset,
89  uint32_t count);
90 
91 static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number);
92 static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode);
93 static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout);
94 static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen);
95 
96 static const uint32_t mc_fmr[4] = { 0xFFFFFF60, 0xFFFFFF70, 0xFFFFFF80, 0xFFFFFF90 };
97 static const uint32_t mc_fcr[4] = { 0xFFFFFF64, 0xFFFFFF74, 0xFFFFFF84, 0xFFFFFF94 };
98 static const uint32_t mc_fsr[4] = { 0xFFFFFF68, 0xFFFFFF78, 0xFFFFFF88, 0xFFFFFF98 };
99 
100 static const char *eproc[8] = {
101  "Unknown", "ARM946-E", "ARM7TDMI", "Unknown", "ARM920T", "ARM926EJ-S", "Unknown", "Unknown"
102 };
103 
105  /* chip id register */
106  uint32_t cidr;
107  uint16_t cidr_ext;
108  uint16_t cidr_nvptyp;
109  uint16_t cidr_arch;
110  uint16_t cidr_sramsiz;
111  uint16_t cidr_nvpsiz;
112  uint16_t cidr_nvpsiz2;
113  uint16_t cidr_eproc;
114  uint16_t cidr_version;
115  const char *target_name;
116 
117  /* flash auto-detection */
119 
120  /* flash geometry */
122  uint16_t pagesize;
124 
125  /* nv memory bits */
126  uint16_t num_lockbits_on;
127  uint16_t lockbits;
128  uint16_t num_nvmbits;
129  uint16_t num_nvmbits_on;
130  uint16_t nvmbits;
131  uint8_t securitybit;
132 
133  /* 0: not init
134  * 1: fmcn for nvbits (1uS)
135  * 2: fmcn for flash (1.5uS) */
136  uint8_t flashmode;
137 
138  /* main clock status */
139  uint8_t mck_valid;
140  uint32_t mck_freq;
141 
142  /* external clock frequency */
143  uint32_t ext_freq;
144 
145 };
146 
147 #if 0
148 static long SRAMSIZ[16] = {
149  -1,
150  0x0400, /* 1K */
151  0x0800, /* 2K */
152  -1,
153  0x1c000, /* 112K */
154  0x1000, /* 4K */
155  0x14000, /* 80K */
156  0x28000, /* 160K */
157  0x2000, /* 8K */
158  0x4000, /* 16K */
159  0x8000, /* 32K */
160  0x10000, /* 64K */
161  0x20000, /* 128K */
162  0x40000, /* 256K */
163  0x18000, /* 96K */
164  0x80000, /* 512K */
165 };
166 #endif
167 
168 static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number)
169 {
170  uint32_t fsr;
171  target_read_u32(target, mc_fsr[bank_number], &fsr);
172 
173  return fsr;
174 }
175 
176 /* Read clock configuration and set at91sam7_info->mck_freq */
178 {
179  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
180  struct target *target = bank->target;
181  uint32_t mckr, mcfr, pllr, mor;
182  unsigned long tmp = 0, mainfreq;
183 
184  /* Read Clock Generator Main Oscillator Register */
186  /* Read Clock Generator Main Clock Frequency Register */
188  /* Read Master Clock Register*/
190  /* Read Clock Generator PLL Register */
192 
193  at91sam7_info->mck_valid = 0;
194  at91sam7_info->mck_freq = 0;
195  switch (mckr & PMC_MCKR_CSS) {
196  case 0: /* Slow Clock */
197  at91sam7_info->mck_valid = 1;
198  tmp = RC_FREQ;
199  break;
200 
201  case 1: /* Main Clock */
202  if ((mcfr & CKGR_MCFR_MAINRDY) && at91sam7_info->ext_freq == 0) {
203  at91sam7_info->mck_valid = 1;
204  tmp = RC_FREQ / 16ul * (mcfr & 0xffff);
205  } else if (at91sam7_info->ext_freq != 0) {
206  at91sam7_info->mck_valid = 1;
207  tmp = at91sam7_info->ext_freq;
208  }
209  break;
210 
211  case 2: /* Reserved */
212  break;
213 
214  case 3: /* PLL Clock */
215  if ((mcfr & CKGR_MCFR_MAINRDY) && at91sam7_info->ext_freq == 0) {
217  if (!(pllr & CKGR_PLLR_DIV))
218  break; /* 0 Hz */
219  at91sam7_info->mck_valid = 1;
220  mainfreq = RC_FREQ / 16ul * (mcfr & 0xffff);
221  /* Integer arithmetic should have sufficient precision
222  * as long as PLL is properly configured. */
223  tmp = mainfreq / (pllr & CKGR_PLLR_DIV) *
224  (((pllr & CKGR_PLLR_MUL) >> 16) + 1);
225  } else if ((at91sam7_info->ext_freq != 0) && ((pllr & CKGR_PLLR_DIV) != 0)) {
226  at91sam7_info->mck_valid = 1;
227  tmp = at91sam7_info->ext_freq / (pllr & CKGR_PLLR_DIV) *
228  (((pllr & CKGR_PLLR_MUL) >> 16) + 1);
229  }
230  break;
231  }
232 
233  /* Prescaler adjust */
234  if ((((mckr & PMC_MCKR_PRES) >> 2) == 7) || (tmp == 0)) {
235  at91sam7_info->mck_valid = 0;
236  at91sam7_info->mck_freq = 0;
237  } else if (((mckr & PMC_MCKR_PRES) >> 2) != 0)
238  at91sam7_info->mck_freq = tmp >> ((mckr & PMC_MCKR_PRES) >> 2);
239  else
240  at91sam7_info->mck_freq = tmp;
241 }
242 
243 /* Setup the timing registers for nvbits or normal flash */
244 static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode)
245 {
246  uint32_t fmr, fmcn = 0, fws = 0;
247  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
248  struct target *target = bank->target;
249 
250  if (mode && (mode != at91sam7_info->flashmode)) {
251  /* Always round up (ceil) */
252  if (mode == FMR_TIMING_NVBITS) {
253  if (at91sam7_info->cidr_arch == 0x60) {
254  /* AT91SAM7A3 uses master clocks in 100 ns */
255  fmcn = (at91sam7_info->mck_freq/10000000ul) + 1;
256  } else {
257  /* master clocks in 1uS for ARCH 0x7 types */
258  fmcn = (at91sam7_info->mck_freq/1000000ul) + 1;
259  }
260  } else if (mode == FMR_TIMING_FLASH) {
261  /* main clocks in 1.5uS */
262  fmcn = (at91sam7_info->mck_freq/1000000ul)+
263  (at91sam7_info->mck_freq/2000000ul) + 1;
264  }
265 
266  /* hard overclocking */
267  if (fmcn > 0xFF)
268  fmcn = 0xFF;
269 
270  /* Only allow fmcn = 0 if clock period is > 30 us = 33kHz. */
271  if (at91sam7_info->mck_freq <= 33333ul)
272  fmcn = 0;
273  /* Only allow fws = 0 if clock frequency is < 30 MHz. */
274  if (at91sam7_info->mck_freq > 30000000ul)
275  fws = 1;
276 
277  LOG_DEBUG("fmcn[%u]: %" PRIu32, bank->bank_number, fmcn);
278  fmr = fmcn << 16 | fws << 8;
279  target_write_u32(target, mc_fmr[bank->bank_number], fmr);
280  }
281 
282  at91sam7_info->flashmode = mode;
283 }
284 
285 static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout)
286 {
287  uint32_t status;
288 
289  while ((!((status = at91sam7_get_flash_status(bank->target,
290  bank->bank_number)) & waitbits)) && (timeout-- > 0)) {
291  LOG_DEBUG("status[%u]: 0x%" PRIx32, bank->bank_number, status);
292  alive_sleep(1);
293  }
294 
295  LOG_DEBUG("status[%u]: 0x%" PRIx32, bank->bank_number, status);
296 
297  if (status & 0x0C) {
298  LOG_ERROR("status register: 0x%" PRIx32, status);
299  if (status & 0x4)
300  LOG_ERROR("Lock Error Bit Detected, Operation Abort");
301  if (status & 0x8)
302  LOG_ERROR("Invalid command and/or bad keyword, Operation Abort");
303  if (status & 0x10)
304  LOG_ERROR("Security Bit Set, Operation Abort");
305  }
306 
307  return status;
308 }
309 
310 /* Send one command to the AT91SAM flash controller */
311 static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen)
312 {
313  uint32_t fcr;
314  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
315  struct target *target = bank->target;
316 
317  fcr = (0x5A << 24) | ((pagen&0x3FF) << 8) | cmd;
318  target_write_u32(target, mc_fcr[bank->bank_number], fcr);
319  LOG_DEBUG("Flash command: 0x%" PRIx32 ", flash bank: %u, page number: %" PRIu16,
320  fcr,
321  bank->bank_number + 1,
322  pagen);
323 
324  if ((at91sam7_info->cidr_arch == 0x60) && ((cmd == SLB) | (cmd == CLB))) {
325  /* Lock bit manipulation on AT91SAM7A3 waits for FC_FSR bit 1, EOL */
328  return ERROR_OK;
329  }
330 
333 
334  return ERROR_OK;
335 }
336 
337 /* Read device id register, main clock frequency register and fill in driver info structure */
339 {
340  struct at91sam7_flash_bank *at91sam7_info;
341  struct target *target = bank->target;
342 
343  uint16_t bnk, sec;
344  uint16_t arch;
345  uint32_t cidr;
346  uint8_t banks_num = 0;
347  uint16_t num_nvmbits = 0;
348  uint16_t sectors_num = 0;
349  uint16_t pages_per_sector = 0;
350  uint16_t page_size = 0;
351  uint32_t ext_freq;
352  uint32_t bank_size;
353  uint32_t base_address = 0;
354  char *target_name_t = "Unknown";
355 
356  at91sam7_info = bank->driver_priv;
357 
358  if (at91sam7_info->cidr != 0) {
359  /* flash already configured, update clock and check for protected sectors */
360  for (struct flash_bank *t_bank = bank; t_bank; t_bank = t_bank->next) {
361  if (t_bank->target != target)
362  continue;
363  /* re-calculate master clock frequency */
364  at91sam7_read_clock_info(t_bank);
365 
366  /* no timing */
368 
369  /* check protect state */
370  at91sam7_protect_check(t_bank);
371  }
372 
373  return ERROR_OK;
374  }
375 
376  /* Read and parse chip identification register */
378  if (cidr == 0) {
379  LOG_WARNING("Cannot identify target as an AT91SAM");
381  }
382 
383  if (at91sam7_info->flash_autodetection == 0) {
384  /* banks and sectors are already created, based on data from input file */
385  for (struct flash_bank *t_bank = bank; t_bank; t_bank = t_bank->next) {
386  if (t_bank->target != target)
387  continue;
388 
389  at91sam7_info = t_bank->driver_priv;
390 
391  at91sam7_info->cidr = cidr;
392  at91sam7_info->cidr_ext = (cidr >> 31)&0x0001;
393  at91sam7_info->cidr_nvptyp = (cidr >> 28)&0x0007;
394  at91sam7_info->cidr_arch = (cidr >> 20)&0x00FF;
395  at91sam7_info->cidr_sramsiz = (cidr >> 16)&0x000F;
396  at91sam7_info->cidr_nvpsiz2 = (cidr >> 12)&0x000F;
397  at91sam7_info->cidr_nvpsiz = (cidr >> 8)&0x000F;
398  at91sam7_info->cidr_eproc = (cidr >> 5)&0x0007;
399  at91sam7_info->cidr_version = cidr&0x001F;
400 
401  /* calculate master clock frequency */
402  at91sam7_read_clock_info(t_bank);
403 
404  /* no timing */
406 
407  /* check protect state */
408  at91sam7_protect_check(t_bank);
409  }
410 
411  return ERROR_OK;
412  }
413 
414  arch = (cidr >> 20)&0x00FF;
415 
416  /* check flash size */
417  switch ((cidr >> 8)&0x000F) {
418  case FLASH_SIZE_8KB:
419  break;
420 
421  case FLASH_SIZE_16KB:
422  banks_num = 1;
423  sectors_num = 8;
424  pages_per_sector = 32;
425  page_size = 64;
426  base_address = 0x00100000;
427  if (arch == 0x70) {
428  num_nvmbits = 2;
429  target_name_t = "AT91SAM7S161/16";
430  }
431  break;
432 
433  case FLASH_SIZE_32KB:
434  banks_num = 1;
435  sectors_num = 8;
436  pages_per_sector = 32;
437  page_size = 128;
438  base_address = 0x00100000;
439  if (arch == 0x70) {
440  num_nvmbits = 2;
441  target_name_t = "AT91SAM7S321/32";
442  }
443  if (arch == 0x72) {
444  num_nvmbits = 3;
445  target_name_t = "AT91SAM7SE32";
446  }
447  break;
448 
449  case FLASH_SIZE_64KB:
450  banks_num = 1;
451  sectors_num = 16;
452  pages_per_sector = 32;
453  page_size = 128;
454  base_address = 0x00100000;
455  if (arch == 0x70) {
456  num_nvmbits = 2;
457  target_name_t = "AT91SAM7S64";
458  }
459  break;
460 
461  case FLASH_SIZE_128KB:
462  banks_num = 1;
463  sectors_num = 8;
464  pages_per_sector = 64;
465  page_size = 256;
466  base_address = 0x00100000;
467  if (arch == 0x70) {
468  num_nvmbits = 2;
469  target_name_t = "AT91SAM7S128";
470  }
471  if (arch == 0x71) {
472  num_nvmbits = 3;
473  target_name_t = "AT91SAM7XC128";
474  }
475  if (arch == 0x72) {
476  num_nvmbits = 3;
477  target_name_t = "AT91SAM7SE128";
478  }
479  if (arch == 0x75) {
480  num_nvmbits = 3;
481  target_name_t = "AT91SAM7X128";
482  }
483  break;
484 
485  case FLASH_SIZE_256KB:
486  banks_num = 1;
487  sectors_num = 16;
488  pages_per_sector = 64;
489  page_size = 256;
490  base_address = 0x00100000;
491  if (arch == 0x60) {
492  num_nvmbits = 3;
493  target_name_t = "AT91SAM7A3";
494  }
495  if (arch == 0x70) {
496  num_nvmbits = 2;
497  target_name_t = "AT91SAM7S256";
498  }
499  if (arch == 0x71) {
500  num_nvmbits = 3;
501  target_name_t = "AT91SAM7XC256";
502  }
503  if (arch == 0x72) {
504  num_nvmbits = 3;
505  target_name_t = "AT91SAM7SE256";
506  }
507  if (arch == 0x75) {
508  num_nvmbits = 3;
509  target_name_t = "AT91SAM7X256";
510  }
511  break;
512 
513  case FLASH_SIZE_512KB:
514  banks_num = 2;
515  sectors_num = 16;
516  pages_per_sector = 64;
517  page_size = 256;
518  base_address = 0x00100000;
519  if (arch == 0x70) {
520  num_nvmbits = 2;
521  target_name_t = "AT91SAM7S512";
522  }
523  if (arch == 0x71) {
524  num_nvmbits = 3;
525  target_name_t = "AT91SAM7XC512";
526  }
527  if (arch == 0x72) {
528  num_nvmbits = 3;
529  target_name_t = "AT91SAM7SE512";
530  }
531  if (arch == 0x75) {
532  num_nvmbits = 3;
533  target_name_t = "AT91SAM7X512";
534  }
535  break;
536 
537  case FLASH_SIZE_1024KB:
538  break;
539 
540  case FLASH_SIZE_2048KB:
541  break;
542  }
543 
544  if (strcmp(target_name_t, "Unknown") == 0) {
545  LOG_ERROR(
546  "Target autodetection failed! Please specify target parameters in configuration file");
548  }
549 
550  ext_freq = at91sam7_info->ext_freq;
551 
552  /* calculate bank size */
553  bank_size = sectors_num * pages_per_sector * page_size;
554 
555  for (bnk = 0; bnk < banks_num; bnk++) {
556  struct flash_bank *t_bank = bank;
557  if (bnk > 0) {
558  if (!t_bank->next) {
559  /* create a new flash bank element */
560  struct flash_bank *fb = calloc(1, sizeof(struct flash_bank));
561  if (!fb) {
562  LOG_ERROR("No memory for flash bank");
563  return ERROR_FAIL;
564  }
565  fb->target = target;
566  fb->driver = bank->driver;
567  fb->default_padded_value = 0xff;
568  fb->erased_value = 0xff;
569  fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
570  if (!fb->driver_priv) {
571  free(fb);
572  LOG_ERROR("No memory for flash driver priv");
573  return ERROR_FAIL;
574  }
575  fb->name = strdup("sam7_probed");
576 
577  /* link created bank in 'flash_banks' list */
578  t_bank->next = fb;
579  }
580  t_bank = t_bank->next;
581  }
582 
583  t_bank->bank_number = bnk;
584  t_bank->base = base_address + bnk * bank_size;
585  t_bank->size = bank_size;
586  t_bank->num_sectors = sectors_num;
587 
588  /* allocate sectors */
589  t_bank->sectors = malloc(sectors_num * sizeof(struct flash_sector));
590  for (sec = 0; sec < sectors_num; sec++) {
591  t_bank->sectors[sec].offset = sec * pages_per_sector * page_size;
592  t_bank->sectors[sec].size = pages_per_sector * page_size;
593  t_bank->sectors[sec].is_erased = -1;
594  t_bank->sectors[sec].is_protected = -1;
595  }
596 
597  at91sam7_info = t_bank->driver_priv;
598 
599  at91sam7_info->cidr = cidr;
600  at91sam7_info->cidr_ext = (cidr >> 31)&0x0001;
601  at91sam7_info->cidr_nvptyp = (cidr >> 28)&0x0007;
602  at91sam7_info->cidr_arch = (cidr >> 20)&0x00FF;
603  at91sam7_info->cidr_sramsiz = (cidr >> 16)&0x000F;
604  at91sam7_info->cidr_nvpsiz2 = (cidr >> 12)&0x000F;
605  at91sam7_info->cidr_nvpsiz = (cidr >> 8)&0x000F;
606  at91sam7_info->cidr_eproc = (cidr >> 5)&0x0007;
607  at91sam7_info->cidr_version = cidr&0x001F;
608 
609  at91sam7_info->target_name = target_name_t;
610  at91sam7_info->flashmode = 0;
611  at91sam7_info->ext_freq = ext_freq;
612  at91sam7_info->num_nvmbits = num_nvmbits;
613  at91sam7_info->num_nvmbits_on = 0;
614  at91sam7_info->pagesize = page_size;
615  at91sam7_info->pages_per_sector = pages_per_sector;
616 
617  /* calculate master clock frequency */
618  at91sam7_read_clock_info(t_bank);
619 
620  /* no timing */
622 
623  /* check protect state */
624  at91sam7_protect_check(t_bank);
625  }
626 
627  LOG_DEBUG("nvptyp: 0x%3.3x, arch: 0x%4.4x",
628  at91sam7_info->cidr_nvptyp,
629  at91sam7_info->cidr_arch);
630 
631  return ERROR_OK;
632 }
633 
635 {
636  if (bank->target->state != TARGET_HALTED) {
637  LOG_ERROR("Target not halted");
639  }
640 
641  /* Configure the flash controller timing */
644 
646 }
647 
649 {
650  uint8_t lock_pos, gpnvm_pos;
651  uint32_t status;
652 
653  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
654 
655  if (at91sam7_info->cidr == 0)
657  if (bank->target->state != TARGET_HALTED) {
658  LOG_ERROR("Target not halted");
660  }
661 
662  status = at91sam7_get_flash_status(bank->target, bank->bank_number);
663  at91sam7_info->lockbits = (status >> 16);
664 
665  at91sam7_info->num_lockbits_on = 0;
666  for (lock_pos = 0; lock_pos < bank->num_sectors; lock_pos++) {
667  if (((status >> (16 + lock_pos))&(0x0001)) == 1) {
668  at91sam7_info->num_lockbits_on++;
669  bank->sectors[lock_pos].is_protected = 1;
670  } else
671  bank->sectors[lock_pos].is_protected = 0;
672  }
673 
674  /* GPNVM and SECURITY bits apply only for MC_FSR of EFC0 */
675  status = at91sam7_get_flash_status(bank->target, 0);
676 
677  at91sam7_info->securitybit = (status >> 4)&0x01;
678  at91sam7_info->nvmbits = (status >> 8)&0xFF;
679 
680  at91sam7_info->num_nvmbits_on = 0;
681  for (gpnvm_pos = 0; gpnvm_pos < at91sam7_info->num_nvmbits; gpnvm_pos++) {
682  if (((status >> (8 + gpnvm_pos))&(0x01)) == 1)
683  at91sam7_info->num_nvmbits_on++;
684  }
685 
686  return ERROR_OK;
687 }
688 
689 FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command)
690 {
691  struct flash_bank *t_bank = bank;
692  struct at91sam7_flash_bank *at91sam7_info;
693  struct target *target = t_bank->target;
694 
695  uint32_t base_address;
696  uint32_t bank_size;
697  uint32_t ext_freq = 0;
698 
699  unsigned int banks_num;
700  unsigned int num_sectors;
701 
702  uint16_t pages_per_sector;
703  uint16_t page_size;
704  uint16_t num_nvmbits;
705 
706  at91sam7_info = malloc(sizeof(struct at91sam7_flash_bank));
707  t_bank->driver_priv = at91sam7_info;
708 
709  /* part wasn't probed for info yet */
710  at91sam7_info->cidr = 0;
711  at91sam7_info->flashmode = 0;
712  at91sam7_info->ext_freq = 0;
713  at91sam7_info->flash_autodetection = 0;
714 
715  if (CMD_ARGC < 13) {
716  at91sam7_info->flash_autodetection = 1;
717  return ERROR_OK;
718  }
719 
720  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], base_address);
721 
722  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[8], banks_num);
723  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[9], num_sectors);
724  COMMAND_PARSE_NUMBER(u16, CMD_ARGV[10], pages_per_sector);
726  COMMAND_PARSE_NUMBER(u16, CMD_ARGV[12], num_nvmbits);
727 
728  if (CMD_ARGC == 14) {
729  unsigned long freq;
730  COMMAND_PARSE_NUMBER(ulong, CMD_ARGV[13], freq);
731  ext_freq = freq * 1000;
732  at91sam7_info->ext_freq = ext_freq;
733  }
734 
735  if ((banks_num == 0) || (num_sectors == 0) ||
736  (pages_per_sector == 0) || (page_size == 0) || (num_nvmbits == 0)) {
737  at91sam7_info->flash_autodetection = 1;
738  return ERROR_OK;
739  }
740 
741  /* calculate bank size */
742  bank_size = num_sectors * pages_per_sector * page_size;
743 
744  for (unsigned int bnk = 0; bnk < banks_num; bnk++) {
745  if (bnk > 0) {
746  if (!t_bank->next) {
747  /* create a new bank element */
748  struct flash_bank *fb = calloc(1, sizeof(struct flash_bank));
749  if (!fb) {
750  LOG_ERROR("No memory for flash bank");
751  return ERROR_FAIL;
752  }
753  fb->target = target;
754  fb->driver = bank->driver;
755  fb->default_padded_value = 0xff;
756  fb->erased_value = 0xff;
757  fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
758  if (!fb->driver_priv) {
759  free(fb);
760  LOG_ERROR("No memory for flash driver priv");
761  return ERROR_FAIL;
762  }
763  fb->name = strdup("sam7_probed");
764 
765  /* link created bank in 'flash_banks' list */
766  t_bank->next = fb;
767  }
768  t_bank = t_bank->next;
769  }
770 
771  t_bank->bank_number = bnk;
772  t_bank->base = base_address + bnk * bank_size;
773  t_bank->size = bank_size;
774  t_bank->num_sectors = num_sectors;
775 
776  /* allocate sectors */
777  t_bank->sectors = malloc(num_sectors * sizeof(struct flash_sector));
778  for (unsigned int sec = 0; sec < num_sectors; sec++) {
779  t_bank->sectors[sec].offset = sec * pages_per_sector * page_size;
780  t_bank->sectors[sec].size = pages_per_sector * page_size;
781  t_bank->sectors[sec].is_erased = -1;
782  t_bank->sectors[sec].is_protected = -1;
783  }
784 
785  at91sam7_info = t_bank->driver_priv;
786 
787  at91sam7_info->target_name = strdup(CMD_ARGV[7]);
788  at91sam7_info->flashmode = 0;
789  at91sam7_info->ext_freq = ext_freq;
790  at91sam7_info->num_nvmbits = num_nvmbits;
791  at91sam7_info->num_nvmbits_on = 0;
792  at91sam7_info->pagesize = page_size;
793  at91sam7_info->pages_per_sector = pages_per_sector;
794  }
795 
796  return ERROR_OK;
797 }
798 
799 static int at91sam7_erase(struct flash_bank *bank, unsigned int first,
800  unsigned int last)
801 {
802  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
803  uint32_t nbytes, pos;
804  uint8_t *buffer;
805  uint8_t erase_all;
806 
807  if (at91sam7_info->cidr == 0)
809 
810  if (bank->target->state != TARGET_HALTED) {
811  LOG_ERROR("Target not halted");
813  }
814 
815  if ((last < first) || (last >= bank->num_sectors))
817 
818  erase_all = 0;
819  if ((first == 0) && (last == (bank->num_sectors-1)))
820  erase_all = 1;
821 
822  /* Configure the flash controller timing */
825 
826  if (erase_all) {
829  } else {
830  /* allocate and clean buffer */
831  nbytes = (last - first + 1) * bank->sectors[first].size;
832  buffer = malloc(nbytes * sizeof(uint8_t));
833  for (pos = 0; pos < nbytes; pos++)
834  buffer[pos] = 0xFF;
835 
836  if (at91sam7_write(bank, buffer, bank->sectors[first].offset, nbytes) != ERROR_OK) {
837  free(buffer);
839  }
840 
841  free(buffer);
842  }
843 
844  /* mark erased sectors */
845  for (unsigned int sec = first; sec <= last; sec++)
846  bank->sectors[sec].is_erased = 1;
847 
848  return ERROR_OK;
849 }
850 
851 static int at91sam7_protect(struct flash_bank *bank, int set,
852  unsigned int first, unsigned int last)
853 {
854  uint32_t cmd;
855  uint32_t pagen;
856 
857  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
858 
859  if (at91sam7_info->cidr == 0)
861 
862  if (bank->target->state != TARGET_HALTED) {
863  LOG_ERROR("Target not halted");
865  }
866 
867  if ((last < first) || (last >= bank->num_sectors))
869 
870  /* Configure the flash controller timing */
873 
874  for (unsigned int sector = first; sector <= last; sector++) {
875  if (set)
876  cmd = SLB;
877  else
878  cmd = CLB;
879 
880  /* if we lock a page from one sector then entire sector will be locked, also,
881  * if we unlock a page from a locked sector, entire sector will be unlocked */
882  pagen = sector * at91sam7_info->pages_per_sector;
883 
884  if (at91sam7_flash_command(bank, cmd, pagen) != ERROR_OK)
886  }
887 
889 
890  return ERROR_OK;
891 }
892 
893 static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
894 {
895  int retval;
896  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
897  struct target *target = bank->target;
898  uint32_t dst_min_alignment, wcount, bytes_remaining = count;
899  uint32_t first_page, last_page, pagen, buffer_pos;
900 
901  if (at91sam7_info->cidr == 0)
903 
904  if (bank->target->state != TARGET_HALTED) {
905  LOG_ERROR("Target not halted");
907  }
908 
909  if (offset + count > bank->size)
911 
912  dst_min_alignment = at91sam7_info->pagesize;
913 
914  if (offset % dst_min_alignment) {
915  LOG_WARNING("offset 0x%" PRIx32 " breaks required alignment 0x%" PRIx32,
916  offset,
917  dst_min_alignment);
919  }
920 
921  if (at91sam7_info->cidr_arch == 0)
923 
924  first_page = offset/dst_min_alignment;
925  last_page = DIV_ROUND_UP(offset + count, dst_min_alignment);
926 
927  LOG_DEBUG("first_page: %i, last_page: %i, count %i",
928  (int)first_page,
929  (int)last_page,
930  (int)count);
931 
932  /* Configure the flash controller timing */
935 
936  for (pagen = first_page; pagen < last_page; pagen++) {
937  if (bytes_remaining < dst_min_alignment)
938  count = bytes_remaining;
939  else
940  count = dst_min_alignment;
941  bytes_remaining -= count;
942 
943  /* Write one block to the PageWriteBuffer */
944  buffer_pos = (pagen-first_page)*dst_min_alignment;
945  wcount = DIV_ROUND_UP(count, 4);
946  retval = target_write_memory(target, bank->base + pagen*dst_min_alignment, 4,
947  wcount, buffer + buffer_pos);
948  if (retval != ERROR_OK)
949  return retval;
950 
951  /* Send Write Page command to Flash Controller */
952  if (at91sam7_flash_command(bank, WP, pagen) != ERROR_OK)
954  LOG_DEBUG("Write flash bank:%u page number:%" PRIu32, bank->bank_number, pagen);
955  }
956 
957  return ERROR_OK;
958 }
959 
960 static int at91sam7_probe(struct flash_bank *bank)
961 {
962  /* we can't probe on an at91sam7
963  * if this is an at91sam7, it has the configured flash */
964  int retval;
965 
966  if (bank->target->state != TARGET_HALTED) {
967  LOG_ERROR("Target not halted");
969  }
970 
971  retval = at91sam7_read_part_info(bank);
972  if (retval != ERROR_OK)
973  return retval;
974 
975  return ERROR_OK;
976 }
977 
979 {
980  struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;
981 
982  if (at91sam7_info->cidr == 0)
984 
985  command_print_sameline(cmd, "\n at91sam7 driver information: Chip is %s\n",
986  at91sam7_info->target_name);
987 
989  " Cidr: 0x%8.8" PRIx32 " | Arch: 0x%4.4x | Eproc: %s | Version: 0x%3.3x | "
990  "Flashsize: 0x%8.8" PRIx32 "\n",
991  at91sam7_info->cidr,
992  at91sam7_info->cidr_arch,
993  eproc[at91sam7_info->cidr_eproc],
994  at91sam7_info->cidr_version,
995  bank->size);
996 
998  " Master clock (estimated): %u kHz | External clock: %u kHz\n",
999  (unsigned)(at91sam7_info->mck_freq / 1000),
1000  (unsigned)(at91sam7_info->ext_freq / 1000));
1001 
1003  " Pagesize: %i bytes | Lockbits(%u): %i 0x%4.4x | Pages in lock region: %i\n",
1004  at91sam7_info->pagesize,
1005  bank->num_sectors,
1006  at91sam7_info->num_lockbits_on,
1007  at91sam7_info->lockbits,
1008  at91sam7_info->pages_per_sector * at91sam7_info->num_lockbits_on);
1009 
1010  command_print_sameline(cmd, " Securitybit: %i | Nvmbits(%i): %i 0x%1.1x\n",
1011  at91sam7_info->securitybit, at91sam7_info->num_nvmbits,
1012  at91sam7_info->num_nvmbits_on, at91sam7_info->nvmbits);
1013 
1014  return ERROR_OK;
1015 }
1016 
1017 /*
1018 * On AT91SAM7S: When the gpnvm bits are set with
1019 * > at91sam7 gpnvm bitnr set
1020 * the changes are not visible in the flash controller status register MC_FSR
1021 * until the processor has been reset.
1022 * On the Olimex board this requires a power cycle.
1023 * Note that the AT91SAM7S has the following errata (doc6175.pdf sec 14.1.3):
1024 * The maximum number of write/erase cycles for Non volatile Memory bits is 100. this includes
1025 * Lock Bits (LOCKx), General Purpose NVM bits (GPNVMx) and the Security Bit.
1026 */
1027 COMMAND_HANDLER(at91sam7_handle_gpnvm_command)
1028 {
1029  struct flash_bank *bank;
1030  int bit;
1031  uint8_t flashcmd;
1032  uint32_t status;
1033  struct at91sam7_flash_bank *at91sam7_info;
1034  int retval;
1035 
1036  if (CMD_ARGC != 2)
1038 
1040  if (!bank)
1041  return ERROR_FLASH_BANK_INVALID;
1042  if (strcmp(bank->driver->name, "at91sam7")) {
1043  command_print(CMD, "not an at91sam7 flash bank '%s'", CMD_ARGV[0]);
1044  return ERROR_FLASH_BANK_INVALID;
1045  }
1046  if (bank->target->state != TARGET_HALTED) {
1047  LOG_ERROR("target has to be halted to perform flash operation");
1048  return ERROR_TARGET_NOT_HALTED;
1049  }
1050 
1051  if (strcmp(CMD_ARGV[1], "set") == 0)
1052  flashcmd = SGPB;
1053  else if (strcmp(CMD_ARGV[1], "clear") == 0)
1054  flashcmd = CGPB;
1055  else
1057 
1058  at91sam7_info = bank->driver_priv;
1059  if (at91sam7_info->cidr == 0) {
1060  retval = at91sam7_read_part_info(bank);
1061  if (retval != ERROR_OK)
1062  return retval;
1063  }
1064 
1065  COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], bit);
1066  if ((bit < 0) || (bit >= at91sam7_info->num_nvmbits)) {
1068  "gpnvm bit '#%s' is out of bounds for target %s",
1069  CMD_ARGV[0],
1070  at91sam7_info->target_name);
1071  return ERROR_OK;
1072  }
1073 
1074  /* Configure the flash controller timing */
1077 
1078  if (at91sam7_flash_command(bank, flashcmd, bit) != ERROR_OK)
1080 
1081  /* GPNVM and SECURITY bits apply only for MC_FSR of EFC0 */
1082  status = at91sam7_get_flash_status(bank->target, 0);
1083  LOG_DEBUG("at91sam7_handle_gpnvm_command: cmd 0x%x, value %d, status 0x%" PRIx32,
1084  flashcmd,
1085  bit,
1086  status);
1087 
1088  /* check protect state */
1090 
1091  return ERROR_OK;
1092 }
1093 
1094 static const struct command_registration at91sam7_exec_command_handlers[] = {
1095  {
1096  .name = "gpnvm",
1097  .handler = at91sam7_handle_gpnvm_command,
1098  .mode = COMMAND_EXEC,
1099  .help = "set or clear one General Purpose Non-Volatile Memory "
1100  "(gpnvm) bit",
1101  .usage = "bitnum ('set'|'clear')",
1102  },
1104 };
1105 static const struct command_registration at91sam7_command_handlers[] = {
1106  {
1107  .name = "at91sam7",
1108  .mode = COMMAND_ANY,
1109  .help = "at91sam7 flash command group",
1110  .usage = "",
1112  },
1114 };
1115 
1116 const struct flash_driver at91sam7_flash = {
1117  .name = "at91sam7",
1118  .usage = "gpnvm <bit> <set | clear>",
1119  .commands = at91sam7_command_handlers,
1120  .flash_bank_command = at91sam7_flash_bank_command,
1121  .erase = at91sam7_erase,
1122  .protect = at91sam7_protect,
1123  .write = at91sam7_write,
1124  .read = default_flash_read,
1125  .probe = at91sam7_probe,
1126  .auto_probe = at91sam7_probe,
1127  .erase_check = at91sam7_erase_check,
1128  .protect_check = at91sam7_protect_check,
1129  .info = get_at91sam7_info,
1130 };
enum arm_mode mode
Definition: armv4_5.c:281
#define EA
Definition: at91sam7.c:59
static int get_at91sam7_info(struct flash_bank *bank, struct command_invocation *cmd)
Definition: at91sam7.c:978
#define CKGR_MOR
Definition: at91sam7.c:45
#define FLASH_SIZE_2048KB
Definition: at91sam7.c:85
#define PMC_MCKR_PRES
Definition: at91sam7.c:52
#define CLB
Definition: at91sam7.c:58
static const struct command_registration at91sam7_command_handlers[]
Definition: at91sam7.c:1105
#define RC_FREQ
Definition: at91sam7.c:69
#define CKGR_PLLR_MUL
Definition: at91sam7.c:49
#define MC_FSR_EOL
Definition: at91sam7.c:66
#define WP
Definition: at91sam7.c:55
const struct flash_driver at91sam7_flash
Definition: at91sam7.c:1116
static int at91sam7_erase_check(struct flash_bank *bank)
Definition: at91sam7.c:634
#define FMR_TIMING_NONE
Definition: at91sam7.c:72
#define PMC_MCKR
Definition: at91sam7.c:50
static const struct command_registration at91sam7_exec_command_handlers[]
Definition: at91sam7.c:1094
static int at91sam7_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
Definition: at91sam7.c:851
#define FLASH_SIZE_512KB
Definition: at91sam7.c:83
COMMAND_HANDLER(at91sam7_handle_gpnvm_command)
Definition: at91sam7.c:1027
#define FMR_TIMING_FLASH
Definition: at91sam7.c:74
static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen)
Definition: at91sam7.c:311
#define CGPB
Definition: at91sam7.c:61
#define PMC_MCKR_CSS
Definition: at91sam7.c:51
static void at91sam7_read_clock_info(struct flash_bank *bank)
Definition: at91sam7.c:177
static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number)
Definition: at91sam7.c:168
static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
Definition: at91sam7.c:893
#define FMR_TIMING_NVBITS
Definition: at91sam7.c:73
static const char * eproc[8]
Definition: at91sam7.c:100
#define FLASH_SIZE_16KB
Definition: at91sam7.c:78
static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode)
Definition: at91sam7.c:244
static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout)
Definition: at91sam7.c:285
#define FLASH_SIZE_32KB
Definition: at91sam7.c:79
static const uint32_t mc_fmr[4]
Definition: at91sam7.c:96
static int at91sam7_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
Definition: at91sam7.c:799
static const uint32_t mc_fsr[4]
Definition: at91sam7.c:98
#define CKGR_MCFR_MAINRDY
Definition: at91sam7.c:46
static int at91sam7_read_part_info(struct flash_bank *bank)
Definition: at91sam7.c:338
static const uint32_t mc_fcr[4]
Definition: at91sam7.c:97
#define FLASH_SIZE_8KB
Definition: at91sam7.c:77
#define FLASH_SIZE_64KB
Definition: at91sam7.c:80
#define SGPB
Definition: at91sam7.c:60
#define SLB
Definition: at91sam7.c:56
static int at91sam7_protect_check(struct flash_bank *bank)
Definition: at91sam7.c:648
#define CKGR_PLLR
Definition: at91sam7.c:47
#define CKGR_MCFR
Definition: at91sam7.c:44
#define FLASH_SIZE_1024KB
Definition: at91sam7.c:84
#define FLASH_SIZE_256KB
Definition: at91sam7.c:82
#define MC_FSR_FRDY
Definition: at91sam7.c:65
#define DBGU_CIDR
Definition: at91sam7.c:43
static int at91sam7_probe(struct flash_bank *bank)
Definition: at91sam7.c:960
#define FLASH_SIZE_128KB
Definition: at91sam7.c:81
#define CKGR_PLLR_DIV
Definition: at91sam7.c:48
FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command)
Definition: at91sam7.c:689
Support functions to access arbitrary bits in a byte array.
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
Definition: command.c:348
void command_print(struct command_invocation *cmd, const char *format,...)
Definition: command.c:371
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:141
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:156
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:400
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:151
#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:440
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:251
@ 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 page_size
Page size.
Definition: dw-spi-helper.h:3
uint8_t bank
Definition: esirisc.c:135
#define ERROR_FLASH_BANK_INVALID
Definition: flash/common.h:28
#define ERROR_FLASH_SECTOR_INVALID
Definition: flash/common.h:29
#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_BREAKS_ALIGNMENT
Definition: flash/common.h:32
#define ERROR_FLASH_DST_OUT_OF_BANK
Definition: flash/common.h:31
int default_flash_blank_check(struct flash_bank *bank)
Provides default erased-bank check handling.
struct flash_bank * get_flash_bank_by_num_noprobe(unsigned int num)
Returns the flash bank like get_flash_bank_by_num(), without probing.
int default_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default read implementation for flash memory.
static int freq
Definition: ftdi.c:117
void alive_sleep(uint64_t ms)
Definition: log.c:468
#define LOG_WARNING(expr ...)
Definition: log.h:130
#define ERROR_FAIL
Definition: log.h:174
#define LOG_ERROR(expr ...)
Definition: log.h:133
#define LOG_DEBUG(expr ...)
Definition: log.h:110
#define ERROR_OK
Definition: log.h:168
static uint32_t bit(uint32_t value, unsigned int b)
Definition: opcodes.h:15
struct target * target
Definition: rtt/rtt.c:26
uint16_t nvmbits
Definition: at91sam7.c:130
uint16_t pagesize
Definition: at91sam7.c:122
uint32_t ext_freq
Definition: at91sam7.c:143
uint8_t securitybit
Definition: at91sam7.c:131
uint16_t cidr_ext
Definition: at91sam7.c:107
uint32_t mck_freq
Definition: at91sam7.c:140
uint16_t num_nvmbits
Definition: at91sam7.c:128
uint16_t num_nvmbits_on
Definition: at91sam7.c:129
uint16_t lockbits
Definition: at91sam7.c:127
uint8_t flash_autodetection
Definition: at91sam7.c:118
uint16_t num_lockbits_on
Definition: at91sam7.c:126
uint16_t cidr_eproc
Definition: at91sam7.c:113
uint16_t pages_per_sector
Definition: at91sam7.c:121
uint16_t cidr_nvpsiz2
Definition: at91sam7.c:112
uint16_t cidr_version
Definition: at91sam7.c:114
uint16_t cidr_nvpsiz
Definition: at91sam7.c:111
uint16_t pages_in_lockregion
Definition: at91sam7.c:123
uint16_t cidr_nvptyp
Definition: at91sam7.c:108
uint16_t cidr_sramsiz
Definition: at91sam7.c:110
const char * target_name
Definition: at91sam7.c:115
uint16_t cidr_arch
Definition: at91sam7.c:109
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:234
Provides details of a flash bank, available either on-chip or through a major interface.
Definition: nor/core.h:75
struct flash_sector * sectors
Array of sectors, allocated and initialized by the flash driver.
Definition: nor/core.h:116
uint8_t default_padded_value
Default padded value used, normally this matches the flash erased value.
Definition: nor/core.h:95
const struct flash_driver * driver
Driver for this bank.
Definition: nor/core.h:80
target_addr_t base
The base address of this bank.
Definition: nor/core.h:84
void * driver_priv
Private driver storage pointer.
Definition: nor/core.h:81
uint32_t size
The size of this chip bank, in bytes.
Definition: nor/core.h:85
unsigned int num_sectors
The number of sectors on this chip.
Definition: nor/core.h:114
struct flash_bank * next
The next flash bank on this chip.
Definition: nor/core.h:128
struct target * target
Target to which this bank belongs.
Definition: nor/core.h:78
char * name
Definition: nor/core.h:76
uint8_t erased_value
Erased value.
Definition: nor/core.h:91
unsigned int bank_number
The 'bank' (or chip number) of this instance.
Definition: nor/core.h:83
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
Definition: target.h:119
Definition: psoc6.c:83
int target_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Write count items of size bytes to the memory of target at the address given.
Definition: target.c:1275
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
Definition: target.c:2650
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
Definition: target.c:2559
#define ERROR_TARGET_NOT_HALTED
Definition: target.h:786
@ TARGET_HALTED
Definition: target.h:58
#define DIV_ROUND_UP(m, n)
Rounds m up to the nearest multiple of n using division.
Definition: types.h:79
uint8_t status[4]
Definition: vdebug.c:17
uint8_t cmd
Definition: vdebug.c:1
uint8_t offset[4]
Definition: vdebug.c:9
uint8_t count[4]
Definition: vdebug.c:22