blob: 5d89fe36ea903784ca97fe8e0689f1f68333bcaa [file] [log] [blame]
#include "string.h"
#include "debug.h"
#include "util.h"
#include "flash_adaptor.h"
#include "load_blimglst.h"
/*bootloader image list*/
#define MAX_HEADER_IMAGE_NUM 16
typedef struct {
int num;
struct block_param block_params[MAX_HEADER_IMAGE_NUM];
}header_image_list_t;
static header_image_list_t header_image_list;
/*bootloader image list end*/
void dump_block_param(struct block_param *block_param_entry)
{
dbg_printf(PRN_RES,"%s:offset = %d,size = %d,flags = %d,reserved = %s\n",
block_param_entry->block_name,block_param_entry->offset,block_param_entry->size,
block_param_entry->flags,block_param_entry->reserved);
}
int get_image_list_info(int part, unsigned int start, unsigned int size, unsigned char* buff)
{
long long ret = 0;
int part_addr = 0;
dbg_printf(PRN_DBG,"EMMC: Load image list info from boot partition %d.\n", part);
//switch to boot area
part_addr = switch_flash_part(part);
if(part_addr < 0) {
dbg_printf(PRN_ERR,"flash: error when switch to boot partion %d(err = %d).\n", part, part_addr);
return part_addr;
}
ret = read_flash((part_addr + start), size, buff);
if(ret){
dbg_printf(PRN_ERR,"flash: read version table error\n");
return FLASH_OP_ERR;
}
return switch_flash_part(0);
}
int parse_image_list_info(unsigned char* buff)
{
int i = 0;
bootloader_header_t *header=(bootloader_header_t*)buff;
struct block_param *block_param_entry;
header_image_list.num = 0;
if(header->magicnum == BOOTLOADER_HEADER_MAGICNUM){
for(i=0;i<header->number_of_blocks;i++){
block_param_entry = &header->block_params[i];
memcpy(&(header_image_list.block_params[i]),block_param_entry,sizeof(struct block_param));
header_image_list.num ++;
dump_block_param(&(header_image_list.block_params[i]));
}
}
return 0;
}
int find_image(const void *name)
{
int i = 0;
for(i = 0; i < header_image_list.num; i++) {
if(strlen(name) != strlen(header_image_list.block_params[i].block_name))
continue;
if(memcmp(name, header_image_list.block_params[i].block_name, strlen(name)) == 0) {
return i;
}
}
return IMAGE_NON_EXIST;
}
int fetch_image_info(int num, struct block_param *param)
{
if((num >= 0) && (num < header_image_list.num)) {
memcpy(param, &(header_image_list.block_params[num]), sizeof(struct block_param));
return num;
}
return IMAGE_NON_EXIST;
}
int read_image_data(struct block_param *param, unsigned char *image_buff, int part)
{
long long ret = 0;
int part_addr = 0;
unsigned int image_start = 0, size = 0;
if( (!param) || (!image_buff) ){
dbg_printf(PRN_RES,"param or image_buff NULL pointer error!\n");
return -2;
}
//switch to boot area
part_addr = switch_flash_part(part);
if(part_addr < 0) {
dbg_printf(PRN_ERR,"flash: error when switch to boot partion %d(err = %d).\n", part, part_addr);
return part_addr;
}
image_start = part_addr + param->offset + IMGLST_INFO_ADDR;
size = param->size;
ret = read_flash(image_start, size, image_buff);
if(ret) {
dbg_printf(PRN_ERR,"flash: read %s fail.\n", param->block_name);
return ret;
}
return switch_flash_part(0);
}