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的数据头解析定义

浙公网安备 33010602011771号