qboot 信息头

1、qboot打印信息头

typedef struct {
    u8  type[4];
    u16 algo;
    u16 algo2;
    u32 time_stamp;
    u8  part_name[16];
    u8  fw_ver[24];
    u8  prod_code[24];
    u32 pkg_crc;
    u32 raw_crc;
    u32 raw_size;
    u32 pkg_size;
    u32 hdr_crc;
}fw_info_t;

  

2、从指定分区查找 固件信息

 qbt_fw_info_show(const char *part_name)

  

3、修改qboot release 调用函数

    if (strcmp(argv[1], "release") == 0)
    {
        char *part_name;
        if (argc < 3)
        {
            rt_kprintf(cmd_info[4]);
            return;
        }
        part_name = argv[2];

        //add by lsh
        char buf[128];
        my_release_from_part(part_name,"test release");

        return;
    }    

 

4、my_release_from_part函数

 

 bool my_release_from_part(const char *part_name,char *dst_buf)
{
    if ( ! qbt_fw_check(part_name, &fw_info, true))
    {
        return(false);
    }

    rt_kprintf("===lsh= Firmware infomation of %s partition ====\n", part_name);
    rt_kprintf("| Product code          | %*.s |\n", 20, fw_info.prod_code);
    rt_kprintf("| Destition partition   | %*.s |\n", 20, fw_info.part_name);
    rt_kprintf("| Version               | %*.s |\n", 20, fw_info.fw_ver);
    rt_kprintf("| Package size          | %20d |\n", fw_info.pkg_size);
    rt_kprintf("| Raw code size         | %20d |\n", fw_info.raw_size);
    rt_kprintf("| Package crc           | %20X |\n", fw_info.pkg_crc);
    rt_kprintf("| Raw code verify       | %20X |\n", fw_info.raw_crc);
    rt_kprintf("| Header crc            | %20X |\n", fw_info.hdr_crc);
    rt_kprintf("| Build timestamp       | %20d |\n", fw_info.time_stamp);
    rt_kprintf("\n");

    my_qbt_fw_release(dst_buf, part_name, &fw_info);

}

5、my_qbt_fw_release函数  

static bool my_qbt_fw_release(char *dst_part_name, const char *src_part_name, fw_info_t *fw_info)
{
    u32 cmprs_len = 0;
    u32 dst_write_pos = 0;
    u32 src_read_pos = sizeof(fw_info_t);
    fal_partition_t src_part = (fal_partition_t)fal_partition_find(src_part_name);
    //fal_partition_t dst_part = (fal_partition_t)fal_partition_find(dst_part_name);
    int crypt_type = (fw_info->algo & QBOOT_ALGO_CRYPT_MASK);
    int cmprs_type = (fw_info->algo & QBOOT_ALGO_CMPRS_MASK);

    if ( ! qbt_fw_decrypt_init(crypt_type))
    {
        LOG_E("Qboot release firmware fail. nonsupport encrypt type.");
        return(false);
    }

    if ( ! qbt_fw_decompress_init(cmprs_type))
    {
        LOG_E("Qboot release firmware fail. nonsupport compress type.");
        return(false);
    }

    rt_kprintf("Start erase partition %s ...\n", dst_part_name);
    /*
    if ((fal_partition_erase(dst_part, 0, fw_info->raw_size) < 0)
        || (fal_partition_erase(dst_part, dst_part->len - sizeof(fw_info_t), sizeof(fw_info_t)) < 0))
    {
        qbt_fw_decompress_deinit(cmprs_type);
        LOG_E("Qboot release firmware fail. erase %s error.", dst_part_name);
        return(false);
    }
*/
    rt_kprintf("Start release firmware to %s ...     ", dst_part_name);
    while(dst_write_pos < fw_info->raw_size)
    {
        int write_len = 0;
        int read_len = QBOOT_CMPRS_READ_SIZE;
        int remain_len = (fw_info->pkg_size + sizeof(fw_info_t) - src_read_pos);
        if (read_len > remain_len)
        {
            read_len = remain_len;
        }
        if ( ! qbt_fw_pkg_read(src_part, src_read_pos, cmprs_buf + cmprs_len, read_len, crypt_buf, crypt_type))
        {
            qbt_fw_decompress_deinit(cmprs_type);
            LOG_E("Qboot release firmware fail. read package error, part = %s, addr = %08X, length = %d", src_part_name, src_read_pos, read_len);
            return(false);
        }
        src_read_pos += read_len;
        cmprs_len += read_len;

        //write_len = qbt_dest_part_write(dst_part, dst_write_pos, crypt_buf, cmprs_buf, &cmprs_len, cmprs_type);
        write_len = my_qbt_dest_part_write(dst_part_name, dst_write_pos, crypt_buf, cmprs_buf, &cmprs_len, cmprs_type);
        if (write_len < 0)
        {
            qbt_fw_decompress_deinit(cmprs_type);
            LOG_E("Qboot release firmware fail. write destination error, part = %s, addr = %08X", dst_part_name, dst_write_pos);
            return(false);
        }
        dst_write_pos += write_len;

        rt_kprintf("================\b\b\b%02d%%==================\n", (dst_write_pos * 100 / fw_info->raw_size));
    }
    rt_kprintf("\n");

    /*
    qbt_fw_decompress_deinit(cmprs_type);
    if ( ! qbt_fw_info_write(dst_part_name, fw_info, true))
    {
        LOG_E("Qboot release firmware fail. write firmware to %s fail.", dst_part_name);
        return(false);
    }
*/
    return(true);
}

6、my_qbt_dest_part_write函数

static int my_qbt_dest_part_write(char *dst_buf, u32 pos, u8 *decmprs_buf, u8 *cmprs_buf, u32 *p_cmprs_len, int cmprs_type)
{
    int write_len = 0;
    int cmprs_len = 0;
    int decomp_len = 0;
    int block_size = 0;

    cmprs_len = *p_cmprs_len;

    switch(cmprs_type)
    {
    case QBOOT_ALGO_CMPRS_NONE:
        /*
        if (fal_partition_write(part, pos, cmprs_buf, cmprs_len) < 0)
        {
            return(-1);
        }
        write_len = cmprs_len;
        cmprs_len = 0;
        */
        break;

    #ifdef QBOOT_USING_QUICKLZ
    case QBOOT_ALGO_CMPRS_QUICKLZ:
        while(1)
        {
            if (cmprs_len < QBOOT_QUICKLZ_BLOCK_HDR_SIZE)
            {
                break;
            }
            block_size = qbt_quicklz_get_block_size(cmprs_buf);
            if (block_size <= 0)
            {
                break;
            }
            if (cmprs_len < block_size + QBOOT_QUICKLZ_BLOCK_HDR_SIZE)
            {
                break;
            }
            decomp_len = qbt_quicklz_decompress(decmprs_buf, cmprs_buf + QBOOT_QUICKLZ_BLOCK_HDR_SIZE);

            /********************************************************/
            /*add by lsh*/
            int cnt_i = 0;
            rt_kprintf("decompress -\n");
            for(cnt_i = 0;cnt_i<decomp_len;cnt_i++)
            {
                if(cnt_i%15 == 0)
                {
                    rt_kprintf("\n");
                }

                rt_kprintf("%02x ",decmprs_buf[cnt_i]);
            }
            rt_kprintf("\n");
            /********************************************************/
            if (decomp_len <= 0)
            {
                write_len = -1;
                cmprs_len = 0;
                break;
            }
/*
            if (fal_partition_write(part, pos, decmprs_buf, decomp_len) < 0)
            {
                write_len = -1;
                cmprs_len = 0;
                break;
            }
*/
            pos += decomp_len;
            write_len += decomp_len;
            cmprs_len -= (block_size + QBOOT_QUICKLZ_BLOCK_HDR_SIZE);
            memcpy(cmprs_buf, cmprs_buf + (block_size + QBOOT_QUICKLZ_BLOCK_HDR_SIZE), cmprs_len);
        }
        break;
    #endif
    default:
        write_len = -1;
        cmprs_len = 0;
        break;
    }

    *p_cmprs_len = cmprs_len;

    return(write_len);
}

7、解析的固件头信息

 

 8、解压缩的bin数据

 

 9、与原始的烧写文件对比 数据一致

 

 

 

 

10、另附上fpga的数据头解析定义

 

 

  

 

posted on 2022-04-01 17:44  紫枫术河  阅读(336)  评论(0)    收藏  举报

导航