Sophie

Sophie

distrib > CentOS > 6 > i386 > by-pkgid > 2c51d8eb79f8810ada971ee8c30ce1e5 > files > 2784

kernel-doc-2.6.32-71.14.1.el6.noarch.rpm

<?xml version="1.0" encoding="ANSI_X3.4-1968" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><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.75.2" /><link rel="home" href="index.html" title="MTD NAND Driver Programming Interface" /><link rel="up" href="ch05.html" title="Chapter&#160;5.&#160;Advanced board driver functions" /><link rel="prev" href="ch05s02.html" title="Hardware ECC support" /><link rel="next" href="ch05s04.html" title="Spare area (auto)placement" /></head><body><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="ch05s02.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="ch05s04.html">Next</a></td></tr></table><hr /></div><div class="sect1" title="Bad block table support"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="Bad_Block_table_support"></a>Bad block table support</h2></div></div></div><div class="toc"><dl><dt><span class="sect2"><a href="ch05s03.html#Flash_based_tables">Flash based tables</a></span></dt><dt><span class="sect2"><a href="ch05s03.html#User_defined_tables">User defined tables</a></span></dt></dl></div><p>
			Most NAND chips mark the bad blocks at a defined
			position in the spare area. Those blocks must 
			not be erased under any circumstances as the bad 
			block information would be lost.
			It is possible to check the bad block mark each
			time when the blocks are accessed by reading the
			spare area of the first page in the block. This
			is time consuming so a bad block table is used.
		</p><p>
			The nand driver supports various types of bad block
			tables.
			</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Per device</p><p>
			The bad block table contains all bad block information
			of the device which can consist of multiple chips.
			</p></li><li class="listitem"><p>Per chip</p><p>
			A bad block table is used per chip and contains the
			bad block information for this particular chip.
			</p></li><li class="listitem"><p>Fixed offset</p><p>
			The bad block table is located at a fixed offset
			in the chip (device). This applies to various
			DiskOnChip devices.
			</p></li><li class="listitem"><p>Automatic placed</p><p>
			The bad block table is automatically placed and
			detected either at the end or at the beginning
			of a chip (device)
			</p></li><li class="listitem"><p>Mirrored tables</p><p>
			The bad block table is mirrored on the chip (device) to
			allow updates of the bad block table without data loss.
			</p></li></ul></div><p>
		</p><p>	
			nand_scan() calls the function nand_default_bbt(). 
			nand_default_bbt() selects appropriate default
			bad block table desriptors depending on the chip information
			which was retrieved by nand_scan().
		</p><p>
			The standard policy is scanning the device for bad 
			blocks and build a ram based bad block table which
			allows faster access than always checking the
			bad block information on the flash chip itself.
		</p><div class="sect2" title="Flash based tables"><div class="titlepage"><div><div><h3 class="title"><a id="Flash_based_tables"></a>Flash based tables</h3></div></div></div><p>
				It may be desired or neccecary to keep a bad block table in FLASH. 
				For AG-AND chips this is mandatory, as they have no factory marked
				bad blocks. They have factory marked good blocks. The marker pattern
				is erased when the block is erased to be reused. So in case of
				powerloss before writing the pattern back to the chip this block 
				would be lost and added to the bad blocks. Therefor we scan the 
				chip(s) when we detect them the first time for good blocks and 
				store this information in a bad block table before erasing any 
				of the blocks.
			</p><p>
				The blocks in which the tables are stored are procteted against
				accidental access by marking them bad in the memory bad block
				table. The bad block table management functions are allowed
				to circumvernt this protection.
			</p><p>
				The simplest way to activate the FLASH based bad block table support 
				is to set the option NAND_USE_FLASH_BBT in the option field of
				the nand chip structure before calling nand_scan(). For AG-AND
				chips is this done by default.
				This activates the default FLASH based bad block table functionality 
				of the NAND driver. The default bad block table options are
				</p><div class="itemizedlist"><ul class="itemizedlist" 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>
			</p></div><div class="sect2" title="User defined tables"><div class="titlepage"><div><div><h3 class="title"><a id="User_defined_tables"></a>User defined tables</h3></div></div></div><p>
				User defined tables are created by filling out a 
				nand_bbt_descr structure and storing the pointer in the
				nand_chip structure member bbt_td before calling nand_scan(). 
				If a mirror table is neccecary a second structure must be
				created and a pointer to this structure must be stored
				in bbt_md inside the nand_chip structure. If the bbt_md 
				member is set to NULL then only the main table is used
				and no scan for the mirrored table is performed.
			</p><p>
				The most important field in the nand_bbt_descr structure
				is the options field. The options define most of the 
				table properties. Use the predefined constants from
				nand.h to define the options.
				</p><div class="itemizedlist"><ul class="itemizedlist" 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
				a bad block table is managed for each chip in a chip array.
				If this option is not set then a per device bad block table
				is used.</p></li><li class="listitem"><p>Table location is absolute</p><p>Use the option constant NAND_BBT_ABSPAGE and
				define the absolute page number where the bad block
				table starts in the field pages. If you have selected bad block
				tables per chip and you have a multi chip array then the start page
				must be given for each chip in the chip array. Note: there is no scan
				for a table ident pattern performed, so the fields 
				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
				blocks of the chip (device). Set NAND_BBT_LASTBLOCK to place
				the bad block table at the end of the chip (device). The
				bad block tables are marked and identified by a pattern which
				is stored in the spare area of the first page in the block which
				holds the bad block table. Store a pointer to the pattern  
				in the pattern field. Further the length of the pattern has to be 
				stored in len and the offset in the spare area must be given
				in the offs member of the nand_bbt_descr stucture. For mirrored
				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
				if no table can be found during the scan. Usually this is done only 
				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.
				This allows the update of the bad block table(s) in case a block has
				to be marked bad due to wear. The MTD interface function block_markbad
				is calling the update function of the bad block table. If the write
				support is enabled then the table is updated on FLASH.</p><p>
				Note: Write support should only be enabled for mirrored tables with
				version control.
				</p></li><li class="listitem"><p>Table version control</p><p>Set the option NAND_BBT_VERSION to enable the table version control.
				It's highly recommended to enable this for mirrored tables with write
				support. It makes sure that the risk of loosing the bad block
				table information is reduced to the loss of the information about the
				one worn out block which should be marked bad. The version is stored in
				4 consecutive bytes in the spare area of the device. The position of
				the version number is defined by the member veroffs in the bad block table
				descriptor.</p></li><li class="listitem"><p>Save block contents on write</p><p>
				In case that the block which holds the bad block table does contain
				other useful information, set the option NAND_BBT_SAVECONTENT. When
				the bad block table is written then the whole block is read the bad
				block table is updated and the block is erased and everything is 
				written back. If this option is not set only the bad block table
				is written and everything else in the block is ignored and erased.
				</p></li><li class="listitem"><p>Number of reserved blocks</p><p>
				For automatic placement some blocks must be reserved for
				bad block table storage. The number of reserved blocks is defined 
				in the maxblocks member of the babd block table description structure.
				Reserving 4 blocks for mirrored tables should be a reasonable number. 
				This also limits the number of blocks which are scanned for the bad
				block table ident pattern.
				</p></li></ul></div><p>
			</p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch05s02.html">Prev</a>&#160;</td><td width="20%" align="center"><a accesskey="u" href="ch05.html">Up</a></td><td width="40%" align="right">&#160;<a accesskey="n" href="ch05s04.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>