/****************************************************************************** * 函 数 名: burn_efuse_nandc * 功能描述: 将flash spec info烧写进efuse * 输入参数: 无 * 输出参数: 无 * 返 回 值: 0 - 成功; 非0 - 失败 * 函数说明: *******************************************************************************/ s32 burn_efuse_nandc(void) { s32 ret = ERROR; u32 burn_flag = 0; /* 1 - already burn; 0 - not burn */ struct nand_spec *spec; /* check whether nand info already burn */ /* coverity[no_effect_test] */ ret = is_burn(&burn_flag); if(ret) { PRINT_MSG("Check efuse info error\n"); goto erro; } if(burn_flag) { PRINT_MSG("Efuse nandc info already burn\n"); return OK; } /* get flash info */ spec = (struct nand_spec *)alloc(sizeof(struct nand_spec)); if(!spec) { PRINT_MSG("Malloc memory failed\n"); goto erro; } ret = bsp_get_nand_info(spec); if(OK != ret) { PRINT_MSG("Get flash info failed\n"); goto erro; } PRINT_MSG("After get spec\n"); PRINT_MSG("spec->pagesize : 0x%x\n", spec->pagesize); PRINT_MSG("spec->pagenumperblock : 0x%x\n", spec->pagenumperblock); PRINT_MSG("spec->addrnum : 0x%x\n", spec->addrnum); PRINT_MSG("spec->ecctype : 0x%x\n", spec->ecctype); /* burn flash info into efuse */ ret = do_burn(spec); if(OK != ret) { PRINT_MSG("Burn flash info failed\n"); goto erro; } return OK; erro: return ret; }
/** * 作用:读取分区相对偏移地址的标志值,主要是为NV模块用,查询此分区的偏移地址的标志位的值 * * 参数: * @partition_name ---分区名 * @partition_offset ---分区的相对偏移 * @flag ---把检测的分区的标志值存放在此flag中 * 描述:NV模块把一个分区的一个block的最后一页的OOB中存放特定标记值,读此标记值存放在flag中 */ u32 bsp_nand_read_flag_nv(const char *partition_name, u32 partition_offset, unsigned char *flag) { u32 flash_addr; u32 ret = NANDC_ERROR; static unsigned char *buffer = NULL; struct nand_spec spec; struct ST_PART_TBL * ptable = find_partition_by_name((char *)partition_name); /*参数不对*/ if(!ptable) { goto ERRO; } if(!flag) { NAND_TRACE(("argu error.\n")); goto ERRO; } /*得到此分区的nandflash的规格参数*/ ret = bsp_get_nand_info(&spec); if(ret) { goto ERRO; } /*没有内存时分配内存*/ if(!buffer) { buffer = (unsigned char *)himalloc(spec.pagesize + YAFFS_BYTES_PER_SPARE); if(!buffer) { NAND_TRACE(("get ram buffer failed!\n")); goto ERRO; } } memset(buffer, 0xFF, spec.pagesize + YAFFS_BYTES_PER_SPARE); flash_addr = ptable->offset + partition_offset; /*使能ECC功能的带OOB读数据功能*/ ret = nand_read_oob((flash_addr + spec.blocksize - spec.pagesize), (unsigned int)buffer, (spec.pagesize + YAFFS_BYTES_PER_SPARE),YAFFS_BYTES_PER_SPARE ,NULL); if(ret) { NAND_TRACE(("nand read oob failed!\n")); goto ERRO; } *flag = (*(buffer + spec.pagesize) == NV_WRITE_SUCCESS) ? NV_WRITE_SUCCESS : (~NV_WRITE_SUCCESS); return NANDC_OK; ERRO: return ret; }
/** * 作用:打印nandflash相关规格参数的函数接口 * * 输入参数:无 * * * 描述:打印nand->spec 参数值 */ void bsp_show_nand_info(void) { struct nand_spec spec; if(NAND_ERROR == bsp_get_nand_info(&spec)) { NAND_TRACE(("ERROR: nand get spec error.\n")); return; } NAND_TRACE((" ------begin show nand info----------\n")); NAND_TRACE((" chipsize=%dMB,blocksize=%dKB,pagesize=%dKB,sparesize=%d\n", (spec.chipsize/1024/1024),spec.blocksize/1024,spec.pagesize/1024,spec.sparesize)); NAND_TRACE((" pagenumperblock=%d,ecctype=%d,buswidth=%d,addrnum=%d\n", spec.pagenumperblock,spec.ecctype,(0==spec.buswidth?8:16),spec.addrnum)); NAND_TRACE((" ------end show nand info----------\n")); }