OpenOCD
at91sam9.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /*
4  * Copyright (C) 2009 by Dean Glazeski
5  * dnglaze@gmail.com
6  */
7 
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif
11 
12 #include <target/arm.h>
13 #include <helper/log.h>
14 #include "imp.h"
15 #include "arm_io.h"
16 
17 #define AT91C_PIOX_SODR (0x30)
18 #define AT91C_PIOX_CODR (0x34)
19 #define AT91C_PIOX_PDSR (0x3C)
20 #define AT91C_ECCX_CR (0x00)
21 #define AT91C_ECCX_SR (0x08)
22 #define AT91C_ECCX_PR (0x0C)
23 #define AT91C_ECCX_NPR (0x10)
28 struct at91sam9_pin {
30  uint32_t pioc;
31 
33  uint32_t num;
34 };
35 
39 struct at91sam9_nand {
41  uint32_t ecc;
42 
44  uint32_t data;
45 
47  uint32_t cmd;
48 
50  uint32_t addr;
51 
53  struct arm_nand_data io;
54 
56  struct at91sam9_pin busy;
57 
59  struct at91sam9_pin ce;
60 };
61 
69 static int at91sam9_halted(struct target *target, const char *label)
70 {
71  if (target->state == TARGET_HALTED)
72  return true;
73 
74  LOG_ERROR("Target must be halted to use NAND controller (%s)", label);
75  return false;
76 }
77 
84 static int at91sam9_init(struct nand_device *nand)
85 {
86  struct target *target = nand->target;
87 
88  if (!at91sam9_halted(target, "init"))
90 
91  return ERROR_OK;
92 }
93 
100 static int at91sam9_enable(struct nand_device *nand)
101 {
102  struct at91sam9_nand *info = nand->controller_priv;
103  struct target *target = nand->target;
104 
105  return target_write_u32(target, info->ce.pioc + AT91C_PIOX_CODR, 1 << info->ce.num);
106 }
107 
114 static int at91sam9_disable(struct nand_device *nand)
115 {
116  struct at91sam9_nand *info = nand->controller_priv;
117  struct target *target = nand->target;
118 
119  return target_write_u32(target, info->ce.pioc + AT91C_PIOX_SODR, 1 << info->ce.num);
120 }
121 
129 static int at91sam9_command(struct nand_device *nand, uint8_t command)
130 {
131  struct at91sam9_nand *info = nand->controller_priv;
132  struct target *target = nand->target;
133 
134  if (!at91sam9_halted(target, "command"))
136 
137  at91sam9_enable(nand);
138 
139  return target_write_u8(target, info->cmd, command);
140 }
141 
148 static int at91sam9_reset(struct nand_device *nand)
149 {
150  if (!at91sam9_halted(nand->target, "reset"))
152 
153  return at91sam9_disable(nand);
154 }
155 
163 static int at91sam9_address(struct nand_device *nand, uint8_t address)
164 {
165  struct at91sam9_nand *info = nand->controller_priv;
166  struct target *target = nand->target;
167 
168  if (!at91sam9_halted(nand->target, "address"))
170 
171  return target_write_u8(target, info->addr, address);
172 }
173 
182 static int at91sam9_read_data(struct nand_device *nand, void *data)
183 {
184  struct at91sam9_nand *info = nand->controller_priv;
185  struct target *target = nand->target;
186 
187  if (!at91sam9_halted(nand->target, "read data"))
189 
190  return target_read_u8(target, info->data, data);
191 }
192 
201 static int at91sam9_write_data(struct nand_device *nand, uint16_t data)
202 {
203  struct at91sam9_nand *info = nand->controller_priv;
204  struct target *target = nand->target;
205 
206  if (!at91sam9_halted(target, "write data"))
208 
209  return target_write_u8(target, info->data, data);
210 }
211 
219 static int at91sam9_nand_ready(struct nand_device *nand, int timeout)
220 {
221  struct at91sam9_nand *info = nand->controller_priv;
222  struct target *target = nand->target;
223  uint32_t status;
224 
225  if (!at91sam9_halted(target, "nand ready"))
226  return 0;
227 
228  do {
230 
231  if (status & (1 << info->busy.num))
232  return 1;
233 
234  alive_sleep(1);
235  } while (timeout-- > 0);
236 
237  return 0;
238 }
239 
249 static int at91sam9_read_block_data(struct nand_device *nand, uint8_t *data, int size)
250 {
251  struct at91sam9_nand *info = nand->controller_priv;
252  struct arm_nand_data *io = &info->io;
253 
254  if (!at91sam9_halted(nand->target, "read block"))
256 
257  io->chunk_size = nand->page_size;
258  return arm_nandread(io, data, size);
259 }
260 
270 static int at91sam9_write_block_data(struct nand_device *nand, uint8_t *data, int size)
271 {
272  struct at91sam9_nand *info = nand->controller_priv;
273  struct arm_nand_data *io = &info->io;
274 
275  if (!at91sam9_halted(nand->target, "write block"))
277 
278  io->chunk_size = nand->page_size;
279  return arm_nandwrite(io, data, size);
280 }
281 
289 static int at91sam9_ecc_init(struct target *target, struct at91sam9_nand *info)
290 {
291  if (!info->ecc) {
292  LOG_ERROR("ECC controller address must be set when not reading raw NAND data");
294  }
295 
296  /* reset ECC parity registers */
297  return target_write_u32(target, info->ecc + AT91C_ECCX_CR, 1);
298 }
299 
310 static uint8_t *at91sam9_oob_init(struct nand_device *nand, uint8_t *oob, uint32_t *size)
311 {
312  if (!oob) {
313  /* user doesn't want OOB, allocate it */
314  if (nand->page_size == 512)
315  *size = 16;
316  else if (nand->page_size == 2048)
317  *size = 64;
318 
319  oob = malloc(*size);
320  if (!oob) {
321  LOG_ERROR("Unable to allocate space for OOB");
322  return NULL;
323  }
324 
325  memset(oob, 0xFF, *size);
326  }
327 
328  return oob;
329 }
330 
344 static int at91sam9_read_page(struct nand_device *nand, uint32_t page,
345  uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size)
346 {
347  int retval;
348  struct at91sam9_nand *info = nand->controller_priv;
349  struct target *target = nand->target;
350  uint8_t *oob_data;
351  uint32_t status;
352 
353  retval = at91sam9_ecc_init(target, info);
354  if (retval != ERROR_OK)
355  return retval;
356 
357  retval = nand_page_command(nand, page, NAND_CMD_READ0, !data);
358  if (retval != ERROR_OK)
359  return retval;
360 
361  if (data) {
362  retval = nand_read_data_page(nand, data, data_size);
363  if (retval != ERROR_OK)
364  return retval;
365  }
366 
367  oob_data = at91sam9_oob_init(nand, oob, &oob_size);
368  retval = nand_read_data_page(nand, oob_data, oob_size);
369  if (retval == ERROR_OK && data) {
371  if (status & 1) {
372  LOG_ERROR("Error detected!");
373  if (status & 4)
374  LOG_ERROR("Multiple errors encountered; unrecoverable!");
375  else {
376  /* attempt recovery */
377  uint32_t parity;
378 
380  info->ecc + AT91C_ECCX_PR,
381  &parity);
382  uint32_t word = (parity & 0x0000FFF0) >> 4;
383  uint32_t bit = parity & 0x0F;
384 
385  data[word] ^= (0x1) << bit;
386  LOG_INFO("Data word %" PRIu32 ", bit %" PRIu32 " corrected.",
387  word, bit);
388  }
389  }
390 
391  if (status & 2) {
392  /* we could write back correct ECC data */
393  LOG_ERROR("Error in ECC bytes detected");
394  }
395  }
396 
397  if (!oob) {
398  /* if it wasn't asked for, free it */
399  free(oob_data);
400  }
401 
402  return retval;
403 }
404 
418 static int at91sam9_write_page(struct nand_device *nand, uint32_t page,
419  uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size)
420 {
421  struct at91sam9_nand *info = nand->controller_priv;
422  struct target *target = nand->target;
423  int retval;
424  uint8_t *oob_data = oob;
425  uint32_t parity, nparity;
426 
427  retval = at91sam9_ecc_init(target, info);
428  if (retval != ERROR_OK)
429  return retval;
430 
431  retval = nand_page_command(nand, page, NAND_CMD_SEQIN, !data);
432  if (retval != ERROR_OK)
433  return retval;
434 
435  if (data) {
436  retval = nand_write_data_page(nand, data, data_size);
437  if (retval != ERROR_OK) {
438  LOG_ERROR("Unable to write data to NAND device");
439  return retval;
440  }
441  }
442 
443  oob_data = at91sam9_oob_init(nand, oob, &oob_size);
444 
445  if (!oob) {
446  /* no OOB given, so read in the ECC parity from the ECC controller */
448  target_read_u32(target, info->ecc + AT91C_ECCX_NPR, &nparity);
449 
450  oob_data[0] = (uint8_t) parity;
451  oob_data[1] = (uint8_t) (parity >> 8);
452  oob_data[2] = (uint8_t) nparity;
453  oob_data[3] = (uint8_t) (nparity >> 8);
454  }
455 
456  retval = nand_write_data_page(nand, oob_data, oob_size);
457 
458  if (!oob)
459  free(oob_data);
460 
461  if (retval != ERROR_OK) {
462  LOG_ERROR("Unable to write OOB data to NAND");
463  return retval;
464  }
465 
466  return nand_write_finish(nand);
467 }
468 
474 NAND_DEVICE_COMMAND_HANDLER(at91sam9_nand_device_command)
475 {
476  unsigned long chip = 0, ecc = 0;
477  struct at91sam9_nand *info = NULL;
478 
479  LOG_DEBUG("AT91SAM9 NAND Device Command");
480 
481  if (CMD_ARGC < 3 || CMD_ARGC > 4) {
482  LOG_ERROR("parameters: %s target chip_addr", CMD_ARGV[0]);
484  }
485 
486  COMMAND_PARSE_NUMBER(ulong, CMD_ARGV[2], chip);
487  if (chip == 0) {
488  LOG_ERROR("invalid NAND chip address: %s", CMD_ARGV[2]);
490  }
491 
492  if (CMD_ARGC == 4) {
493  COMMAND_PARSE_NUMBER(ulong, CMD_ARGV[3], ecc);
494  if (ecc == 0) {
495  LOG_ERROR("invalid ECC controller address: %s", CMD_ARGV[3]);
497  }
498  }
499 
500  info = calloc(1, sizeof(*info));
501  if (!info) {
502  LOG_ERROR("unable to allocate space for controller private data");
504  }
505 
506  info->data = chip;
507  info->cmd = chip | (1 << 22);
508  info->addr = chip | (1 << 21);
509  info->ecc = ecc;
510 
511  nand->controller_priv = info;
512  info->io.target = nand->target;
513  info->io.data = info->data;
514  info->io.op = ARM_NAND_NONE;
515 
516  return ERROR_OK;
517 }
518 
523 COMMAND_HANDLER(handle_at91sam9_cle_command)
524 {
525  struct nand_device *nand = NULL;
526  struct at91sam9_nand *info = NULL;
527  unsigned int num, address_line;
528 
529  if (CMD_ARGC != 2) {
530  command_print(CMD, "incorrect number of arguments for 'at91sam9 cle' command");
531  return ERROR_OK;
532  }
533 
534  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
535  nand = get_nand_device_by_num(num);
536  if (!nand) {
537  command_print(CMD, "invalid nand device number: %s", CMD_ARGV[0]);
538  return ERROR_OK;
539  }
540 
541  info = nand->controller_priv;
542 
543  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], address_line);
544  info->cmd = info->data | (1 << address_line);
545 
546  return ERROR_OK;
547 }
548 
553 COMMAND_HANDLER(handle_at91sam9_ale_command)
554 {
555  struct nand_device *nand = NULL;
556  struct at91sam9_nand *info = NULL;
557  unsigned int num, address_line;
558 
559  if (CMD_ARGC != 2)
561 
562  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
563  nand = get_nand_device_by_num(num);
564  if (!nand) {
565  command_print(CMD, "invalid nand device number: %s", CMD_ARGV[0]);
567  }
568 
569  info = nand->controller_priv;
570 
571  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], address_line);
572  info->addr = info->data | (1 << address_line);
573 
574  return ERROR_OK;
575 }
576 
581 COMMAND_HANDLER(handle_at91sam9_rdy_busy_command)
582 {
583  struct nand_device *nand = NULL;
584  struct at91sam9_nand *info = NULL;
585  unsigned int num, base_pioc, pin_num;
586 
587  if (CMD_ARGC != 3)
589 
590  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
591  nand = get_nand_device_by_num(num);
592  if (!nand) {
593  command_print(CMD, "invalid nand device number: %s", CMD_ARGV[0]);
595  }
596 
597  info = nand->controller_priv;
598 
599  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], base_pioc);
600  info->busy.pioc = base_pioc;
601 
602  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[2], pin_num);
603  info->busy.num = pin_num;
604 
605  return ERROR_OK;
606 }
607 
612 COMMAND_HANDLER(handle_at91sam9_ce_command)
613 {
614  struct nand_device *nand = NULL;
615  struct at91sam9_nand *info = NULL;
616  unsigned int num, base_pioc, pin_num;
617 
618  if (CMD_ARGC != 3)
620 
621  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
622  nand = get_nand_device_by_num(num);
623  if (!nand) {
624  command_print(CMD, "invalid nand device number: %s", CMD_ARGV[0]);
626  }
627 
628  info = nand->controller_priv;
629 
630  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], base_pioc);
631  info->ce.pioc = base_pioc;
632 
633  COMMAND_PARSE_NUMBER(uint, CMD_ARGV[2], pin_num);
634  info->ce.num = pin_num;
635 
636  return ERROR_OK;
637 }
638 
639 static const struct command_registration at91sam9_sub_command_handlers[] = {
640  {
641  .name = "cle",
642  .handler = handle_at91sam9_cle_command,
643  .mode = COMMAND_CONFIG,
644  .help = "set command latch enable address line (default is 22)",
645  .usage = "bank_id address_line",
646  },
647  {
648  .name = "ale",
649  .handler = handle_at91sam9_ale_command,
650  .mode = COMMAND_CONFIG,
651  .help = "set address latch enable address line (default is 21)",
652  .usage = "bank_id address_line",
653  },
654  {
655  .name = "rdy_busy",
656  .handler = handle_at91sam9_rdy_busy_command,
657  .mode = COMMAND_CONFIG,
658  .help = "set the GPIO input pin connected to "
659  "the RDY/~BUSY signal (no default)",
660  .usage = "bank_id pio_base_addr pin_num",
661  },
662  {
663  .name = "ce",
664  .handler = handle_at91sam9_ce_command,
665  .mode = COMMAND_CONFIG,
666  .help = "set the GPIO output pin connected to "
667  "the chip enable signal (no default)",
668  .usage = "bank_id pio_base_addr pin_num",
669  },
671 };
672 
673 static const struct command_registration at91sam9_command_handler[] = {
674  {
675  .name = "at91sam9",
676  .mode = COMMAND_ANY,
677  .help = "AT91SAM9 NAND flash controller commands",
678  .usage = "",
680  },
682 };
683 
688  .name = "at91sam9",
689  .nand_device_command = at91sam9_nand_device_command,
690  .commands = at91sam9_command_handler,
691  .init = at91sam9_init,
692  .command = at91sam9_command,
693  .reset = at91sam9_reset,
694  .address = at91sam9_address,
695  .read_data = at91sam9_read_data,
696  .write_data = at91sam9_write_data,
697  .nand_ready = at91sam9_nand_ready,
698  .read_block_data = at91sam9_read_block_data,
699  .write_block_data = at91sam9_write_block_data,
700  .read_page = at91sam9_read_page,
701  .write_page = at91sam9_write_page,
702 };
Holds the interface to ARM cores.
const char * label
Definition: arm_cti.c:181
int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size)
ARM-specific bulk write from buffer to address of 8-bit wide NAND.
Definition: arm_io.c:78
int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size)
Uses an on-chip algorithm for an ARM device to read from a NAND device and store the data into the ho...
Definition: arm_io.c:188
@ ARM_NAND_NONE
No operation performed.
Definition: arm_io.h:13
static int at91sam9_read_page(struct nand_device *nand, uint32_t page, uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size)
Reads a page from an AT91SAM9 NAND controller and verifies using 1-bit ECC controller on chip.
Definition: at91sam9.c:344
static int at91sam9_read_data(struct nand_device *nand, void *data)
Read data directly from the NAND device attached to an AT91SAM9 NAND controller.
Definition: at91sam9.c:182
static int at91sam9_nand_ready(struct nand_device *nand, int timeout)
Determine if the NAND device is ready by looking at the ready/~busy pin.
Definition: at91sam9.c:219
static int at91sam9_command(struct nand_device *nand, uint8_t command)
Send a command to the NAND device.
Definition: at91sam9.c:129
static int at91sam9_enable(struct nand_device *nand)
Enable NAND device attached to a controller.
Definition: at91sam9.c:100
COMMAND_HANDLER(handle_at91sam9_cle_command)
Handle the AT91SAM9 CLE command for specifying the address line to use for writing commands to a NAND...
Definition: at91sam9.c:523
struct nand_flash_controller at91sam9_nand_controller
Structure representing the AT91SAM9 NAND controller.
Definition: at91sam9.c:687
static int at91sam9_write_page(struct nand_device *nand, uint32_t page, uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size)
Write a page of data including 1-bit ECC information to a NAND device attached to an AT91SAM9 control...
Definition: at91sam9.c:418
static int at91sam9_read_block_data(struct nand_device *nand, uint8_t *data, int size)
Read a block of data from the NAND device attached to an AT91SAM9.
Definition: at91sam9.c:249
static int at91sam9_halted(struct target *target, const char *label)
Checks if the target is halted and prints an error message if it isn't.
Definition: at91sam9.c:69
static const struct command_registration at91sam9_sub_command_handlers[]
Definition: at91sam9.c:639
static int at91sam9_reset(struct nand_device *nand)
Reset the AT91SAM9 NAND controller.
Definition: at91sam9.c:148
#define AT91C_ECCX_SR
Offset to ECC SR.
Definition: at91sam9.c:21
static int at91sam9_disable(struct nand_device *nand)
Disable NAND device attached to a controller.
Definition: at91sam9.c:114
static uint8_t * at91sam9_oob_init(struct nand_device *nand, uint8_t *oob, uint32_t *size)
Initialize an area for the OOB based on whether a user is requesting the OOB data.
Definition: at91sam9.c:310
static const struct command_registration at91sam9_command_handler[]
Definition: at91sam9.c:673
static int at91sam9_ecc_init(struct target *target, struct at91sam9_nand *info)
Initialize the ECC controller on the AT91SAM9.
Definition: at91sam9.c:289
static int at91sam9_write_block_data(struct nand_device *nand, uint8_t *data, int size)
Write a block of data to a NAND device attached to an AT91SAM9.
Definition: at91sam9.c:270
static int at91sam9_write_data(struct nand_device *nand, uint16_t data)
Write data directly to the NAND device attached to an AT91SAM9 NAND controller.
Definition: at91sam9.c:201
#define AT91C_ECCX_PR
Offset to ECC PR.
Definition: at91sam9.c:22
static int at91sam9_address(struct nand_device *nand, uint8_t address)
Send an address to the NAND device attached to an AT91SAM9 NAND controller.
Definition: at91sam9.c:163
#define AT91C_ECCX_NPR
Offset to ECC NPR.
Definition: at91sam9.c:23
static int at91sam9_init(struct nand_device *nand)
Initialize the AT91SAM9 NAND controller.
Definition: at91sam9.c:84
#define AT91C_PIOX_SODR
Offset to PIO SODR.
Definition: at91sam9.c:17
NAND_DEVICE_COMMAND_HANDLER(at91sam9_nand_device_command)
Handle the initial NAND device command for AT91SAM9 controllers.
Definition: at91sam9.c:474
#define AT91C_ECCX_CR
Offset to ECC CR.
Definition: at91sam9.c:20
#define AT91C_PIOX_CODR
Offset to PIO CODR.
Definition: at91sam9.c:18
#define AT91C_PIOX_PDSR
Offset to PIO PDSR.
Definition: at91sam9.c:19
void command_print(struct command_invocation *cmd, const char *format,...)
Definition: command.c:389
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:146
#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
#define ERROR_COMMAND_ARGUMENT_INVALID
Definition: command.h:407
@ COMMAND_CONFIG
Definition: command.h:41
@ COMMAND_ANY
Definition: command.h:42
ecc
Definition: davinci.c:22
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
uint32_t address
Starting address. Sector aligned.
Definition: dw-spi-helper.h:0
int nand_write_data_page(struct nand_device *nand, uint8_t *data, uint32_t size)
int nand_read_data_page(struct nand_device *nand, uint8_t *data, uint32_t size)
int nand_write_finish(struct nand_device *nand)
struct nand_device * get_nand_device_by_num(int num)
int nand_page_command(struct nand_device *nand, uint32_t page, uint8_t cmd, bool oob_only)
void alive_sleep(uint64_t ms)
Definition: log.c:478
#define LOG_ERROR(expr ...)
Definition: log.h:147
#define LOG_INFO(expr ...)
Definition: log.h:141
#define LOG_DEBUG(expr ...)
Definition: log.h:124
#define ERROR_OK
Definition: log.h:182
#define ERROR_NAND_OPERATION_FAILED
Definition: nand/core.h:217
@ NAND_CMD_SEQIN
Definition: nand/core.h:148
@ NAND_CMD_READ0
Definition: nand/core.h:140
static uint32_t bit(uint32_t value, unsigned int b)
Definition: opcodes.h:39
The arm_nand_data struct is used for defining NAND I/O operations on an ARM core.
Definition: arm_io.h:22
unsigned int chunk_size
The chunk size is the page size or ECC chunk.
Definition: arm_io.h:30
uint32_t data
Where data is read from or written to.
Definition: arm_io.h:33
Private data for the controller that is stored in the NAND device structure.
Definition: at91sam9.c:39
struct at91sam9_pin ce
Pin representing the chip enable.
Definition: at91sam9.c:59
uint32_t data
Address data is written to.
Definition: at91sam9.c:44
uint32_t cmd
Address commands are written to.
Definition: at91sam9.c:47
uint32_t ecc
Address of the ECC controller for NAND.
Definition: at91sam9.c:41
struct at91sam9_pin busy
Pin representing the ready/~busy line.
Definition: at91sam9.c:56
uint32_t addr
Address addresses are written to.
Definition: at91sam9.c:50
struct arm_nand_data io
I/O structure for hosted reads/writes.
Definition: at91sam9.c:53
Representation of a pin on an AT91SAM9 chip.
Definition: at91sam9.c:28
uint32_t pioc
Address of the PIO controller.
Definition: at91sam9.c:30
uint32_t num
Pin number.
Definition: at91sam9.c:33
const char * name
Definition: command.h:239
void * controller_priv
Definition: nand/core.h:51
int page_size
Definition: nand/core.h:56
struct target * target
Definition: nand/core.h:49
Interface for NAND flash controllers.
Definition: nand/driver.h:23
const char * name
Driver name that is used to select it from configuration files.
Definition: nand/driver.h:25
Definition: target.h:119
enum target_state state
Definition: target.h:167
Definition: psoc6.c:83
int target_write_u8(struct target *target, target_addr_t address, uint8_t value)
Definition: target.c:2669
int target_read_u8(struct target *target, target_addr_t address, uint8_t *value)
Definition: target.c:2601
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
Definition: target.c:2635
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
Definition: target.c:2561
@ TARGET_HALTED
Definition: target.h:58
static struct ublast_lowlevel_priv info
#define NULL
Definition: usb.h:16
uint8_t status[4]
Definition: vdebug.c:17
static unsigned int parity(unsigned int v)
Definition: xscale.c:624