/******************************************************************************************
 * 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;
}
示例#2
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;

}