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 5. 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> </td><th width="60%" align="center">Chapter 5. Advanced board driver functions</th><td width="20%" align="right"> <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> </td><td width="20%" align="center"><a accesskey="u" href="boarddriversadvanced.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="Spare_area_placement.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Hardware ECC support </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Spare area (auto)placement</td></tr></table></div></body></html> 128