/** * 作用:对nand标强制擦除 * * 参数: * @blockid ---block块的字符串 * * * 描述:nand强制擦除功能,当如果有软件坏块时也可以用此函数来强制擦除 */ void bsp_nand_erase_force(char *blockid) { int ret = NANDC_ERROR; unsigned int id; char *blk_id = bsp_nand_argument_check(blockid); /* string to int */ ret= str2ul(blk_id, &id); if(ret) { NAND_TRACE(("[%s]ERROR: string to integer failed, ret = 0x%x.\n", __FUNCTION__, ret)); goto ERRO; } /*直接擦除*/ ret = nand_erase(id); if(ret) { NAND_TRACE(("[%s]ERROR: nand check bad failed, ret = 0x%x.\n", __FUNCTION__, ret)); goto ERRO; } else { NAND_TRACE(("SUCCESS: erase block %x forcely.\n", id)); } return; ERRO: return; }
/***************************************************************************** * name : flash_erase_force * * description : Erase nand block force, even if it's bad. * * input : char *partition_name: partition to be erase * * other : No *****************************************************************************/ void flash_erase_force(char *partition_name) { unsigned i = 0; unsigned ret = ERROR; unsigned block_start = 0; unsigned block_end= 0; struct nand_spec spec; struct ptentry *ptn = NULL; ret = nand_get_spec(&spec); if(ret) { cprintf("ERROR: nand get spec failed!\n"); goto EXIT; } partition_name = bsp_nand_argument_check(partition_name); if(NULL == partition_name) { cprintf("ERROR: no partition name!\n"); goto EXIT; } ptn = flash_find_ptn(partition_name); if(!ptn) { cprintf("ERROR: wrong partition name: %s\n", partition_name); goto EXIT; } /* coverity[uninit_use] */ block_start = (ptn->start + spec.blocksize- 1) / spec.blocksize; block_end = (ptn->start + ptn->length + spec.blocksize - 1) / spec.blocksize; for (i = block_start; i < block_end; i++) { ret = nand_erase(i); if(ret) { cprintf("ERROR: nand erase error, block id = %d, ret = %d.\n", i, ret); } } cprintf("Erase %s force finished!\n", partition_name); return; EXIT: cprintf("ret = 0x%x!\n", ret); return; }
/***************************************************************************** * name : flash_scan_bad * * description : scan bad block, if partition_name is NULL, scan all partitions * * input : char *partition_name: partition to scan * * other : No *****************************************************************************/ void flash_scan_bad(char *partition_name) { struct ptentry *ptn = NULL; struct ST_PART_TBL *part = (struct ST_PART_TBL *)SHM_MEM_PTABLE_ADDR; struct nand_spec spec; struct ptentry tn; if(nand_get_spec(&spec)) { cprintf("ERROR: nand get spec failed!\n"); return; } partition_name = bsp_nand_argument_check(partition_name); /* scan all partitions */ if(!partition_name) { part++; while(0 != strcmp(PTABLE_END_STR, part->name)) { if(DATA_VALID == ptable_get_validity(part)) { /* coverity[buffer_size_warning] */ strncpy(tn.name, part->name, 16); tn.start = part->offset; tn.length = part->capacity; /* coverity[uninit_use_in_call] */ get_partition_badblock(&tn, &spec); } part++; } } else /* scan one partition */ { ptn = flash_find_ptn(partition_name); if(!ptn) { cprintf("ERROR: wrong partition name: %s\n", partition_name); return; } /* coverity[uninit_use_in_call] */ get_partition_badblock(ptn, &spec); } cprintf("\n\n"); return; }
/** * 作用:对nand标坏块 * * 参数: * @blockid ---block块的字符串 * * * 描述:nand标坏块 */ void bsp_nand_markbad(char *blockid) { int ret = NANDC_ERROR; unsigned int id, bad_flag; char *blk_id = bsp_nand_argument_check(blockid); /* string to int */ ret= str2ul(blk_id, &id); if(ret) { NAND_TRACE(("ERROR: string to integer failed, ret = 0x%x.\n", ret)); goto EXIT; } /* check block bad. if good, mark bad; else return */ ret = nand_isbad(id, &bad_flag); if(ret) { NAND_TRACE(("[%s]ERROR: nand check bad failed, ret = 0x%x.\n", __FUNCTION__, ret)); goto EXIT; } if(NANDC_GOOD_BLOCK == bad_flag) { ret = nand_bad(id); if(ret) { NAND_TRACE(("[%s]ERROR: nand mark bad failed, ret = 0x%x.\n", __FUNCTION__, ret)); goto EXIT; } } else { NAND_TRACE(("[%s]WARNING: block 0x%x is already bad.\n", __FUNCTION__)); goto EXIT; } return; EXIT: return; }