1<html><head><meta http-equiv="Content-Type" content="text/html; charset=ANSI_X3.4-1968"><title>Bad block table support</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"><link rel="home" href="index.html" title="MTD NAND Driver Programming Interface"><link rel="up" href="boarddriversadvanced.html" title="Chapter&#160;5.&#160;Advanced board driver functions"><link rel="prev" href="Hardware_ECC_support.html" title="Hardware ECC support"><link rel="next" href="Spare_area_placement.html" title="Spare area (auto)placement"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Bad block table support</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="Hardware_ECC_support.html">Prev</a>&#160;</td><th width="60%" align="center">Chapter&#160;5.&#160;Advanced board driver functions</th><td width="20%" align="right">&#160;<a accesskey="n" href="Spare_area_placement.html">Next</a></td></tr></table><hr></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Bad_Block_table_support"></a>Bad block table support</h2></div></div></div><div class="toc"><dl class="toc"><dt><span class="sect2"><a href="Bad_Block_table_support.html#Flash_based_tables">Flash based tables</a></span></dt><dt><span class="sect2"><a href="Bad_Block_table_support.html#User_defined_tables">User defined tables</a></span></dt></dl></div><p>
2			Most NAND chips mark the bad blocks at a defined
3			position in the spare area. Those blocks must 
4			not be erased under any circumstances as the bad 
5			block information would be lost.
6			It is possible to check the bad block mark each
7			time when the blocks are accessed by reading the
8			spare area of the first page in the block. This
9			is time consuming so a bad block table is used.
10		</p><p>
11			The nand driver supports various types of bad block
12			tables.
13			</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>Per device</p><p>
14			The bad block table contains all bad block information
15			of the device which can consist of multiple chips.
16			</p></li><li class="listitem"><p>Per chip</p><p>
17			A bad block table is used per chip and contains the
18			bad block information for this particular chip.
19			</p></li><li class="listitem"><p>Fixed offset</p><p>
20			The bad block table is located at a fixed offset
21			in the chip (device). This applies to various
22			DiskOnChip devices.
23			</p></li><li class="listitem"><p>Automatic placed</p><p>
24			The bad block table is automatically placed and
25			detected either at the end or at the beginning
26			of a chip (device)
27			</p></li><li class="listitem"><p>Mirrored tables</p><p>
28			The bad block table is mirrored on the chip (device) to
29			allow updates of the bad block table without data loss.
30			</p></li></ul></div><p>
31		</p><p>	
32			nand_scan() calls the function nand_default_bbt(). 
33			nand_default_bbt() selects appropriate default
34			bad block table descriptors depending on the chip information
35			which was retrieved by nand_scan().
36		</p><p>
37			The standard policy is scanning the device for bad 
38			blocks and build a ram based bad block table which
39			allows faster access than always checking the
40			bad block information on the flash chip itself.
41		</p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="Flash_based_tables"></a>Flash based tables</h3></div></div></div><p>
42				It may be desired or necessary to keep a bad block table in FLASH.
43				For AG-AND chips this is mandatory, as they have no factory marked
44				bad blocks. They have factory marked good blocks. The marker pattern
45				is erased when the block is erased to be reused. So in case of
46				powerloss before writing the pattern back to the chip this block 
47				would be lost and added to the bad blocks. Therefore we scan the 
48				chip(s) when we detect them the first time for good blocks and 
49				store this information in a bad block table before erasing any 
50				of the blocks.
51			</p><p>
52				The blocks in which the tables are stored are protected against
53				accidental access by marking them bad in the memory bad block
54				table. The bad block table management functions are allowed
55				to circumvent this protection.
56			</p><p>
57				The simplest way to activate the FLASH based bad block table support 
58				is to set the option NAND_BBT_USE_FLASH in the bbt_option field of
59				the nand chip structure before calling nand_scan(). For AG-AND
60				chips is this done by default.
61				This activates the default FLASH based bad block table functionality 
62				of the NAND driver. The default bad block table options are
63				</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>Store bad block table per chip</p></li><li class="listitem"><p>Use 2 bits per block</p></li><li class="listitem"><p>Automatic placement at the end of the chip</p></li><li class="listitem"><p>Use mirrored tables with version numbers</p></li><li class="listitem"><p>Reserve 4 blocks at the end of the chip</p></li></ul></div><p>
64			</p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="User_defined_tables"></a>User defined tables</h3></div></div></div><p>
65				User defined tables are created by filling out a 
66				nand_bbt_descr structure and storing the pointer in the
67				nand_chip structure member bbt_td before calling nand_scan(). 
68				If a mirror table is necessary a second structure must be
69				created and a pointer to this structure must be stored
70				in bbt_md inside the nand_chip structure. If the bbt_md 
71				member is set to NULL then only the main table is used
72				and no scan for the mirrored table is performed.
73			</p><p>
74				The most important field in the nand_bbt_descr structure
75				is the options field. The options define most of the 
76				table properties. Use the predefined constants from
77				nand.h to define the options.
78				</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>Number of bits per block</p><p>The supported number of bits is 1, 2, 4, 8.</p></li><li class="listitem"><p>Table per chip</p><p>Setting the constant NAND_BBT_PERCHIP selects that
79				a bad block table is managed for each chip in a chip array.
80				If this option is not set then a per device bad block table
81				is used.</p></li><li class="listitem"><p>Table location is absolute</p><p>Use the option constant NAND_BBT_ABSPAGE and
82				define the absolute page number where the bad block
83				table starts in the field pages. If you have selected bad block
84				tables per chip and you have a multi chip array then the start page
85				must be given for each chip in the chip array. Note: there is no scan
86				for a table ident pattern performed, so the fields 
87				pattern, veroffs, offs, len can be left uninitialized</p></li><li class="listitem"><p>Table location is automatically detected</p><p>The table can either be located in the first or the last good
88				blocks of the chip (device). Set NAND_BBT_LASTBLOCK to place
89				the bad block table at the end of the chip (device). The
90				bad block tables are marked and identified by a pattern which
91				is stored in the spare area of the first page in the block which
92				holds the bad block table. Store a pointer to the pattern  
93				in the pattern field. Further the length of the pattern has to be 
94				stored in len and the offset in the spare area must be given
95				in the offs member of the nand_bbt_descr structure. For mirrored
96				bad block tables different patterns are mandatory.</p></li><li class="listitem"><p>Table creation</p><p>Set the option NAND_BBT_CREATE to enable the table creation
97				if no table can be found during the scan. Usually this is done only 
98				once if a new chip is found. </p></li><li class="listitem"><p>Table write support</p><p>Set the option NAND_BBT_WRITE to enable the table write support.
99				This allows the update of the bad block table(s) in case a block has
100				to be marked bad due to wear. The MTD interface function block_markbad
101				is calling the update function of the bad block table. If the write
102				support is enabled then the table is updated on FLASH.</p><p>
103				Note: Write support should only be enabled for mirrored tables with
104				version control.
105				</p></li><li class="listitem"><p>Table version control</p><p>Set the option NAND_BBT_VERSION to enable the table version control.
106				It's highly recommended to enable this for mirrored tables with write
107				support. It makes sure that the risk of losing the bad block
108				table information is reduced to the loss of the information about the
109				one worn out block which should be marked bad. The version is stored in
110				4 consecutive bytes in the spare area of the device. The position of
111				the version number is defined by the member veroffs in the bad block table
112				descriptor.</p></li><li class="listitem"><p>Save block contents on write</p><p>
113				In case that the block which holds the bad block table does contain
114				other useful information, set the option NAND_BBT_SAVECONTENT. When
115				the bad block table is written then the whole block is read the bad
116				block table is updated and the block is erased and everything is 
117				written back. If this option is not set only the bad block table
118				is written and everything else in the block is ignored and erased.
119				</p></li><li class="listitem"><p>Number of reserved blocks</p><p>
120				For automatic placement some blocks must be reserved for
121				bad block table storage. The number of reserved blocks is defined 
122				in the maxblocks member of the bad block table description structure.
123				Reserving 4 blocks for mirrored tables should be a reasonable number. 
124				This also limits the number of blocks which are scanned for the bad
125				block table ident pattern.
126				</p></li></ul></div><p>
127			</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="Hardware_ECC_support.html">Prev</a>&#160;</td><td width="20%" align="center"><a accesskey="u" href="boarddriversadvanced.html">Up</a></td><td width="40%" align="right">&#160;<a accesskey="n" href="Spare_area_placement.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Hardware ECC support&#160;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&#160;Spare area (auto)placement</td></tr></table></div></body></html>
128