nand.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. * linux/include/linux/mtd/nand.h
  3. *
  4. * Copyright (c) 2000 David Woodhouse <dwmw2@mvhi.com>
  5. * Steven J. Hill <sjhill@cotw.com>
  6. * Thomas Gleixner <gleixner@autronix.de>
  7. *
  8. * $Id: nand.h,v 1.13 2002/04/28 13:40:41 gleixner Exp $
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. *
  14. * Info:
  15. * Contains standard defines and IDs for NAND flash devices
  16. *
  17. * Changelog:
  18. * 01-31-2000 DMW Created
  19. * 09-18-2000 SJH Moved structure out of the Disk-On-Chip drivers
  20. * so it can be used by other NAND flash device
  21. * drivers. I also changed the copyright since none
  22. * of the original contents of this file are specific
  23. * to DoC devices. David can whack me with a baseball
  24. * bat later if I did something naughty.
  25. * 10-11-2000 SJH Added private NAND flash structure for driver
  26. * 10-24-2000 SJH Added prototype for 'nand_scan' function
  27. * 10-29-2001 TG changed nand_chip structure to support
  28. * hardwarespecific function for accessing control lines
  29. * 02-21-2002 TG added support for different read/write adress and
  30. * ready/busy line access function
  31. * 02-26-2002 TG added chip_delay to nand_chip structure to optimize
  32. * command delay times for different chips
  33. * 04-28-2002 TG OOB config defines moved from nand.c to avoid duplicate
  34. * defines in jffs2/wbuf.c
  35. */
  36. #ifndef __LINUX_MTD_NAND_H
  37. #define __LINUX_MTD_NAND_H
  38. /*
  39. * Standard NAND flash commands
  40. */
  41. #define NAND_CMD_READ0 0
  42. #define NAND_CMD_READ1 1
  43. #define NAND_CMD_PAGEPROG 0x10
  44. #define NAND_CMD_READOOB 0x50
  45. #define NAND_CMD_ERASE1 0x60
  46. #define NAND_CMD_STATUS 0x70
  47. #define NAND_CMD_SEQIN 0x80
  48. #define NAND_CMD_READID 0x90
  49. #define NAND_CMD_ERASE2 0xd0
  50. #define NAND_CMD_RESET 0xff
  51. /*
  52. * Enumeration for NAND flash chip state
  53. */
  54. typedef enum {
  55. FL_READY,
  56. FL_READING,
  57. FL_WRITING,
  58. FL_ERASING,
  59. FL_SYNCING
  60. } nand_state_t;
  61. /*
  62. * NAND Private Flash Chip Data
  63. *
  64. * Structure overview:
  65. *
  66. * IO_ADDR - address to access the 8 I/O lines of the flash device
  67. *
  68. * hwcontrol - hardwarespecific function for accesing control-lines
  69. *
  70. * dev_ready - hardwarespecific function for accesing device ready/busy line
  71. *
  72. * chip_lock - spinlock used to protect access to this structure
  73. *
  74. * wq - wait queue to sleep on if a NAND operation is in progress
  75. *
  76. * state - give the current state of the NAND device
  77. *
  78. * page_shift - number of address bits in a page (column address bits)
  79. *
  80. * data_buf - data buffer passed to/from MTD user modules
  81. *
  82. * data_cache - data cache for redundant page access and shadow for
  83. * ECC failure
  84. *
  85. * ecc_code_buf - used only for holding calculated or read ECCs for
  86. * a page read or written when ECC is in use
  87. *
  88. * reserved - padding to make structure fall on word boundary if
  89. * when ECC is in use
  90. */
  91. struct Nand {
  92. char floor, chip;
  93. unsigned long curadr;
  94. unsigned char curmode;
  95. /* Also some erase/write/pipeline info when we get that far */
  96. };
  97. struct nand_chip {
  98. int page_shift;
  99. u_char *data_buf;
  100. u_char *data_cache;
  101. int cache_page;
  102. u_char ecc_code_buf[6];
  103. u_char reserved[2];
  104. char ChipID; /* Type of DiskOnChip */
  105. struct Nand *chips;
  106. int chipshift;
  107. char* chips_name;
  108. unsigned long erasesize;
  109. unsigned long mfr; /* Flash IDs - only one type of flash per device */
  110. unsigned long id;
  111. char* name;
  112. int numchips;
  113. char page256;
  114. char pageadrlen;
  115. unsigned long IO_ADDR; /* address to access the 8 I/O lines to the flash device */
  116. unsigned long totlen;
  117. uint oobblock; // Size of OOB blocks (e.g. 512)
  118. uint oobsize; // Amount of OOB data per block (e.g. 16)
  119. uint eccsize;
  120. };
  121. /*
  122. * NAND Flash Manufacturer ID Codes
  123. */
  124. #define NAND_MFR_TOSHIBA 0x98
  125. #define NAND_MFR_SAMSUNG 0xec
  126. /*
  127. * NAND Flash Device ID Structure
  128. *
  129. * Structure overview:
  130. *
  131. * name - Complete name of device
  132. *
  133. * manufacture_id - manufacturer ID code of device.
  134. *
  135. * model_id - model ID code of device.
  136. *
  137. * chipshift - total number of address bits for the device which
  138. * is used to calculate address offsets and the total
  139. * number of bytes the device is capable of.
  140. *
  141. * page256 - denotes if flash device has 256 byte pages or not.
  142. *
  143. * pageadrlen - number of bytes minus one needed to hold the
  144. * complete address into the flash array. Keep in
  145. * mind that when a read or write is done to a
  146. * specific address, the address is input serially
  147. * 8 bits at a time. This structure member is used
  148. * by the read/write routines as a loop index for
  149. * shifting the address out 8 bits at a time.
  150. *
  151. * erasesize - size of an erase block in the flash device.
  152. */
  153. struct nand_flash_dev {
  154. char * name;
  155. int manufacture_id;
  156. int model_id;
  157. int chipshift;
  158. char page256;
  159. char pageadrlen;
  160. unsigned long erasesize;
  161. };
  162. /*
  163. * Constants for oob configuration
  164. */
  165. #define NAND_NOOB_ECCPOS0 0
  166. #define NAND_NOOB_ECCPOS1 1
  167. #define NAND_NOOB_ECCPOS2 2
  168. #define NAND_NOOB_ECCPOS3 3
  169. #define NAND_NOOB_ECCPOS4 4
  170. #define NAND_NOOB_ECCPOS5 5
  171. #define NAND_NOOB_BADBPOS -1
  172. #define NAND_NOOB_ECCVPOS -1
  173. #define NAND_JFFS2_OOB_ECCPOS0 0
  174. #define NAND_JFFS2_OOB_ECCPOS1 1
  175. #define NAND_JFFS2_OOB_ECCPOS2 2
  176. #define NAND_JFFS2_OOB_ECCPOS3 3
  177. #define NAND_JFFS2_OOB_ECCPOS4 6
  178. #define NAND_JFFS2_OOB_ECCPOS5 7
  179. #define NAND_JFFS2_OOB_BADBPOS 5
  180. #define NAND_JFFS2_OOB_ECCVPOS 4
  181. #define NAND_JFFS2_OOB8_FSDAPOS 6
  182. #define NAND_JFFS2_OOB16_FSDAPOS 8
  183. #define NAND_JFFS2_OOB8_FSDALEN 2
  184. #define NAND_JFFS2_OOB16_FSDALEN 8
  185. void nand_probe(unsigned long physadr);
  186. #endif /* __LINUX_MTD_NAND_H */