#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);
}
