|

楼主 |
发表于 2017-10-7 11:44:32
|
显示全部楼层
*********************************************************************************************************
* 函 数 名: NAND_BuildLUT
* 功能说明: 在内存中创建坏块管理表
* 形 参: ZoneNbr :区号
* 返 回 值: NAND_OK: 成功; NAND_FAIL:失败
*********************************************************************************************************
*/
static uint8_t NAND_BuildLUT(void)
{
uint16_t i;
uint8_t buf[VALID_SPARE_SIZE];
uint16_t usLBN; /* 逻辑块号 */
/* */
for (i = 0; i < NAND_BLOCK_COUNT; i++)
{
s_usLUT = 0xFFFF; /* 填充无效值,用于重建LUT后,判断LUT是否合理 */
}
for (i = 0; i < NAND_BLOCK_COUNT; i++)
{
/* 读每个块的第1个PAGE,偏移地址为LBN0_OFFSET的数据 */
FSMC_NAND_ReadSpare(buf, i * NAND_BLOCK_SIZE, 0, VALID_SPARE_SIZE);
/* 如果是好块,则记录LBN0 LBN1 */
if (buf[BI_OFFSET] == 0xFF)
{
usLBN = buf[LBN0_OFFSET] + buf[LBN1_OFFSET] * 256; /* 计算读出的逻辑块号 */
if (usLBN < NAND_BLOCK_COUNT)
{
/* 如果已经登记过了,则判定为异常 */
if (s_usLUT[usLBN] != 0xFFFF)
{
return NAND_FAIL;
}
s_usLUT[usLBN] = i; /* 更新LUT表 */
}
}
}
/* LUT建立完毕,检查是否合理 */
for (i = 0; i < NAND_BLOCK_COUNT; i++)
{
if (s_usLUT >= NAND_BLOCK_COUNT)
{
s_usValidDataBlockCount = i;
break;
}
}
if (s_usValidDataBlockCount < 100)
{
/* 错误: 最大的有效逻辑块号小于100。可能是没有格式化 */
return NAND_FAIL;
}
for (; i < s_usValidDataBlockCount; i++)
{
if (s_usLUT != 0xFFFF)
{
return NAND_FAIL; /* 错误:LUT表逻辑块号存在跳跃现象,可能是没有格式化 */
}
}
/* 重建LUT正常 */
return NAND_OK;
}
为什么以0XFFFF作为标志;不是OOB里坏块的标志 |
|