/****************************************************************************************** * FUNC NAME: * @flash_find_ptn() - external API: * * PARAMETER: * @name -[input] which partition to be find for fastboot * * RETURN: * partition info of struct ptentry * * DESCRIPTION: * find fastboot partition informatin from flash partition table in AXI memory * * CALL FUNC: *****************************************************************************************/ struct ptentry_ex *flash_find_ptnex(const char *name) { struct ST_PART_TBL *part = NULL; part = (struct ST_PART_TBL *)SHM_MEM_PTABLE_ADDR; while(0 != strcmp(PTABLE_END_STR, part->name)) { if((0 == strcmp(name , part->name)) && (DATA_VALID == ptable_get_validity(part))) { pt_find.ptn.flags = 0; pt_find.ptn.length = part->capacity; pt_find.ptn.start = part->offset; pt_find.ptn.property = part->property; pt_find.entry = part->entry; pt_find.loadaddr = part->loadaddr; pt_find.image = part->image; pt_find.property = part->property; /* coverity[secure_coding] */ strcpy(pt_find.ptn.name, part->name); return &pt_find; } part++; } return 0; }
/***************************************************************************** * 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; }
/**************************************************************************************** * FUNC NAME: * ptable_find_by_type() - external API: find one partition address in flash partition * table * * PARAMETER: * @part_type -[input] which type of partition to find * @ptable -[input] form which partition table to find * * * DESCRIPTION: * find partition description by type,找到最新的分区(有效)用于加载和读取 * * CALL FUNC: * ***************************************************************************************/ struct ST_PART_TBL * ptable_find_by_type(u32 type_idx, struct ST_PART_TBL * ptable) { struct ST_PART_TBL * the_newer = NULL; /*保存最新的分区*/ if(NULL == ptable) { goto EXIT; } while(0 != strcmp(PTABLE_END_STR, ptable->name)) { if(type_idx == ptable->image) { if(NULL == the_newer) { if(DATA_VALID == ptable_get_validity(ptable)) { the_newer = ptable; } } else { if(DATA_VALID == ptable_get_validity(ptable)) { /*保存较新的分区*/ the_newer = (the_newer->count < ptable->count) ? ptable : the_newer ; } } } ptable++; } EXIT: return the_newer; }