<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/6275d62b9221806f9db11375/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6275d62b9221806f9db11375/bg1.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> NandFlash<span class="_ _0"> </span><span class="ff2 sc1">管理系统</span></div><div class="t m0 x1 h4 y3 ff3 fs1 fc0 sc0 ls0 ws0"> <span class="ff2 fs2">编写<span class="ff3"> : T<span class="_ _1"></span>ony <span class="_ _2"></span>Y<span class="_ _3"></span>ang</span></span></div><div class="t m0 x1 h5 y4 ff3 fs2 fc0 sc0 ls0 ws0"> Date : 09/09/14</div></div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6275d62b9221806f9db11375/bg2.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h6 y5 ff3 fs1 fc0 sc0 ls0 ws0"> QQ:292942278</div><div class="t m0 x1 h7 y6 ff1 fs1 fc0 sc0 ls0 ws0">1.<span class="_ _4"> </span><span class="ff2 sc1">总则</span></div><div class="t m0 x1 h7 y7 ff2 fs1 fc0 sc0 ls0 ws0">本文件介绍了<span class="_ _5"> </span><span class="ff3">NANDFLASH<span class="_ _5"> </span></span>管理系统的<span class="_ _5"> </span><span class="ff3">FLASH<span class="_ _5"> </span></span>存储空间的划分,<span class="ff3">ECC<span class="_ _5"> </span></span>数据纠错,坏块的处</div><div class="t m0 x1 h7 y8 ff2 fs1 fc0 sc0 ls0 ws0">理,均匀存储算法,逻辑地址与物理地址转换实现的方案。文件的最后是代码的测试说明。</div><div class="t m0 x1 h7 y9 ff1 fs1 fc0 sc0 ls0 ws0">2.<span class="_ _4"> </span>FLASH<span class="_ _5"> </span><span class="ff2 sc1">存储空间的划分</span></div><div class="t m0 x1 h7 ya ff2 fs1 fc0 sc0 ls0 ws0">为实<span class="_ _6"></span>现<span class="_ _5"> </span><span class="ff3">FLASH<span class="_ _7"> </span></span>坏块<span class="_ _6"></span>处理<span class="_ _6"></span>,把<span class="_ _7"> </span><span class="ff3">FLASH<span class="_ _5"> </span></span>存<span class="_ _6"></span>储空<span class="_ _6"></span>间划<span class="_ _6"></span>分成<span class="_ _6"></span>两个<span class="_ _6"></span>区域<span class="_ _6"></span>,其<span class="_ _6"></span>中的<span class="_ _8"> </span><span class="ff3">FLASH<span class="_ _5"> </span></span>空<span class="_ _6"></span>间的<span class="_ _6"></span>最前<span class="_ _6"></span>面</div><div class="t m0 x1 h7 yb ff2 fs1 fc0 sc0 ls0 ws0">的<span class="_ _9"></span>区<span class="_ _9"></span>称<span class="_ _9"></span>作<span class="_ _9"></span>保<span class="_ _9"></span>留<span class="_ _9"></span>区<span class="_ _9"></span>,<span class="_ _9"></span>另<span class="_ _9"></span>一<span class="_ _9"></span>个<span class="_ _9"></span>区<span class="_ _9"></span>称<span class="_ _9"></span>作<span class="_ _9"></span>数<span class="_ _9"></span>据<span class="_ _9"></span>区<span class="_ _9"></span>,<span class="_ _9"></span>位<span class="_ _9"></span>置<span class="_ _9"></span>位<span class="_ _9"></span>于<span class="_ _9"></span>保<span class="_ _9"></span>留<span class="_ _9"></span>区<span class="_ _9"></span>之<span class="_ _9"></span>后<span class="_ _9"></span>。<span class="_ _9"></span>其<span class="_ _9"></span>中<span class="_ _9"></span>,<span class="_ _9"></span>保<span class="_ _9"></span>留<span class="_ _9"></span>区<span class="_ _9"></span>的<span class="_ _9"></span>容<span class="_ _9"></span>量<span class="_ _9"></span>为</div><div class="t m0 x1 h7 yc ff3 fs1 fc0 sc0 ls0 ws0">FLASH<span class="_"> </span><span class="ff2">总容<span class="_ _6"></span>量<span class="_ _6"></span>的<span class="_ _8"> </span></span>8<span class="_ _6"></span>%<span class="_ _6"></span><span class="ff2">大<span class="_ _6"></span>小<span class="_ _6"></span>,<span class="_ _6"></span>比<span class="_ _a"></span>如<span class="_ _6"></span>说<span class="_ _8"> </span></span>K9F1G08U0A<span class="_"> </span><span class="ff2">总容<span class="_ _a"></span>量是<span class="_ _8"> </span></span>128<span class="_ _6"></span>M<span class="_ _6"></span><span class="ff2">,<span class="_ _6"></span>则<span class="_ _6"></span>保<span class="_ _6"></span>留<span class="_ _6"></span>区<span class="_ _a"></span>的<span class="_ _6"></span>容<span class="_ _6"></span>量<span class="_ _6"></span>为<span class="_ _b"> </span></span>128M <span class="_ _6"></span>*</div><div class="t m0 x1 h7 yd ff3 fs1 fc0 sc0 ls0 ws0">8% <span class="_ _6"></span>= 10M(80 <span class="_ _a"></span><span class="ff2">个<span class="_ _6"></span>块<span class="_ _6"></span></span>)<span class="_ _6"></span><span class="ff2">,保<span class="_ _a"></span>留区<span class="_ _6"></span>的<span class="_ _6"></span>功<span class="_ _6"></span>能是<span class="_ _a"></span>存放<span class="_ _6"></span>地<span class="_ _6"></span>址<span class="_ _6"></span>映射<span class="_ _6"></span>表<span class="_ _6"></span>和<span class="_ _6"></span>保<span class="_ _6"></span>留<span class="_ _6"></span>存<span class="_ _6"></span>储<span class="_ _6"></span>块的<span class="_ _6"></span>目<span class="_ _6"></span>的<span class="_ _6"></span>以<span class="_ _6"></span>备<span class="_ _6"></span>用于<span class="_ _6"></span>坏<span class="_ _6"></span>块<span class="_ _6"></span>处<span class="_ _6"></span>理</span></div><div class="t m0 x1 h7 ye ff2 fs1 fc0 sc0 ls0 ws0">替换<span class="_ _6"></span>。因<span class="_ _6"></span>此,<span class="_ _6"></span>在用<span class="_ _6"></span>户看<span class="_ _6"></span>来,<span class="_ _6"></span>实际<span class="_ _6"></span>可以<span class="_ _6"></span>用于<span class="_ _6"></span>存储<span class="_ _6"></span>数据<span class="_ _6"></span>的容<span class="_ _6"></span>量为<span class="_ _b"> </span><span class="ff3">128 <span class="_ _6"></span>* 92% <span class="_ _6"></span>= 1178M</span>,从<span class="_ _7"> </span><span class="ff3">U<span class="_"> </span></span>盘看来<span class="_ _6"></span>,</div><div class="t m0 x1 h7 yf ff2 fs1 fc0 sc0 ls0 ws0">也就是用户在操作系统下看到的磁盘存储容量。</div><div class="t m0 x1 h6 y10 ff3 fs1 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1 h7 y11 ff1 fs1 fc0 sc0 ls0 ws0">3. FLASH<span class="_ _5"> </span><span class="ff2 sc1">块状态表格</span></div><div class="t m0 x1 h7 y12 ff3 fs1 fc0 sc0 ls0 ws0">FLASH<span class="_ _5"> </span><span class="ff2">块状态表格<span class="_ _5"> </span></span>16<span class="_ _5"> </span><span class="ff2">的版本存放在<span class="_ _5"> </span></span>FLASH 0<span class="_ _5"> </span><span class="ff2">块,从<span class="_ _5"> </span></span>P<span class="_ _1"></span>AGE 0<span class="_ _5"> </span><span class="ff2">开始存放。</span>FLASH<span class="_ _5"> </span><span class="ff2">块状态表格</span></div><div class="t m0 x1 h7 y13 ff2 fs1 fc0 sc0 ls0 ws0">存放着整块<span class="_ _5"> </span><span class="ff3">FLASH<span class="_ _5"> </span></span>所有块状态,它是根据第一次使用<span class="_ _5"> </span><span class="ff3">FLASH<span class="_ _5"> </span></span>根据其制造厂商保留的坏块标记</div><div class="t m0 x1 h7 y14 ff2 fs1 fc0 sc0 ls0 ws0">来建立的;每一个块的状态表示占用均为<span class="_ _5"> </span><span class="ff3">2<span class="_ _5"> </span></span>个字节,定义如下表<span class="_ _5"> </span><span class="ff3">1<span class="_ _5"> </span></span>所示:</div><div class="t m0 x2 h7 y15 ff3 fs1 fc0 sc0 ls0 ws0">FLASH<span class="_ _5"> </span><span class="ff2">值<span class="_ _c"> </span>状态</span></div><div class="t m0 x2 h6 y16 ff3 fs1 fc0 sc0 ls0 ws0">0x0<span class="_ _d"> </span>Block_BAD</div><div class="t m0 x2 h6 y17 ff3 fs1 fc0 sc0 ls0 ws0">0xff<span class="_ _2"></span>fe<span class="_ _e"> </span>Block_OK</div><div class="t m0 x2 h6 y18 ff3 fs1 fc0 sc0 ls0 ws0">0xFFFC<span class="_ _f"> </span>Block_Allocated</div><div class="t m0 x2 h7 y19 ff2 fs1 fc0 sc0 ls0 ws0">其它</div><div class="t m0 x3 h6 y1a ff3 fs1 fc0 sc0 ls0 ws0">Block_Remaped_to</div><div class="t m0 x4 h7 y1b ff3 fs1 fc0 sc0 ls0 ws0"> <span class="ff2">表<span class="_ _5"> </span></span>1</div><div class="t m0 x1 h7 y1c ff3 fs1 fc0 sc0 ls0 ws0">1)<span class="_ _10"> </span>0x0 Block_BAD—<span class="ff2">以此代码为标记的块为坏块,</span>FLASH<span class="_ _5"> </span><span class="ff2">管理系统应避免使用</span></div><div class="t m0 x1 h7 y1d ff3 fs1 fc0 sc0 ls0 ws0">2)<span class="_ _10"> </span>0xff<span class="_ _2"></span>fe Block_OK—<span class="ff2">以此代码为标记的块为正常块,</span>FLASH<span class="_ _5"> </span><span class="ff2">管理系统正常使用</span></div><div class="t m0 x1 h7 y1e ff3 fs1 fc0 sc0 ls0 ws0">3)<span class="_ _10"> </span>Block_Allocated—<span class="ff2">此代码用于标识保留区内的块已被分配于替换数据区内的坏块</span></div><div class="t m0 x1 h7 y1f ff3 fs1 fc0 sc0 ls0 ws0">4)<span class="_ _10"> </span>Block_Remaped_to—<span class="ff2">代码用<span class="_ _6"></span>于标识数据区<span class="_ _6"></span>内的坏块,而<span class="_ _6"></span>坏块已经被保<span class="_ _6"></span>留区内的坏块<span class="_ _6"></span>替换,</span></div><div class="t m0 x5 h7 y20 ff2 fs1 fc0 sc0 ls0 ws0">其值即为<span class="_ _5"> </span><span class="ff3">Remapped_to<span class="_ _5"> </span></span>的块号。</div><div class="t m0 x4 h7 y21 ff2 fs1 fc0 sc0 ls0 ws0">块<span class="_ _5"> </span>状<span class="_ _5"> </span>态<span class="_ _5"> </span>存<span class="_ _5"> </span>放<span class="_ _7"> </span>以<span class="_ _11"> </span><span class="ff3">Block<span class="_ _9"></span> <span class="_ _12"></span>0<span class="_ _11"> </span></span>开<span class="_ _5"> </span>始<span class="_ _5"> </span>顺<span class="_ _5"> </span>序<span class="_ _5"> </span>存<span class="_ _5"> </span>放<span class="_ _5"> </span>在<span class="_ _11"> </span><span class="ff3">FLASH<span class="_ _11"> </span></span>块<span class="_ _5"> </span>状<span class="_ _5"> </span>态<span class="_ _5"> </span>表<span class="_ _5"> </span>,<span class="_ _5"> </span>以<span class="_ _11"> </span><span class="ff3">K9F1G08U0A<span class="_ _11"> </span></span>为<span class="_ _5"> </span>例<span class="_ _5"> </span>,</div><div class="t m0 x4 h7 y22 ff3 fs1 fc0 sc0 ls0 ws0">MaxBlockSize<span class="_"> </span><span class="ff2">为<span class="_ _5"> </span></span>1<span class="_ _6"></span>024<span class="_ _6"></span><span class="ff2">,<span class="_ _6"></span>其<span class="_ _7"> </span></span>FLASH<span class="_"> </span><span class="ff2">块<span class="_ _6"></span>状<span class="_ _6"></span>态<span class="_ _6"></span>表<span class="_ _a"></span>的<span class="_ _6"></span>大<span class="_ _6"></span>小<span class="_ _6"></span>为<span class="_ _8"> </span></span>1024*2=2048<span class="_"> </span><span class="ff2">个字<span class="_ _a"></span>节,<span class="_ _a"></span>占<span class="_ _6"></span>用<span class="_ _6"></span>不<span class="_ _6"></span>到<span class="_ _a"></span>一个</span></div><div class="t m0 x4 h7 y23 ff2 fs1 fc0 sc0 ls0 ws0">页。</div><div class="t m0 x1 h7 y24 ff1 fs1 fc0 sc0 ls0 ws0">4.<span class="_ _13"> </span>NandFlash<span class="_ _5"> </span><span class="ff2 sc1">管理系统块映射方法的定义</span></div><div class="t m0 x1 h7 y25 ff3 fs1 fc0 sc0 ls0 ws0">NandFlash<span class="_ _5"> </span><span class="ff2">管理系统收<span class="_ _6"></span>到一个对逻辑<span class="_ _6"></span>块<span class="_ _5"> </span></span>0<span class="_ _5"> </span><span class="ff2">的处理<span class="_ _6"></span>请求,首先将<span class="_ _6"></span>它转换成物理<span class="_ _6"></span>块号,物理块<span class="_ _6"></span>号</span>=<span class="ff2">逻</span></div><div class="t m0 x1 h7 y26 ff2 fs1 fc0 sc0 ls0 ws0">辑块<span class="_ _7"> </span><span class="ff3">0+<span class="_ _6"></span></span>保<span class="_ _6"></span>留区<span class="_ _6"></span>块<span class="_ _6"></span>数。<span class="_ _6"></span>得<span class="_ _6"></span>到了<span class="_ _6"></span>物<span class="_ _6"></span>理块<span class="_ _6"></span>号<span class="_ _6"></span>后,<span class="_ _6"></span>可<span class="_ _6"></span>以开<span class="_ _6"></span>始<span class="_ _6"></span>在<span class="_ _14"> </span><span class="ff3">FLASH<span class="_ _5"> </span></span>块<span class="_ _6"></span>状<span class="_ _6"></span>态表<span class="_ _6"></span>中<span class="_ _6"></span>查找<span class="_ _8"> </span><span class="ff3">FLASH<span class="_"> </span></span>块的状</div><div class="t m0 x1 h7 y27 ff2 fs1 fc0 sc0 ls0 ws0">态,而物理块状态有以下几种情况(如表<span class="_ _5"> </span><span class="ff3">1</span>),对于各个可能的块的状态的分别处理如下:</div><div class="t m0 x5 h7 y28 ff3 fs1 fc0 sc0 ls0 ws0">1)<span class="_ _10"> </span>0xff<span class="_ _2"></span>fe Block_OK---<span class="ff2">说明块为正常块,</span>NandFlash<span class="_ _5"> </span><span class="ff2">管理系统可以使用</span></div><div class="t m0 x5 h7 y29 ff3 fs1 fc0 sc0 ls0 ws0">2)<span class="_ _10"> </span>0x0 Block_BAD----<span class="_ _6"></span><span class="ff2">说<span class="_ _6"></span>明<span class="_ _6"></span>块为<span class="_ _6"></span>坏<span class="_ _6"></span>块,<span class="_ _6"></span>不<span class="_ _6"></span>能使<span class="_ _6"></span>用<span class="_ _6"></span>;<span class="_ _6"></span></span>NandFlash<span class="_"> </span><span class="ff2">管理<span class="_ _6"></span>系统<span class="_ _6"></span>需<span class="_ _6"></span>要采<span class="_ _6"></span>用<span class="_ _6"></span>坏块<span class="_ _6"></span>替<span class="_ _6"></span>换</span></div><div class="t m0 x6 h7 y2a ff2 fs1 fc0 sc0 ls0 ws0">处理<span class="_ _6"></span>;<span class="_ _6"></span>坏块<span class="_ _6"></span>替<span class="_ _6"></span>换具<span class="_ _6"></span>体<span class="_ _6"></span>处理<span class="_ _6"></span>步<span class="_ _6"></span>骤,<span class="_ _6"></span>包<span class="_ _6"></span>括在<span class="_ _6"></span>保<span class="_ _6"></span>留区<span class="_ _6"></span>内<span class="_ _6"></span>找一<span class="_ _6"></span>个<span class="_ _6"></span>状态<span class="_ _6"></span>为<span class="_ _8"> </span><span class="ff3">Block_OK<span class="_ _6"></span></span>,<span class="_ _6"></span>且写<span class="_ _6"></span>块<span class="_ _6"></span>计</div><div class="t m0 x6 h7 y2b ff2 fs1 fc0 sc0 ls0 ws0">数<span class="_ _6"></span>器<span class="_ _a"></span><span class="ff3">(<span class="_ _a"></span></span>参<span class="_ _a"></span>考<span class="_ _7"> </span><span class="ff3">8<span class="_ _6"></span>.<span class="_ _6"></span> <span class="_ _a"></span></span>均<span class="_ _a"></span>匀<span class="_ _a"></span>存<span class="_ _6"></span>储<span class="_ _a"></span>算<span class="_ _a"></span>法<span class="_ _a"></span><span class="ff3">)<span class="_ _6"></span></span>最<span class="_ _a"></span>小<span class="_ _a"></span>的<span class="_ _6"></span>块<span class="_ _a"></span>;<span class="_ _a"></span>将<span class="_ _6"></span>找<span class="_ _a"></span>到<span class="_ _a"></span>块<span class="_ _6"></span>状<span class="_ _a"></span>态<span class="_ _a"></span>在<span class="_ _b"> </span><span class="ff3">FLASH<span class="_"> </span></span>块<span class="_ _a"></span>状<span class="_ _6"></span>态<span class="_ _a"></span>表<span class="_ _a"></span>中<span class="_ _6"></span>标<span class="_ _a"></span>记<span class="_ _a"></span>为</div><div class="t m0 x6 h7 y2c ff3 fs1 fc0 sc0 ls0 ws0">Block <span class="_ _2"></span>Allocated<span class="_ _6"></span><span class="ff2">;<span class="_ _6"></span>将<span class="_ _6"></span>找到<span class="_ _6"></span>块<span class="_ _6"></span>号写<span class="_ _6"></span>入<span class="_ _6"></span>作为<span class="_ _6"></span>数<span class="_ _6"></span>据区<span class="_ _6"></span>块<span class="_ _6"></span>状态<span class="_ _6"></span>;<span class="_ _6"></span>最后<span class="_ _6"></span>,<span class="_ _6"></span>根据<span class="_ _6"></span>需<span class="_ _6"></span>把原<span class="_ _6"></span>块<span class="_ _6"></span>内所<span class="_ _6"></span>有<span class="_ _6"></span>数</span></div><div class="t m0 x6 h7 y2d ff2 fs1 fc0 sc0 ls0 ws0">据移去新块,最后使用这个块以后即可进行读写操作。</div><div class="t m0 x5 h7 y2e ff3 fs1 fc0 sc0 ls0 ws0">3)<span class="_ _10"> </span>Block_Remaped_to----<span class="ff2">说明<span class="_ _6"></span>数据区的块已<span class="_ _6"></span>替换;则<span class="_ _7"> </span></span>NandFlash<span class="_ _5"> </span><span class="ff2">管理<span class="_ _6"></span>系统可直接对<span class="_ _6"></span>块号作</span></div><div class="t m0 x6 h7 y2f ff2 fs1 fc0 sc0 ls0 ws0">为<span class="_ _5"> </span><span class="ff3">Block_Remaped_to<span class="_ _5"> </span></span>替换块直接进行读写操作。</div></div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div>