|

楼主 |
发表于 2017-10-6 17:13:16
|
显示全部楼层
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; /* 计算读出的逻辑块号 */
//1页=2^14 一个块64页
//逻辑空间地址为M位 M=20
if (usLBN < NAND_BLOCK_COUNT)
{
/* 如果已经登记过了,则判定为异常 */
if (s_usLUT[usLBN] != 0xFFFF)
{
return NAND_FAIL;
}
s_usLUT[usLBN] = i; /* 更新LUT表 */
printf("%d%\\n",i);
printf("\\r\\n");
}
}
}
/* 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;
} |
|