Просмотр исходного кода

更新spi nand驱动,优化创建坏块表时遇到坏块后的异常卡死问题(CPU和MCU工程同步更新)。

helen 3 месяцев назад
Родитель
Сommit
f00505fb11

+ 25 - 7
amt630hv160-freertos-beta/lib/sfud/src/snfud.c

@@ -599,21 +599,28 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
 	uint32_t start_page;
 	int result;
 
-	SNFUD_ASSERT(chip);
-
 	start_page = phy_blk * chip->page_per_blk;
 
 	result = snf_read_page_spare(chip, start_page, spare_buf, sizeof(spare_buf));
 	if (result != SFUD_SUCCESS) {
-		SFUD_INFO("%s, snf_read_page_spare page0 fail, result:%d", __func__, result);
-		goto exit;
+		SFUD_INFO("%s, read page0 spare fail, result:%d", __func__, result);
+		if (result == SFUD_ERR_READ_ECC) {
+			result = SFUD_ERR_BAD_BLK;	//read ecc error means bad block.
+			goto exit;
+		}
+		return SFUD_ERR_READ;
 	}
+
 	if (spare_buf[0] == 0xFF) {
 		if (chip->bbm_type == 2) {
 			result = snf_read_page_spare(chip, start_page + 1, spare_buf, sizeof(spare_buf));
 			if (result != SFUD_SUCCESS) {
-				SFUD_INFO("%s, snf_read_page_spare page1 fail, result:%d", __func__, result);
-				goto exit;
+				SFUD_INFO("%s, read page1 spare fail, result:%d", __func__, result);
+				if (result == SFUD_ERR_READ_ECC) {
+					result = SFUD_ERR_BAD_BLK;	//read ecc error means bad block.
+					goto exit;
+				}
+				return SFUD_ERR_READ;
 			}
 			if (spare_buf[0] == 0xFF) {
 				return SFUD_SUCCESS;
@@ -623,12 +630,14 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
 		} else {
 			return SFUD_SUCCESS;
 		}
+	} else {
+		result = SFUD_ERR_BAD_BLK;
 	}
 
 exit:
 	SFUD_INFO("%s bad block:%d.", __func__, phy_blk);
 
-	return SFUD_ERR_READ;
+	return result;
 }
 
 static int snf_write_physical_blcok(snfud_flash_chip *chip, uint32_t phy_blk, uint32_t offset, uint8_t *data, uint32_t size)
@@ -1946,6 +1955,7 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 	sfud_err result = SFUD_SUCCESS;
 	uint8_t *pbuf;
 	int bbt_size;
+	int timeout;
 	int i;
 
 	bbt_size = sizeof(snf_bbt) + sizeof(snf_blk_node) * chip->total_blk;
@@ -1964,6 +1974,8 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 		SFUD_INFO("%s Create a new BBT.", __func__);
 		memset(chip->bbt, 0, bbt_size);
 		for (i = 0; i < chip->total_blk; i++) {
+			timeout = 0;
+retry:
 			result = snf_check_physical_bad_block(chip, i);
 			if (result == SFUD_SUCCESS) {
 				chip->bbt->node[i].status = SNF_BLK_GOOD;
@@ -1971,6 +1983,12 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 				chip->bbt->node[i].status = SNF_BLK_BAD;
 				chip->bbt->bad_blocks++;
 			} else {
+				if (timeout == 0) {
+					SFUD_INFO("%s block(%d) bad blk check fail, retry...", __func__, i);
+				}
+				if (timeout++ < 20) {
+					goto retry;
+				}
 				SFUD_INFO("%s block(%d) bad blk check fail, flash abnormal.", __func__, i);
 				SNFUD_ASSERT(0);
 			}

+ 25 - 7
amt630hv160-mcu/amt630hv160-mcu-iram/src/lib/sfud/src/snfud.c

@@ -603,21 +603,28 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
 	uint32_t start_page;
 	int result;
 
-	SNFUD_ASSERT(chip);
-
 	start_page = phy_blk * chip->page_per_blk;
 
 	result = snf_read_page_spare(chip, start_page, spare_buf, sizeof(spare_buf));
 	if (result != SFUD_SUCCESS) {
-		SFUD_INFO("%s, snf_read_page_spare page0 fail, result:%d", __func__, result);
-		goto exit;
+		SFUD_INFO("%s, read page0 spare fail, result:%d", __func__, result);
+		if (result == SFUD_ERR_READ_ECC) {
+			result = SFUD_ERR_BAD_BLK;	//read ecc error means bad block.
+			goto exit;
+		}
+		return SFUD_ERR_READ;
 	}
+
 	if (spare_buf[0] == 0xFF) {
 		if (chip->bbm_type == 2) {
 			result = snf_read_page_spare(chip, start_page + 1, spare_buf, sizeof(spare_buf));
 			if (result != SFUD_SUCCESS) {
-				SFUD_INFO("%s, snf_read_page_spare page1 fail, result:%d", __func__, result);
-				goto exit;
+				SFUD_INFO("%s, read page1 spare fail, result:%d", __func__, result);
+				if (result == SFUD_ERR_READ_ECC) {
+					result = SFUD_ERR_BAD_BLK;	//read ecc error means bad block.
+					goto exit;
+				}
+				return SFUD_ERR_READ;
 			}
 			if (spare_buf[0] == 0xFF) {
 				return SFUD_SUCCESS;
@@ -627,12 +634,14 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
 		} else {
 			return SFUD_SUCCESS;
 		}
+	} else {
+		result = SFUD_ERR_BAD_BLK;
 	}
 
 exit:
 	SFUD_INFO("%s bad block:%d.", __func__, phy_blk);
 
-	return SFUD_ERR_READ;
+	return result;
 }
 
 static int snf_write_physical_blcok(snfud_flash_chip *chip, uint32_t phy_blk, uint32_t offset, uint8_t *data, uint32_t size)
@@ -1556,6 +1565,7 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 	sfud_err result = SFUD_SUCCESS;
 	uint8_t *pbuf;
 	int bbt_size;
+	int timeout;
 	int i;
 
 	bbt_size = sizeof(snf_bbt) + sizeof(snf_blk_node) * chip->total_blk;
@@ -1574,6 +1584,8 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 		SFUD_INFO("%s Create a new BBT.", __func__);
 		memset(chip->bbt, 0, bbt_size);
 		for (i = 0; i < chip->total_blk; i++) {
+			timeout = 0;
+retry:
 			result = snf_check_physical_bad_block(chip, i);
 			if (result == SFUD_SUCCESS) {
 				chip->bbt->node[i].status = SNF_BLK_GOOD;
@@ -1581,6 +1593,12 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 				chip->bbt->node[i].status = SNF_BLK_BAD;
 				chip->bbt->bad_blocks++;
 			} else {
+				if (timeout == 0) {
+					SFUD_INFO("%s block(%d) bad blk check fail, retry...", __func__, i);
+				}
+				if (timeout++ < 20) {
+					goto retry;
+				}
 				SFUD_INFO("%s block(%d) bad blk check fail, flash abnormal.", __func__, i);
 				SNFUD_ASSERT(0);
 			}

+ 25 - 7
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/lib/sfud/src/snfud.c

@@ -597,21 +597,28 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
 	uint32_t start_page;
 	int result;
 
-	SNFUD_ASSERT(chip);
-
 	start_page = phy_blk * chip->page_per_blk;
 
 	result = snf_read_page_spare(chip, start_page, spare_buf, sizeof(spare_buf));
 	if (result != SFUD_SUCCESS) {
-		SFUD_INFO("%s, snf_read_page_spare page0 fail, result:%d", __func__, result);
-		goto exit;
+		SFUD_INFO("%s, read page0 spare fail, result:%d", __func__, result);
+		if (result == SFUD_ERR_READ_ECC) {
+			result = SFUD_ERR_BAD_BLK;	//read ecc error means bad block.
+			goto exit;
+		}
+		return SFUD_ERR_READ;
 	}
+
 	if (spare_buf[0] == 0xFF) {
 		if (chip->bbm_type == 2) {
 			result = snf_read_page_spare(chip, start_page + 1, spare_buf, sizeof(spare_buf));
 			if (result != SFUD_SUCCESS) {
-				SFUD_INFO("%s, snf_read_page_spare page1 fail, result:%d", __func__, result);
-				goto exit;
+				SFUD_INFO("%s, read page1 spare fail, result:%d", __func__, result);
+				if (result == SFUD_ERR_READ_ECC) {
+					result = SFUD_ERR_BAD_BLK;	//read ecc error means bad block.
+					goto exit;
+				}
+				return SFUD_ERR_READ;
 			}
 			if (spare_buf[0] == 0xFF) {
 				return SFUD_SUCCESS;
@@ -621,12 +628,14 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
 		} else {
 			return SFUD_SUCCESS;
 		}
+	} else {
+		result = SFUD_ERR_BAD_BLK;
 	}
 
 exit:
 	SFUD_INFO("%s bad block:%d.", __func__, phy_blk);
 
-	return SFUD_ERR_READ;
+	return result;
 }
 
 static int snf_write_physical_blcok(snfud_flash_chip *chip, uint32_t phy_blk, uint32_t offset, uint8_t *data, uint32_t size)
@@ -1550,6 +1559,7 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 	sfud_err result = SFUD_SUCCESS;
 	uint8_t *pbuf;
 	int bbt_size;
+	int timeout;
 	int i;
 
 	bbt_size = sizeof(snf_bbt) + sizeof(snf_blk_node) * chip->total_blk;
@@ -1568,6 +1578,8 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 		SFUD_INFO("%s Create a new BBT.", __func__);
 		memset(chip->bbt, 0, bbt_size);
 		for (i = 0; i < chip->total_blk; i++) {
+			timeout = 0;
+retry:
 			result = snf_check_physical_bad_block(chip, i);
 			if (result == SFUD_SUCCESS) {
 				chip->bbt->node[i].status = SNF_BLK_GOOD;
@@ -1575,6 +1587,12 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
 				chip->bbt->node[i].status = SNF_BLK_BAD;
 				chip->bbt->bad_blocks++;
 			} else {
+				if (timeout == 0) {
+					SFUD_INFO("%s block(%d) bad blk check fail, retry...", __func__, i);
+				}
+				if (timeout++ < 20) {
+					goto retry;
+				}
 				SFUD_INFO("%s block(%d) bad blk check fail, flash abnormal.", __func__, i);
 				SNFUD_ASSERT(0);
 			}