Files
banban/ql-bootloader/common/inc/loadtable.h

279 lines
8.3 KiB
C

#ifndef _LOADTABLE_H_
#define _LOADTABLE_H_
#include <stdlib.h>
#include <common.h>
#ifdef __cplusplus
extern "C" {
#endif
#define BINARY_LOAD_TABLE_OFFSET 0x04 //the size of region DDR_RO_INIT
#define FLASH_BASE_ADDR 0x80000000
#define INVALID_ADDRESS 0x4c4c554E //NULL
#define EMPTY_ADDRESS 0x00000000 //NULL
//++++++++++++++++++++++++++++++++++++++++++++++++++
//AREA_1: LOADTABLE_HEADER
#define LOADTABLE_HEADER_SIZE 28
typedef union{
struct loadtable_init_routine{
unsigned int b2init; /* branch to init routine */
unsigned int init; /* image init routine */
}init_routine;
unsigned char filer[LOADTABLE_HEADER_SIZE]; /* max size*/
}LOADTABLE_AREA_HEADER;
//++++++++++++++++++++++++++++++++++++++++++++++++++
//AREA_2: VERSION & SIGNATURE
typedef enum {
XIP,
PSRAM
}CP_EXECUTE_MODE;
typedef enum {
NBIOT,
CATM,
LTEONLY,
LTEGSM
}PS_MODE;
#define LOADTABLE_VER_AREA_SIZE 96
typedef union{
struct loadtable_version_info{
char anti_rollback_version[16]; /* anti-roll back version , co-work with boot33 */
char execute_mode[8]; /* XIP or PSRAM*/
char ps_mode[8]; /* LTEONLY/LG/CAT1/NBIOT*/
char image_info[50]; /* filled by external script ,default IMG_INFO as index*/
}version_info;
unsigned char filer[LOADTABLE_VER_AREA_SIZE]; /* max size*/
}LOADTABLE_AREA_VER_INFO;
//++++++++++++++++++++++++++++++++++++++++++++++++++
//AREA_3: RW COMPRESS REGION SYMBOL
#define RW_REGION_CPZ_NUM 16
#define RW_REGION_MARK_PRE_STRING "RW_CPZ_"
#define RW_REGION_CPZ_OFFSET 0xE8
#define RW_REGION_COMPRESSED_ADDR_NONE 0x00000000
typedef struct
{
char RW_REGION_MARK[7];
char RW_REGION_MARK_NUM;
char RW_REGION_NAME[8];
unsigned int RW_REGION_EXEC_ADDR;
unsigned int RW_REGION_LOAD_ADDR;
unsigned int RW_REGION_LENGTH;
unsigned int RW_REGION_COMPRESSED_ADDR;
}rw_region_item;
#define LOADTABLE_RW_CPZ_SIZE 512
typedef union{
rw_region_item compress_rw_region_list[RW_REGION_CPZ_NUM];
unsigned char filer[LOADTABLE_RW_CPZ_SIZE]; /* max size*/
}LOADTABLE_AREA_RW_CPZ_INFO;
//++++++++++++++++++++++++++++++++++++++++++++++++++
//AREA_4: ARMLINKE SYMBOL LIST
typedef struct{
char name[12];
unsigned int value;
}armlink_symbol_item;
typedef struct {
//cp.bin
armlink_symbol_item cp_exec_addr;
armlink_symbol_item cp_load_addr;
armlink_symbol_item image_end;
armlink_symbol_item binary_size;
//dsp.bin
armlink_symbol_item dsp_begin_addr;
armlink_symbol_item dsp_end_addr;
//rf.bin
armlink_symbol_item rf_z2_load_addr;
armlink_symbol_item rf_a0_load_addr;
//rd.bin
armlink_symbol_item rd_begin_addr;
armlink_symbol_item rd_end_addr;
//apn.bin
armlink_symbol_item apn_begin_addr;
armlink_symbol_item apn_end_addr;
//fota_param
armlink_symbol_item fota_param_start_address;
armlink_symbol_item fota_param_end_address;
//updater
armlink_symbol_item updater_start_address;
armlink_symbol_item updater_end_address;
//fota_pkg
armlink_symbol_item fota_pkg_start_address;
armlink_symbol_item fota_pkg_end_address;
//nvm
armlink_symbol_item nvm_begin_addr;
armlink_symbol_item nvm_end_addr;
//factory_a
armlink_symbol_item factory_a_begin_addr;
armlink_symbol_item factory_a_end_addr;
//factory_b
armlink_symbol_item factory_b_begin_addr;
armlink_symbol_item factory_b_end_addr;
#if 0
//mmipool
armlink_symbol_item mmipool_start_address;
armlink_symbol_item mmipool_size_address;
#endif
//ddr_ro_exec
armlink_symbol_item ddr_ro_exec_address;
armlink_symbol_item ddr_ro_exec_size_address;
//using heap to backup dsp
armlink_symbol_item ddr_heap_guard_begin_addr;
armlink_symbol_item ddr_heap_guard_end_addr;
armlink_symbol_item dsp_bk_size;
}loadtable_armlink_symbol_info;
#define LOADTABLE_ARMLINK_SYMBOL_SIZE 512
typedef union{
loadtable_armlink_symbol_info armlink_symbol_info;
unsigned char filer[LOADTABLE_ARMLINK_SYMBOL_SIZE]; /* max size*/
}LOADTABLE_AREA_ARMLINK_SYMBOL;
//++++++++++++++++++++++++++++++++++++++++++++++++++
//AREA_5: FUNCTIONAL VAL
typedef struct{
char name[12];
unsigned int value;
}functional_item;
typedef struct {
functional_item vergin; /* vergin */
functional_item number_of_life; /* number_of_life++ for each bootup,design for SIMPIN lock detect */
functional_item uart_printf_enable; /* enable uart printf after CP init*/
functional_item fatal_printf_enable; /* enable fatal printf after CP init */
functional_item default_core_freq; /* TODO:further porting */
functional_item default_core_voltage; /* TODO:further porting*/
}loadtable_functional_info;
#define LOADTABLE_FUNC_VAL_SIZE 256
typedef union{
loadtable_functional_info func_val;
unsigned char filer[LOADTABLE_FUNC_VAL_SIZE]; /* max size*/
}LOADTABLE_AREA_FUNC_VAL;
typedef struct
{
LOADTABLE_AREA_HEADER lt_area_header;
LOADTABLE_AREA_VER_INFO lt_area_ver_info;
LOADTABLE_AREA_RW_CPZ_INFO lt_area_rw_cpz_info;
LOADTABLE_AREA_ARMLINK_SYMBOL lt_area_armlink_symbol;
LOADTABLE_AREA_FUNC_VAL lt_area_func_val;
/* TODO: explore the vendor area for customer's usage
LOADTABLE_AREA_vendor lt_area_vendor;
*/
}LoadTableType;
/**************************************/
//for craneM section compressed DSP
typedef struct _asr_section_ImageStruct{
UINT32 ImageID;
UINT32 ImagesOffset;
UINT32 ImagesLen;
UINT32 ImagesCheckSum;
UINT32 DeviceFlashAddress;
//UINT32 oldDeviceFlashLen;
UINT32 reserved[7];
}asr_section_ImageStruct;
#define SECTION_MAX_NUMBER_OF_IMAGE 64
#define LZMA_SECTION_MAGIC 0x4C5A4D41
typedef struct _asr_section_head_info{
UINT32 magic;
UINT32 format_version;
UINT32 reserved1[32];
asr_section_ImageStruct Image[SECTION_MAX_NUMBER_OF_IMAGE];
UINT32 reserved2[221];
UINT32 checksum;
}asr_section_head_info;
typedef union{
asr_section_head_info section_head;
unsigned char reserved[4096];
}ASR_SECTION_HEADER;
/**************************************/
#ifdef QUECTEL_FOTA // quectel add
unsigned int get_nvm_start_address(void);
unsigned int get_nvm_end_address(void);
#endif
void loadtable_init(unsigned int cp_flash_addr);
unsigned int get_cp_load_addr(void);
unsigned int get_cp_exec_addr(void);
unsigned int get_cp_binary_size(void);
unsigned int get_cp_copy_size(void);
unsigned int get_dsp_load_addr(void);
unsigned int get_dsp_copy_size(void);
unsigned int get_rf_load_addr(void);
unsigned int get_rw_cpz_struct_addr(void);
unsigned int get_fota_param_start_addr(void);
unsigned int get_fota_pkg_start_addr(void);
unsigned int get_updater_start_addr(void);
unsigned int get_updater_copy_size(void);
void set_rd_begin_addr(unsigned int begin_addr);
void set_apn_begin_addr(unsigned int begin_addr);
void set_nvm_begin_addr(unsigned int begin_addr);
void set_md_end_addr(unsigned int end_addr);
void set_apn_end_addr(unsigned int end_addr);
void set_nvm_end_addr(unsigned int end_addr);
unsigned int get_ps_mode(void);
unsigned int get_rf_load_size(void);
void update_nvm_begin_addr(unsigned int available_base_addr);
void dump_loadtable(void);
int anti_rollback_check(void);
CP_EXECUTE_MODE get_cp_execute_mode(void);
void number_of_life_update(void);
int vergin_status_fetch(void);
unsigned int get_factory_a_start_address(void);
unsigned int get_dsp_adc_start_addr(void);
unsigned int get_dsp_adc_end_addr(void);
unsigned int get_dsp_adc_copy_size(void);
unsigned int get_dsp_adc_backup_start_addr(void);
unsigned int get_dsp_adc_backup_end_addr(void);
unsigned int get_ddr_heap_size(void);
unsigned int get_dsp_backup_addr(void);
unsigned int get_dsp_backup_size(void);
BOOL IsUpdaterbakExist(void);
unsigned int get_updater_backup_start_addr(void);
typedef enum{
CRANE_Z2 = 0xF16731,
CRANE_A0 = 0xA06731,
CRANE_A1 = 0xA16731
}CRANE_CHIP_TYPE;
unsigned int getLongChipId(void);
#ifdef SUPPORT_FLASH_IMAGE_PROTECT
typedef enum
{
IMG_PROTECT_OPT_ERASE,
IMG_PROTECT_OPT_PROGRAM,
} IMG_PROTECT_OPT;
BOOL IsImageProtectArea_Boot(UINT32 addr, UINT32 size,IMG_PROTECT_OPT opt);
#endif
#ifdef __cplusplus
}
#endif
#endif // _LOADTABLE_H_