#ifndef _LOADTABLE_H_ #define _LOADTABLE_H_ #include #include #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_