From 80805e678632c53eef66289031a18b8c7c192402 Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 10:13:02 +0800 Subject: [PATCH 1/7] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E6=8B=8D=E6=91=84?= =?UTF-8?q?=E8=BF=87=E5=90=8Ecpu=E5=8D=A0=E7=94=A8=E9=AB=98=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/cardv/SrcCode/UIApp/Movie/UIAppMovie_Exe.c | 1 + 1 file changed, 1 insertion(+) diff --git a/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_Exe.c b/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_Exe.c index 6a4899e3f..9306ca6bf 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_Exe.c +++ b/code/application/source/cardv/SrcCode/UIApp/Movie/UIAppMovie_Exe.c @@ -833,6 +833,7 @@ static void MovieExe_WifiCB(HD_VIDEO_FRAME *pEthcamSrc) //#if (MOVIE_UVAC_FUNC == DISABLE) //if (System_GetState(SYS_STATE_CURRSUBMODE) != SYS_SUBMODE_WIFI) { if (ImageApp_MovieMulti_IsStreamRunning(_CFG_STRM_ID_1) == FALSE) { + vos_util_delay_ms(10); return; } //#endif From c0fe89962f2f1e13b674a90efd6b3b11f979e747 Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 10:24:07 +0800 Subject: [PATCH 2/7] =?UTF-8?q?1.=E5=88=A0=E9=99=A4loader=E7=9A=84?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.bak | 3253 ----------------- .../LIBExt_src/Ctrl_Flow/bl_func.c.jack | 3221 ---------------- .../Release/ObjectLds/LDS_LZ_R.lds | 172 - .../Loader565_Data/Release/ObjectLds/ld_ext.d | 98 - .../Release/ObjectLds/ld_lib.txt | 1 - .../Release/ObjectLds/ld_lib_ban.txt | 1 - .../Loader565_Data/Release/ObjectLds/libs.txt | 1 - .../Loader565_Data/Release/ObjectLds/objs.txt | 1 - .../Release/ObjectLds/replace.lds | 172 - loader/Project/Model/tmp_awk1 | 0 10 files changed, 6920 deletions(-) delete mode 100755 loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.bak delete mode 100755 loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.jack delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/LDS_LZ_R.lds delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_ext.d delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib.txt delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib_ban.txt delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/libs.txt delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/objs.txt delete mode 100644 loader/Project/Model/Loader565_Data/Release/ObjectLds/replace.lds delete mode 100644 loader/Project/Model/tmp_awk1 diff --git a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.bak b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.bak deleted file mode 100755 index 47831ca29..000000000 --- a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.bak +++ /dev/null @@ -1,3253 +0,0 @@ -/* - Main control function - - This file is implement by user mode - - @file bl_func.c - - Copyright Novatek Microelectronics Corp. 2014. All rights reserved. -*/ - -#include "fuart.h" -#include "fat.h" -#include "rtc.h" -#include "timer.h" -#include "StorageDef.h" -#include "global.h" -#include "Clock.h" -#include "bl_func.h" -#include "Cache.h" -#include "string.h" -#include "lz.h" -#include "debug.h" -#include "CC.h" -#include "loader.h" -#include "nvtpack.h" -#include "dram_partition_info.h" -#include "emb_partition_info.h" -#include "modelext_parser.h" -#include "bin_info.h" -#include "shm_info.h" -#include "gic.h" -#include "libfdt.h" -#include -#include "bl_u2.h" -#include "crypto.h" -#include "nand.h" -#include "nor.h" - -//#if (LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) -//static uint32_t global_timer_freq = 3000000; //3MHz = 3000000 Hz -//#endif -PSTORAGE_OBJ int_strg_obj = NULL; - -#define FW_PART1_SIZE_OFFSET (CODE_SECTION_OFFSET + 0x04) //ref to CodeInfo.S on rtos (addr of _section_01_size) -//#define TEE_HEADER_SIZE 0x1C // refer to: optee_header_t - -#define _THUMB2 __attribute__((target("thumb2"))) - -#define bl_memcpy utl_memcpy -#define bl_memset utl_memset -#define ALIGN_FLOOR(value, base) ((value) & ~((base)-1)) -#define ALIGN_CEIL(value, base) ALIGN_FLOOR((value) + ((base)-1), base) -#define SIZE_PRELOAD 0x400 -#define SIZE_PRESERVE_USB 0x2000 - -#define HEADINFO_UBOOT(p_parti) ((HEADINFO *)(p_parti->uboot_addr + BIN_INFO_OFFSET_UBOOT)) -#define HEADINFO_TEEOS(p_parti) ((HEADINFO *)(p_parti->teeos_addr + BIN_INFO_OFFSET_TEEOS)) -#define IS_BIN_OVERLAP(addr1, size1, addr2, size2) (!(((addr1 + size1 - 1) < addr2) || (addr1 > (addr2 + size2 - 1)))) - -#if (STORAGE_EXT_TYPE != STORAGE_EXT_USB) -extern void set_usb_suspend(void); -#endif - -#if (_ROM_PUBLIC_API_ == 1) -#define ROM_LZMA_POSITION 0x7fd0 -UINT8 lzma_temp_buffer[65536]; -int (*rom_lzma_inflate)(UINT8 *in_ptr, UINT32 in_size, UINT8 *out_ptr, UINT32 out_size, UINT8 *p_tmp, UINT32 tmp_size); -#endif - -extern char _loader_exec_compres_start[]; -//extern char _load_nand_table_start_base[]; -extern char _load_LOADER_CONFIGRAM_FREQ_PARAM_end_base[]; -extern void core1_reset(void); - -// Function from Timer.c -//extern UINT32 timer_getLdrElapse(void); - -// Define in MakeConfig.txt -static UINT8 UPDATE_FW_NAME[] = {"FW98520A.BIN"}; -static UINT8 UPDATE_LOADER_NAME[] = {"LD98520A.BIN"}; -static UINT8 RUN_FW_NAME[] = {"FW98520T.BIN"}; -static UINT8 *LOADER_START_STR = {(UINT8 *)"\r\nLoader Start ..."}; -//#if !USB_WRITELOADER -#if (STORAGE_EXT_TYPE != STORAGE_EXT_USB) -//static UINT8 *RUN_WRKEY_NAME = {(UINT8 *)"WRKEY.BIN"}; -#if UPDATE_SIM_CODE -static UINT8 *RUN_WRKEY_NAME = {(UINT8 *)"SIM.BIN"}; -#endif -#endif -static UINT8 RECOVERY_FW_NAME[] = {"FW98520R.BIN"}; -static UINT32 g_uiPartitionID = 2; - -static UINT32 g_uiVersion = 0; - -// Error message -static char FWErrorMsg[] = "\r\nFW check fail\r\n"; -static char RWErrorMsg[] = "\r\nR/W error\r\n"; -static char LoaderErrorMsg[] = "\r\nLoader check fail\r\n"; - -UINT32 TopOfStack; -UINT32 BaseOfStack; - -extern char _loader_heap_base[]; - -static BOOL g_is_flash_open = FALSE; // indicate flash is open for updating non-fully all-in-one bin. - -static LDR_FASTBOOT_KEY_CB gFastbootKeyCallBack = NULL; -static LDR_SPECIAL_KEY_CB gSpecialKeyCallBack = NULL; -static LDR_CARD_DETECT_CB gCardDetectCallBack = NULL; -static STORAGEINT gStorageIntType = STORAGEINT_UNOKNOWN; - -static LDR_RECOVERY_TRIGGER_CB gRecoveryTriggerCallBack = NULL; -//#if (!USB_WRITELOADER) -//#if (STORAGE_EXT_TYPE != STORAGE_EXT_USB) -//static BOOL g_is_recovery_triggered = FALSE; // indicate recovery flow is triggered. -//#endif -_THUMB2 static int bl_is_smp(unsigned char *p_fdt); -static UINT32 g_uiStartBlkUpdateFW = StartNandBlkUpdateFW; -static UINT32 g_uiNandBlkSize = 0; -static UINT32 g_rtos_load_addr = 0; -static UINT32 g_rtos_target_addr = 0; -static UINT32 g_rtos_size = 0; - -#if (FDT_SUPPORT) -#define PATH_MEM_DRAM "/nvt_memory_cfg/dram" -#define PATH_MEM_LOADER "/nvt_memory_cfg/loader" -#define PATH_MEM_UBOOT "/nvt_memory_cfg/uboot" -#define PATH_MEM_FDT "/nvt_memory_cfg/fdt" -#define PATH_MEM_SHMEM "/nvt_memory_cfg/shmem" -#define PATH_MEM_RTOS "/nvt_memory_cfg/rtos" -#define PATH_MEM_NUTTX "/nvt_memory_cfg/nuttx" -#define PATH_MEM_TEEOS "/nvt_memory_cfg/teeos" -#define PATH_MEM_HDAL "/hdal-memory/media" -#define PATH_MEM_CORE2_ENTRY1 "/nvt_memory_cfg/core2entry1" -#define PATH_MEM_CORE2_ENTRY2 "/nvt_memory_cfg/core2entry2" -#define PATH_NVT_INFO "/nvt_info" -#define PATH_NVTPACK_INDEX "nvtpack/index" -#define PATH_PARTITION_LOADER "partition_loader" -#define PATH_PARTITION_FDT "partition_fdt" -#define PATH_PARTITION_UBOOT "partition_uboot" -#define PATH_PARTITION_NUTTX "partition_nuttx" -#define PATH_PARTITION_TEEOS "partition_teeos" -#define PATH_PARTITION_RTOS "partition_rtos" -#define PROPERTY_REG "reg" -#define PROPERTY_LABEL "label" -#define PROPERTY_PARTITION_NAME "partition_name" -#define PROPERTY_NVT_LINUX_SMP "NVT_LINUX_SMP" -static DRAM_PARTITION g_dram_partition = {0}; -static EMB_PARTITION g_emb_uboot = {0}; -static EMB_PARTITION g_emb_teeos = {0}; -static EMB_PARTITION g_emb_rtos = {0}; -#else // NO FDT_SUPPORT -// refer to met-tbl.dtsi /nvt_memory_cfg -static DRAM_PARTITION g_dram_partition = { - .dram_addr = 0x00000000, - .dram_size = 0x20000000, - .rev_addr = 0x00007E00, ///< shmem - .rev_size = 0x00000200, ///< shmem - .loader_addr = 0x01000000, - .loader_size = 0x00800000, - .fdt_addr = 0x01800000, - .fdt_size = 0x00040000, - .uboot_addr = 0x1E000000, - .uboot_size = 0x01FC0000, - .rtos_addr = 0x01840000, ///< optional, only for fast-boot, - .rtos_size = 0x00780000, ///< optional, only for fast-boot - .core2_entry1_addr = 0x00000000, ///< optional, only for dual core IC (fixed here, and must be) - .core2_entry1_size = 0x00004000, ///< optional, only for dual core IC - .core2_entry2_addr = 0x1FFC0000, ///< optional, only for dual core IC (address better in the bottom of dram to avoid memory space overlap) - .core2_entry2_size = 0x00040000, ///< optional, only for dual core IC -}; -// refer to storage-partition.dtsi -static EMB_PARTITION g_emb_uboot = { - .PartitionOffset = 0xC0000, - .PartitionSize = 0xA0000, -}; -static EMB_PARTITION g_emb_rtos = { ///< optional, only for fast-boot, - .PartitionOffset = 0x2B40000, - .PartitionSize = 0xA00000, -}; -static EMB_PARTITION g_emb_teeos = { ///< optional, only for optee, - .PartitionOffset = 0, - .PartitionSize = 0, -}; -//following just for processing all-in-one bin (nvtpack) -//refer to nvtpack.dtsi -#define NVTPACK_IDX_UBOOT 3 -#define NVTPACK_IDX_TEEOS -1 -#define NVTPACK_IDX_RTOS 10 -#endif - - - -#if (UART_UPDATE_ == ENABLE) -static char g_strLength[80]; // buffer to store length string -#endif - -//--------------------------------------------------------------------------- -// Static function -//--------------------------------------------------------------------------- -int bl_boot_uboot(unsigned char *p_fdt); - -/** - Display error message. - - Display error message. - CPU loop forever and LED is red. - - @param Msg: Message to display - @return void -*/ -_THUMB2 static void bl_displayErrMsg(char *Msg) -{ - // Display error message to UART - debug_msg(Msg); - // Loop forever - while (1) { - ; - } -} - - -/** - Invert endianess of input word - - - @param[in] a input word - - @return translated word -*/ -_THUMB2 static UINT32 invertEndian(UINT32 a) -{ - return __builtin_bswap32(a); -} - - -/** - Check FW code. - - Check FW code and file length. - The FW binary file must be post-proecessd by encrypt_bin.exe. - This function must sync to encrypt_bin.exe. - If FW checking is fail, the CPU will loop forever and LED is red. - - @param[in] uiAddress FW code in DRAM starting address - @param[in] uiFileLen FW code length - @return void -*/ -_THUMB2 static void bl_checkFW(UINT32 uiAddress, UINT32 uiFileLen) -{ - NVTPACK_MEM mem = {0}; - mem.p_data = (void *)uiAddress; - mem.len = uiFileLen; - if (nvtpack_calc_nvt_sum(&mem) != 0) { - bl_displayErrMsg(FWErrorMsg); - } -} - -/** - Check boot loader code. - - Check boot loader code. - - @return void -*/ -_THUMB2 static void bl_checkLoader(UINT32 uiAddr, UINT32 uiSize) -{ - UINT16 *puiValue, uiSum; - UINT32 i; - - puiValue = (UINT16 *)uiAddr; - uiSum = 0; - - for (i = 0; i < (uiSize >> 1); i++) { - uiSum += (*puiValue + i); - puiValue++; - } - - if ((*(UINT16 *)(uiAddr + LOADER_TAG_OFFSET) != LOADER_TAG_VALUE) || - (uiSum != 0)) { - bl_displayErrMsg(LoaderErrorMsg); - } -} -#if (SECURE_DECRYPT_UBOOT || SECURE_DECRYPT_OPTEE_OS) - - -_THUMB2 static void get_bininfo_size_offset(unsigned char* bininfo,unsigned int* size,unsigned int *offset) -{ - /****this headinfo is for encrypt header - BinInfo will set partition offset and size - BinInfo_1[0~3] public key offset - BinInfo_1[4~7] public key length - BinInfo_2[0~3] signature offset - BinInfo_2[4~7] signature length - BinInfo_3[0~3] encrypted offset - BinInfo_3[4~7] encrypted size - BinLength total bin size - Checksum total bin checksum - others parameters set 0 - */ - *size = bininfo[4] | bininfo[5]<<8 | bininfo[6] << 16 | bininfo[7] << 24; - *offset = bininfo[0] | bininfo[1] << 8 | bininfo[2] << 16 | bininfo[3] <<24; -} - - - - -_THUMB2 static int decrypt_aes_cbc(unsigned int input, unsigned int output, unsigned int len) -{ - - CRYPT_OP crypt_op_param; - if(len &0x0f) - { - debug_msg_var("enc size", len); - debug_err("not align 16\r\n"); - return -21; - } - if((input & 0x03) || (output & 0x03) || (len & 0x03) ){ //check word alignment - //debug_msg_var("input", input); - //debug_msg_var("output", output); - //debug_msg_var("len", len); - //debug_err("not word align\r\n"); - return -22; - } - crypt_op_param.op_mode = CRYPTO_CBC; - crypt_op_param.en_de_crypt = CRYPTO_DECRYPT; - crypt_op_param.src_addr = input; - crypt_op_param.dst_addr = output; - crypt_op_param.length = len; //Need align to 16bytes align - //debug_msg_var("src",(unsigned int)crypt_op_param.src_addr); - //debug_msg_var("dst",(unsigned int)crypt_op_param.dst_addr); - - #if 0 - debug_msg_var("input",input); - debug_msg_var("output",output); - debug_msg_var("len",len); - unsigned char *tmp = (unsigned char *) crypt_op_param.src_addr; - int i=0; - debug_msg_var("encryped buf addr",(unsigned int)tmp); - for(i=0;i<16;i++){ - debug_msg_var("encryped buf",(unsigned int)tmp[i]); - } - #endif - if(crypto_data_operation(EFUSE_OTP_1ST_KEY_SET_FIELD, crypt_op_param) != 0) - { - //debug_err("aes dec fail\r\n"); - return -23; - } - #if 0 - unsigned char *tmp = (unsigned char *) crypt_op_param.src_addr; - int i=0; - tmp = (unsigned char *) crypt_op_param.dst_addr; - debug_msg_var("decryped addr",(unsigned int)&tmp[0]); - for(i=0;i<16;i++){ - debug_msg_var("decryped buf",(unsigned int)tmp[i]); - } - - #endif - return 0; - -} -#if (SECURE_SIGNATURE_BY_AES == 0) -_THUMB2 static void data_reverse(unsigned char* input_data, unsigned int size) -{ - unsigned int i=0; - unsigned char tmp=0; - for(i=0;i< (size/2);i++) - { - tmp = input_data[size - 1 - i]; - input_data[size - 1 - i] = input_data[i]; - input_data[i] = tmp; - } - -} -#endif -_THUMB2 static int do_decrypt_aes(unsigned int input_data, unsigned int output_data, unsigned int* output_size,unsigned int partition_size) -{ - - unsigned int encrypt_offset =0; - unsigned int encrypt_size =0; - unsigned int data_size = 0; - HEADINFO *p_headinfo = (HEADINFO *)input_data; - int er=0; - get_bininfo_size_offset((unsigned char *)p_headinfo->BinInfo_3, &encrypt_size, &encrypt_offset); - data_size = p_headinfo->BinLength - encrypt_offset; -#if 1 //for signature check - unsigned int signature_offset =0; - unsigned int signature_size = 0; - UINT32 hash_buf[8]; - unsigned int sha256_align_size =0; - UINT32 * signature_buff = NULL; - get_bininfo_size_offset((unsigned char *)p_headinfo->BinInfo_2, &signature_size, &signature_offset); - #if (SECURE_SIGNATURE_BY_AES == 0) - unsigned int key_offset =0; - unsigned int key_size =0; - unsigned int n_size=0; - unsigned int e_size=0; - UINT32 sign_rsa_output[64]; - UINT32 *key_n = NULL; - UINT32 *key_e = NULL; - UINT32 *signature_addr = NULL; - get_bininfo_size_offset((unsigned char *)p_headinfo->BinInfo_1, &key_size, &key_offset); - n_size = signature_size;// if rsa 2048 , signature_size should be 256 bytes - e_size = key_size - n_size; - key_n = (UINT32 *)(input_data + key_offset); - // now only support rsa 2048 - key_e = (UINT32 *)(input_data + key_offset + signature_size); // signature_size should be 256 bytes, n key should be 256 - data_reverse((unsigned char *)(key_n),n_size); - data_reverse((unsigned char *)(key_e),e_size); - - er = rsa_keycheck(key_n, 1);// check rsa n key in efuse 1 and 2 field, 0 field for aes key - if(er == 0) - { - debug_err("key fail\r\n"); - return -20; - } - signature_addr = (UINT32 *)(input_data + signature_offset); - data_reverse((unsigned char *)signature_addr, signature_size); - - //decrypt signature - rsa_decrypt(signature_addr, signature_size, key_n, n_size, key_e, e_size,sign_rsa_output); - - data_reverse((unsigned char *)sign_rsa_output, signature_size); - - //remove pending data 0, the last 32 bytes will be signature data - signature_buff = (UINT32 *)&sign_rsa_output[(sizeof(sign_rsa_output)/4 ) - (32/4 )];// offset need devided by 4, because of UINT32 type - #else - //UINT32 sign_aes_output[8]; - - er = decrypt_aes_cbc((UINT32 )(input_data + signature_offset), output_data,signature_size); - if(er != 0) - { - debug_err("decrypt_aes_cbc fail\r\n"); - return -20; - } - signature_buff =(UINT32 *)output_data; - - #endif - //hash encrypt data - - if((data_size & 0x3f) != 0) - { - // hardware sha256 need align 64, need set pending 0 - sha256_align_size = ((data_size/0x40) + 1)*0x40; - bl_memset((unsigned char *)(input_data + encrypt_offset + data_size),0, sha256_align_size - data_size); - } - else - { - sha256_align_size = data_size; - } - - shahw((unsigned char *)(input_data + encrypt_offset), sha256_align_size, hash_buf); - - - //compare signature and current hash - if(memcmp((void *)hash_buf, (void *)signature_buff, sizeof(hash_buf)) != 0) - { - debug_err("sig fail\r\n"); - return -20; - } -#endif - - //decrypt data - //dma addr should 4 alignment, input_data address is 4 alignment - if((input_data + encrypt_offset) & 0x03) - { - utl_memcpy((void *)input_data,(unsigned char*)(input_data + encrypt_offset), data_size); - er = decrypt_aes_cbc(input_data, output_data, encrypt_size); - } - else - { - er = decrypt_aes_cbc(input_data + encrypt_offset, output_data, encrypt_size); - } - if(er != 0) - { - debug_err("aes fail\r\n"); - return er; - } - - *output_size = data_size; - - //add plaintext data to output buf--> aes should 16 alignment, if data not alignment, the last bytes we will not encrypt data - int plaintext_size = data_size - encrypt_size; - unsigned char *p_output = (unsigned char *)output_data; - if( plaintext_size > 0) - { - utl_memcpy(&p_output[encrypt_size], (unsigned char*)(input_data + encrypt_offset+ encrypt_size),plaintext_size); - } - return 0; - -} -#endif - -//#NT#2013/04/25#Steven Wang -begin -//#NT#Show Duty calibration log -#if (_LOADER_DUTY_CALIBRATION_ == ENABLE && _LOADER_DUTY_CALIBRATION_LOG_ == ENABLE) -void BL_showROMLog(UINT32 buffer) -{ - UINT32 value; - UINT32 index; - UINT32 P_duty; - UINT32 N_duty; - UINT32 diff; - - index = 0; - diff = 0; - P_duty = 0; - N_duty = 0; - uart_putSystemUARTStr("\r\n"); - while (1) { - value = INREG32(buffer + index); - - if ((value & 0xF0000000) == 0xF0000000) { - value &= ~(0x40000000); - uart_putSystemUARTStr(Dec2HexStr(value)); - uart_putSystemUARTStr(" = "); - } - - else if ((value & 0xF0000000) == 0x50000000) { - uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr("\r\n"); - } - - else if ((value & 0xF0000000) == 0x20000000) { -// uart_putSystemUARTStr("P_duty = "); - P_duty = value & 0xFFFFFFF; - //uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr(Dec2HexStr(P_duty)); - uart_putSystemUARTStr("\r\n"); - } - - else if ((value & 0xF0000000) == 0x30000000) { -// uart_putSystemUARTStr("N_duty = "); - N_duty = value & 0xFFFFFFF; - //uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr(Dec2HexStr(N_duty)); - uart_putSystemUARTStr("\r\n"); - if (P_duty > N_duty) { - if (diff == 2) { - uart_putSystemUARTStr("============\r\n"); - P_duty = 0; - N_duty = 0; - diff = 0; -// diff = 3; - } else { - diff = 1; - } - } else { - if (diff == 1) { - uart_putSystemUARTStr("============\r\n"); - P_duty = 0; - N_duty = 0; - diff = 0; -// diff = 3; - } else { - diff = 2; - } - } - } else if ((value & 0xF0000000) == 0x60000000) { - uart_putSystemUARTStr("N+P = "); - uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr("\r\n"); - } else if ((value & 0xF0000000) == 0x70000000) { - if ((value & 0xFFFFFFF) == 0x0654321) { - break; - } - } else { - uart_putSystemUARTStr("Unknow \r\n"); - } - index += 4; - } - uart_putSystemUARTStr("\r\n[0xC0001000] = 0x"); - uart_putSystemUARTStr(Dec2HexStr(INREG32(0xC0001000))); - uart_putSystemUARTStr(" [0xC000101C] = 0x"); - uart_putSystemUARTStr(Dec2HexStr(INREG32(0xC000101C))); - uart_putSystemUARTStr("\r\n"); -} -#endif -//#NT#2013/04/25#Steven Wang -end - - -#if (DRAM_RANGE_SCAN_EN == ENABLE) -/** - Check Sram code. - - Check is dram scan code or not - - @param[in] uiAddress Scan FW code in DRAM starting address - @return void -*/ -static BOOL bl_checkDramScanFW(UINT32 uiAddress) -{ - if ((*(UINT32 *)uiAddress & SRAM_TAG) == SRAM_TAG) { - return TRUE; - } else { - return FALSE; - } -} -#endif - -#if 0 -static BOOL bl_spiIdentify(UINT32 uiMfgID, UINT32 uiTypeID, UINT32 uiCapacityID, PSPI_IDENTIFY pIdentify) -{ - // Sample to support SST25VF032 - if ((uiMfgID == 0xBF) && - (uiCapacityID == 0x4A)) { - pIdentify->bDualRead = FALSE; - pIdentify->bSupportAAI = TRUE; - pIdentify->bSupportEWSR = TRUE; - pIdentify->uiFlashSize = 4 * 1024 * 1024; - return TRUE; - } - - return FALSE; -} -#endif - -/* - Update multi-binary image - - - @param[in] uiFwBuf buffer store fw read from card - - @return - -@ b TRUE: success - -@ b FALSE: fail -*/ - -#if !REMOVED_FLASH -#if 0 -static void bl_interrupt_init(void) -{ - debug_msg("arm_gic_distif_setup\r\n"); - arm_gic_distif_setup(); - debug_msg("arm_gic_cpuif_setup\r\n"); - arm_gic_cpuif_setup(); - - // - //debug_dump_addr(0xF1500000+0x1000,0x500); - //debug_dump_addr(0xF1500000+0x2000,0x100); -} -#endif - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) -#define OUTW(addr,value) (*(UINT32 volatile *)(addr) = (UINT32)(value)) -#define INW(addr) (*(UINT32 volatile *)(addr)) - - -static void bl_cpu_timer_init(UINT32 value) -{ - UINT32 dwVal; - OUTW(configARM_TIMER_BASEADDR + ARM_TIMER_LOAD_OFFSET, value); - - dwVal = INW(configARM_TIMER_BASEADDR + ARM_TIMER_CONTROL_OFFSET); - /* Enable Auto reload mode. */ - dwVal |= ARM_TIMER_CONTROL_AUTO_RELOAD_MASK; - /* Clear prescaler control bits */ - dwVal &= ~ARM_TIMER_CONTROL_PRESCALER_MASK; - /* Set prescaler value */ - dwVal |= ((CYGHWR_HAL_RTC_PRESCALER - 1) << ARM_TIMER_CONTROL_PRESCALER_SHIFT); - /* Enable the decrementer */ - //dwVal |= ARM_TIMER_CONTROL_ENABLE_MASK; - /* Enable the interrupt */ - dwVal |= ARM_TIMER_CONTROL_IRQ_ENABLE_MASK; - - OUTW(configARM_TIMER_BASEADDR + ARM_TIMER_CONTROL_OFFSET, dwVal); - - OUTW(configARM_TIMER_BASEADDR + ARM_TIMER_ISR_OFFSET, - ARM_TIMER_ISR_EVENT_FLAG_MASK); - -} -#endif -#endif -_THUMB2 int bl_flash_open(void) -{ - int er; - //UINT32 uiStorageVersion = (UINT32)&_load_nand_table_start_base; - - if (g_is_flash_open) { - return 0; - } - //========================================================================== - //= User define SPI-NAND id table sample code = - //= You can remove // to use it = - //========================================================================== - //int_strg_obj->flash_setConfig(FLASH_CFG_ID_SPI_IDENTIFY_CB, (UINT32)nand_identify); - - //========================================================================== - //= User define SPI-NOR id table sample code = - //= You can remove // to use it = - //========================================================================== - //int_strg_obj->flash_installIdentifyCB(nor_identify); - - er = int_strg_obj->flash_open(); - if (er < 0) { - debug_err("flash open fail\r\n"); - return -1; - } - - //OUTREG32(NAND_TABLE_VERSION_ADDR, INREG32(uiStorageVersion)); - - //if (er == E_OK) { - // OUTREG32(NAND_TABLE_FLAG_ADDR, 0x46495053); //'S''P''I''F' - //} else { // E_OK_TABLE_FOUND(1) or E_OK_TABLE_NOT_FOUND(2) - // OUTREG32(NAND_TABLE_FLAG_ADDR, er); - //} - g_uiNandBlkSize = int_strg_obj->flash_getBlockSize(); - if (g_uiNandBlkSize == 0x10000) { - debug_msg("SPI NOR\r\n"); - g_uiStartBlkUpdateFW = 1; - } else if (g_uiNandBlkSize == EMMC_BLOCK_SIZE) { - debug_msg("EMMC\r\n"); - g_uiStartBlkUpdateFW = FDT_OFFSET / EMMC_BLOCK_SIZE; - } else { - g_uiStartBlkUpdateFW = StartNandBlkUpdateFW; - } - - g_is_flash_open = TRUE; - return 0; -} - -#if 0 //[-Werror=unused-function] -static int bl_flash_close(void) -{ - if (!g_is_flash_open) { - return 0; - } - - flash_close(); - g_is_flash_open = FALSE; - return 0; -} -#endif - -#if (FDT_SUPPORT) -_THUMB2 static const void *bl_get_fdt_property(const void *p_dtb, const char *p_path, const char *p_property, int *len) -{ - int nodeoffset; /* next node offset from libfdt */ - const void *nodep; /* property node pointer */ - - nodeoffset = fdt_path_offset(p_dtb, p_path); - if (nodeoffset < 0) { - return NULL; - } - nodep = fdt_getprop(p_dtb, nodeoffset, p_property, len); - if (len == 0) { - return NULL; - } - return nodep; -} - -_THUMB2 static const void *bl_get_fdt_nvt_memory_cfg_property(const void *p_dtb, const char *p_path, const char *p_property, int *len) -{ - static int nodeoffset_nvt_memory_cfg = -FDT_ERR_NOTFOUND;; /* next node offset from libfdt */ - - int nodeoffset; - const void *nodep; /* property node pointer */ - - if (strncmp(p_path, "/nvt_memory_cfg/", 3) != 0) { - debug_err("path prefix must be /nvt_memory_cfg/\r\n"); - return NULL; - } - - if (nodeoffset_nvt_memory_cfg == -FDT_ERR_NOTFOUND) { - nodeoffset_nvt_memory_cfg = fdt_path_offset(p_dtb, "/nvt_memory_cfg"); - } - - nodeoffset = fdt_subnode_offset(p_dtb, nodeoffset_nvt_memory_cfg, &p_path[16]); - if (nodeoffset < 0) { - return NULL; - } - nodep = fdt_getprop(p_dtb, nodeoffset, p_property, len); - if (len == 0) { - return NULL; - } - return nodep; -} -#endif - - -_THUMB2 static unsigned char *bl_get_fdt_cfg(const void *p_dtb, MODELEXT_TYPE type) -{ -#if (FDT_SUPPORT) - int len; - const int *nodep; - - UINT8 *p_rt = NULL; - - switch (type) { - case MODELEXT_TYPE_DRAM_PARTITION: - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_DRAM, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get dram fail\r\n"); - return NULL; - } - g_dram_partition.dram_addr = be32_to_cpu(nodep[0]); - g_dram_partition.dram_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_LOADER, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get loader fail\r\n"); - return NULL; - } - g_dram_partition.loader_addr = be32_to_cpu(nodep[0]); - g_dram_partition.loader_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_UBOOT, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get uboot fail\r\n"); - return NULL; - } - g_dram_partition.uboot_addr = be32_to_cpu(nodep[0]); - g_dram_partition.uboot_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_FDT, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get fdt fail\r\n"); - return NULL; - } - g_dram_partition.fdt_addr = be32_to_cpu(nodep[0]); - g_dram_partition.fdt_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_RTOS, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.rtos_addr = be32_to_cpu(nodep[0]); - g_dram_partition.rtos_size = be32_to_cpu(nodep[1]); - } - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_NUTTX, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.nuttx_addr = be32_to_cpu(nodep[0]); - g_dram_partition.nuttx_size = be32_to_cpu(nodep[1]); - } - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_TEEOS, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.teeos_addr = be32_to_cpu(nodep[0]); - g_dram_partition.teeos_size = be32_to_cpu(nodep[1]); - } - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_HDAL, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get hdal fail\r\n"); - return NULL; - } - g_dram_partition.hdal1_addr = be32_to_cpu(nodep[0]); - g_dram_partition.hdal1_size = be32_to_cpu(nodep[1]); - if (len >= 16) { - g_dram_partition.hdal2_addr = be32_to_cpu(nodep[2]); - g_dram_partition.hdal2_size = be32_to_cpu(nodep[3]); - } - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_CORE2_ENTRY1, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.core2_entry1_addr = be32_to_cpu(nodep[0]); - g_dram_partition.core2_entry1_size = be32_to_cpu(nodep[1]); - } - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_CORE2_ENTRY2, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.core2_entry2_addr = be32_to_cpu(nodep[0]); - g_dram_partition.core2_entry2_size = be32_to_cpu(nodep[1]); - } -#endif - p_rt = (UINT8 *)&g_dram_partition; - break; - - case MODELEXT_TYPE_BIN_INFO: - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_SHMEM, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get shmem fail\r\n"); - return NULL; - } - - if (sizeof(SHMINFO) > be32_to_cpu(nodep[1])) { - debug_err("shmem size mismatch\r\n"); - return NULL; - } - - p_rt = (UINT8 *)be32_to_cpu(nodep[0]); - break; - - default: - debug_err_var("not handle type\r\n", type); - return NULL; - } - return p_rt; -#else // NO FDT_SUPPORT - switch (type) { - case MODELEXT_TYPE_DRAM_PARTITION: - return (UINT8 *)&g_dram_partition; - case MODELEXT_TYPE_BIN_INFO: - return (UINT8 *)g_dram_partition.rev_addr; - default: - return NULL; - } -#endif -} - -_THUMB2 int bl_chk_valid_all_in_one(NVTPACK_MEM *p_mem_all_in_one) -{ - NVTPACK_ER er; - NVTPACK_VER ver; - - er = nvtpack_getver(p_mem_all_in_one, &ver); - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - - if (ver == NVTPACK_VER_16072017) { - return 0; - } - - return -1; -} - - -#if !REMOVED_FLASH -_THUMB2 int bl_chk_fdt(unsigned int addr, unsigned int size) -{ - DRAM_PARTITION *p_dram_partition = NULL; - - if (fdt_check_full((void *)addr, size) != 0) { - debug_err("invalid dtb\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)addr, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("invalid dram_partition\r\n"); - return -1; - } - - // check tmp memory (file load) cannot overlap with uboot and teeos - // we allow to overlap with linux, root-fs because uboot will reload bin file later - debug_msg_var("tmp_addr", SDRAM_Start_FW); - -// if ((addr < p_dram_partition->uboot_addr && addr + size > p_dram_partition->uboot_addr) || -// (addr > p_dram_partition->uboot_addr && addr + size < p_dram_partition->uboot_addr + p_dram_partition->uboot_size)) { - if (IS_BIN_OVERLAP(addr, size, p_dram_partition->uboot_addr, p_dram_partition->uboot_size)) { - debug_err_var("a", addr); - debug_err_var("s", size); - debug_err("uboot olp\r\n"); - return -1; - } -#if 1 - //if ((addr < p_dram_partition->teeos_addr && addr + size > p_dram_partition->teeos_addr) || - // (addr > p_dram_partition->teeos_addr && addr + size < p_dram_partition->teeos_addr + p_dram_partition->teeos_size)) { - if (p_dram_partition->teeos_size) { - if (IS_BIN_OVERLAP(addr, size, p_dram_partition->teeos_addr, p_dram_partition->teeos_size)) { - debug_err_var("a", addr); - debug_err_var("s", size); - debug_err("teeos olp\r\n"); - return -1; - } - } -#endif - // check if memory size matched real size - UINT32 ld_dram1_size = dma_get_dram_capacity(DMA_ID_1); - if (p_dram_partition->dram_size > ld_dram1_size) { - debug_err_var("fw_d1_s", p_dram_partition->dram_size); - debug_err_var("ld_d1_s", ld_dram1_size); - debug_err("d1 s not matched.\r\n"); - return -1; - } - UINT32 ld_dram2_size = dma_get_dram_capacity(DMA_ID_2); - if (p_dram_partition->hdal2_size > ld_dram2_size) { - debug_err_var("fw_d2_s", p_dram_partition->hdal2_size); - debug_err_var("ld_d2_s", ld_dram2_size); - debug_err("d2 s not matched.\r\n"); - return -1; - } - return 0; -} -#endif - -#if !REMOVED_FLASH -_THUMB2 int bl_chk_uboot(unsigned int addr, unsigned int size) -{ -#if (_FPGA_EMULATION_ == 0) - NVTPACK_MEM mem = {0}; - mem.p_data = (void *)addr; - mem.len = size; - if (nvtpack_calc_nvt_sum(&mem) != 0) { - debug_err("uboot check sum fail"); - return -1; - } -#endif - return 0; -} - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) -static void bl_core2_reset(void) -{ - UINT32 core_reg; - - debug_msg("core2_reset\r\n"); - - core_reg = *(volatile UINT32 *)0xF0E400F0; - core_reg &= ~(1<<3); - core_reg &= ~(1<<11); - *(volatile UINT32 *)0xF0E400F0 = core_reg; - core_reg |= (1<<2)|(1<<10) | (1<<21); - core_reg |= (1<<17); - *(volatile UINT32 *)0xF0E400F0 = core_reg; -} - -static void bl_core2_prepare(DRAM_PARTITION *p_dram_partition, unsigned int last_addr) -{ - extern char _load_core2_jump_program_start_base[]; - extern char _load_core2_jump_program_end_base[]; - extern char _load_core2_entry_program_start_base[]; - extern char _load_core2_entry_program_end_base[]; - UINT32 code2JumpCodelen, code2EntryCodelen; - - //check core2_entry1 must at addr 0 - if (p_dram_partition->core2_entry1_addr != CORE2_JUMP_ADDR) { - bl_displayErrMsg("core2entry1 != 0"); - } - - // copy core2 jump code to dram 0x0 - code2JumpCodelen = _load_core2_jump_program_end_base - _load_core2_jump_program_start_base; - utl_memcpy((void *)p_dram_partition->core2_entry1_addr, _load_core2_jump_program_start_base, code2JumpCodelen); -// CPUflushWriteCache(p_dram_partition->core2_entry1_addr, code2JumpCodelen); - - debug_msg_var("core2_jump_program", (int)_load_core2_jump_program_start_base); - debug_msg_var("code2JumpCodelen", (int)code2JumpCodelen); - debug_msg_var("core2_entry2_addr", (int)p_dram_partition->core2_entry2_addr); - - // copy core2 entry code to dram specified by fdt - *(volatile UINT32 *)(NVT_CORE2_START) = p_dram_partition->core2_entry2_addr; - code2EntryCodelen = _load_core2_entry_program_end_base - _load_core2_entry_program_start_base; - utl_memcpy((void *)p_dram_partition->core2_entry2_addr, _load_core2_entry_program_start_base, code2EntryCodelen); -// CPUflushWriteCache(p_dram_partition->core2_entry2_addr, code2EntryCodelen); - - debug_msg_var("core2_entry_program", (int)_load_core2_entry_program_start_base); - debug_msg_var("code2EntryCodelen", (int)code2EntryCodelen); - - *(volatile UINT32 *)0xF07F8000 = last_addr; - - debug_msg_var("0xF07F8000=", (int)*(volatile UINT32 *)0xF07F8000); -} - -static int bl_smp_start(unsigned char *p_modelext, UINT32 uboot_entry) -{ - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_modelext, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_modelext, MODELEXT_TYPE_DRAM_PARTITION); - if (p_bininfo == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - debug_msg_var("fdt", (UINT32)p_modelext); - debug_msg_var("shm", (UINT32)p_bininfo); - - p_bininfo->boot.fdt_addr = (UINT32)p_modelext; - debug_msg_var("p_bininfo->boot.fdt_addr", p_bininfo->boot.fdt_addr); - utl_memset(p_bininfo->boot.LdInfo_1, 0, sizeof(p_bininfo->boot.LdInfo_1)); - utl_memcpy(p_bininfo->boot.LdInfo_1, "LD_NVT", 6); - // clear cc_core1_addr, cc_core2_addr -#if USB_WRITELOADER - if(utl_get_bootsrc() == BOOT_SOURCE_UART) { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_UART; - } else if(USB_WRITELOADER || utl_get_bootsrc() == BOOT_SOURCE_USB) { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_USB; - } else { - p_bininfo->comm.Resv[0] = BOOT_REASON_NORMAL; - } -#else -// if (card_get_type() == EXT_STORAGE_TYPE_ETH) -// p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_ETH; -// else if (g_is_recovery_triggered) -// p_bininfo->comm.Resv[0] = BOOT_REASON_RECOVERY_SYS; -// else -#if (STORAGE_EXT_TYPE == STORAGE_EXT_ETH) - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_ETH; -#else - p_bininfo->comm.Resv[0] = BOOT_REASON_NORMAL; -#endif -#endif - p_bininfo->comm.Resv[1] = 0; // COMM_CORE1_START - p_bininfo->comm.Resv[2] = 0; // COMM_CORE2_START - p_bininfo->comm.Resv[3] = 0; // COMM_UITRON_COMP_ADDR - p_bininfo->comm.Resv[4] = 0; // COMM_UITRON_COMP_LEN - - debug_msg("smp(no tee)\r\n"); - - bl_core2_prepare(p_dram_partition, 0); - -//#if USB_WRITELOADER -#if 0 - USBStateMachine(); - uart_putSystemUARTStr("USB update Done\n\r"); - timer_delay(1000000); - USBOTGReset(); -#endif - - - - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - CPUInvalidateICacheAll(); - - //reset core2 - bl_core2_reset(); - - { - typedef void (*BRANCH_CB)(void); - BRANCH_CB p_func = (BRANCH_CB)uboot_entry; - debug_msg_var("jump", uboot_entry); - p_func(); - } - - return 0; -} -#endif -_THUMB2 static int bl_entry_boot(unsigned char *p_fdt, UINT32 uboot_entry) -{ - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - - debug_msg_var("fdt", (UINT32)p_fdt); - debug_msg_var("shm", (UINT32)p_bininfo); - - p_bininfo->boot.fdt_addr = (UINT32)p_fdt; - utl_memset(p_bininfo->boot.LdInfo_1, 0, sizeof(p_bininfo->boot.LdInfo_1)); - utl_memcpy(p_bininfo->boot.LdInfo_1, "LD_NVT", 6); - // clear cc_core1_addr, cc_core2_addr -#if USB_WRITELOADER - CPUflushWriteCache((UINT32)p_bininfo, sizeof(BININFO)); - if(utl_get_bootsrc() == BOOT_SOURCE_USB) { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_USB; - } else { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_UART; - } -#else - if (card_get_type() == EXT_STORAGE_TYPE_ETH) - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_ETH; - // else if (g_is_recovery_triggered) - // p_bininfo->comm.Resv[0] = BOOT_REASON_RECOVERY_SYS; - else - p_bininfo->comm.Resv[0] = BOOT_REASON_NORMAL; -#endif - p_bininfo->comm.Resv[1] = 0; // COMM_CORE1_START - p_bininfo->comm.Resv[2] = 0; // COMM_CORE2_START - p_bininfo->comm.Resv[3] = 0; // COMM_UITRON_COMP_ADDR - p_bininfo->comm.Resv[4] = 0; // COMM_UITRON_COMP_LEN - - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - CPUInvalidateICacheAll(); - - { - typedef void (*BRANCH_CB)(void); - BRANCH_CB p_func = (BRANCH_CB)uboot_entry; - debug_msg_var("jump", uboot_entry); - p_func(); - } - - return 0; -} - -_THUMB2 int bl_copy_fdt_to_fdt_addr(unsigned char *p_fdt /*IN*/, unsigned char **pp_fdt /*OUT*/) -{ - DRAM_PARTITION *p_dram_partition; - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("bl_copy_fdt_to_fdt_addr failed.\r\n"); - return -1; - } - - // load fdt to fdt buffer - utl_memcpy((void *)p_dram_partition->fdt_addr, p_fdt, fdt_totalsize(p_fdt)); - *pp_fdt = (unsigned char *)p_dram_partition->fdt_addr; - - //reset shminfo - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - bl_memset(p_bininfo, 0, sizeof(SHMINFO)); - return 0; -} - -_THUMB2 static int bl_load_fdt_from_all_in_one(unsigned char *p_all_in_one, unsigned int all_in_one_size, unsigned char **pp_fdt /*OUT*/) -{ - NVTPACK_ER er; - NVTPACK_MEM emb_fdt; - NVTPACK_VERIFY_OUTPUT np_verify = {0}; - NVTPACK_GET_PARTITION_INPUT np_get_input; - NVTPACK_MEM mem_in = {(void *)p_all_in_one, (unsigned int)all_in_one_size}; - - if (nvtpack_verify(&mem_in, &np_verify) != NVTPACK_ER_SUCCESS) { - debug_err("packbin verify failed.\r\n"); - return -1; - } - - np_get_input.id = 1; // fdt must always put in partition[1] - np_get_input.mem = mem_in; - er = nvtpack_get_partition(&np_get_input, &emb_fdt); - - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } else if (er == NVTPACK_ER_SUCCESS) { - debug_msg_var("fdt addr", (int)emb_fdt.p_data); - debug_msg_var("fdt size", (int)emb_fdt.len); - if (bl_chk_fdt((unsigned int)emb_fdt.p_data, emb_fdt.len) == 0) { - return bl_copy_fdt_to_fdt_addr(emb_fdt.p_data, pp_fdt); - } - } - return -1; -} - -_THUMB2 static unsigned int bl_load_rtos_from_all_in_one(unsigned char *p_all_in_one, unsigned int all_in_one_size, unsigned char **pp_fdt /*OUT*/) -{ - UINT32 uItron_fw_addr= 0; - NVTPACK_ER er; - NVTPACK_MEM emb_fdt; - NVTPACK_VERIFY_OUTPUT np_verify = {0}; - NVTPACK_GET_PARTITION_INPUT np_get_input; - NVTPACK_MEM mem_in = {(void *)p_all_in_one, (unsigned int)all_in_one_size}; - HEADINFO *p_headinfo; - - if (nvtpack_verify(&mem_in, &np_verify) != NVTPACK_ER_SUCCESS) { - debug_err("packbin verify failed.\r\n"); - return 0; - } - - np_get_input.id = 5; // rtos must always put in partition[5] for now - np_get_input.mem = mem_in; - er = nvtpack_get_partition(&np_get_input, &emb_fdt);//&np_get_input, &emb_fdt); - - if (er == NVTPACK_ER_NOT_FOUND) { - return 0; - } else if (er == NVTPACK_ER_SUCCESS) { - debug_msg("get rtos partition ok\r\n"); - - p_headinfo = (HEADINFO *)(emb_fdt.p_data + BIN_INFO_OFFSET_RTOS); - uItron_fw_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - - utl_memcpy((void *)uItron_fw_addr, emb_fdt.p_data, emb_fdt.len); - CPUflushWriteCache(uItron_fw_addr, emb_fdt.len); - } - debug_msg_var("uItron_fw_addr=", uItron_fw_addr); - return uItron_fw_addr; -} - -_THUMB2 static int bl_load_fdt_from_flash(unsigned char *p_tmp, unsigned int tmp_size, unsigned char **pp_fdt /*OUT*/) -{ - - // read first block to get dtb size - int blk_size = (int)int_strg_obj->flash_getBlockSize(); - int er = int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW, blk_size, p_tmp, NAND_RW_FIRMWARE); - if (er < 0) { - debug_err("bl_load_fdt_from_flash"); - return -1; - } - - int total_size = ALIGN_CEIL(fdt_totalsize(p_tmp), blk_size); - if ((int)tmp_size < total_size) { - debug_err_var("tmp_size too small, require:", fdt_totalsize(p_tmp)); - return -1; - } - - total_size -= blk_size; - if (total_size > 0) { - // read remain to get uboot starting addr on dram and offset in flash - er = int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW+1, total_size, p_tmp+blk_size, NAND_RW_FIRMWARE); - if (er < 0) { - debug_err("bl_load_fdt_from_flash"); - return -1; - } - } - - if (bl_chk_fdt((unsigned int)p_tmp, fdt_totalsize(p_tmp)) == 0) { - return bl_copy_fdt_to_fdt_addr(p_tmp, pp_fdt); - } - - return -1; -} - -#if (FDT_SUPPORT) -_THUMB2 static int bl_get_partition_fdt_offset(unsigned char *p_fdt) -{ - static int nodeoffset= -FDT_ERR_NOTFOUND; - - if (nodeoffset > 0) { - return nodeoffset; - } - - const static char *p_names[3] = { - "/nand", - "/nor", - "/mmc@f0510000" - }; - - const char *name = NULL; - switch(gStorageIntType) { - case STORAGEINT_SPI_NAND: - name = p_names[0]; - break; - case STORAGEINT_SPI_NOR: - name = p_names[1]; - break; - case STORAGEINT_EMMC: - name = p_names[2]; - break; - default: - debug_err("loader_setStorageIntType needs.\r\n"); - return NULL; - } - - nodeoffset = fdt_path_offset(p_fdt, name); - - if (nodeoffset < 0) { - debug_err("E:bl_get_partition_name\r\n"); - } - return nodeoffset; -} -#endif - -#if (FDT_SUPPORT) -_THUMB2 static const void *bl_get_fdt_partition_property(const void *p_dtb, const char *p_path, const char *p_property, int *len) -{ - int nodeoffset_partition = bl_get_partition_fdt_offset((unsigned char *)p_dtb); - - int nodeoffset; - const void *nodep; /* property node pointer */ - - if (nodeoffset_partition < 0) { - debug_err("nodeoffset_partition invalid \r\n"); - return NULL; - } - - nodeoffset = fdt_subnode_offset(p_dtb, nodeoffset_partition, p_path); - if (nodeoffset < 0) { - return NULL; - } - nodep = fdt_getprop(p_dtb, nodeoffset, p_property, len); - if (len == 0) { - return NULL; - } - return nodep; -} -#endif - -#if (FDT_SUPPORT) -_THUMB2 static int bl_get_partition(unsigned char *p_fdt /*IN*/, char *p_emb_name /*IN*/, EMB_PARTITION *p_emb/*OUT*/, int *p_id) -{ - int len; - const unsigned long long *nodep; - - // get partition offset and size - nodep = (const unsigned long long *)bl_get_fdt_partition_property(p_fdt, p_emb_name, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("bl_get_partition-1\r\n"); - return -1; - } - - p_emb->PartitionOffset = be64_to_cpu(nodep[0]); - p_emb->PartitionSize = be64_to_cpu(nodep[1]); - - // get partition label - char *p_label_name = (char *)bl_get_fdt_partition_property(p_fdt, p_emb_name, PROPERTY_LABEL, &len); - if (p_label_name == NULL) { - debug_err("bl_get_partition-2\r\n"); - return -1; - } - - // get id - int nodeoffset_partition = bl_get_partition_fdt_offset(p_fdt); - int nodeoffset = fdt_subnode_offset(p_fdt, nodeoffset_partition, "nvtpack"); - nodeoffset = fdt_subnode_offset(p_fdt, nodeoffset, "index"); - - for (nodeoffset = fdt_first_subnode(p_fdt, nodeoffset); - (nodeoffset >= 0); - (nodeoffset = fdt_next_subnode(p_fdt, nodeoffset))) { - const struct fdt_property *prop; - - if (!(prop = fdt_get_property(p_fdt, nodeoffset, PROPERTY_PARTITION_NAME, &len))) { - break; - } - const char *p_id_name = fdt_get_name(p_fdt, nodeoffset, &len); - - if (strcmp(p_label_name, (char *)prop->data) == 0) { - *p_id = atoi(p_id_name + strlen("id")); - return 0; - } - } - - return -1; -} -#endif - -_THUMB2 static void *bl_get_uboot_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ -#if (FDT_SUPPORT) - if (bl_get_partition(p_fdt, PATH_PARTITION_UBOOT, &g_emb_uboot, p_id) != 0) { - return NULL; - } -#else - *p_id = NVTPACK_IDX_UBOOT; -#endif - g_emb_uboot.EmbType = EMBTYPE_UBOOT; - return &g_emb_uboot; -} - -_THUMB2 static void *bl_get_rtos_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ -#if (FDT_SUPPORT) - if (bl_get_partition(p_fdt, PATH_PARTITION_RTOS, &g_emb_rtos, p_id) != 0) { - return NULL; - } -#else - *p_id = NVTPACK_IDX_RTOS; -#endif - g_emb_rtos.EmbType = EMBTYPE_RTOS; - return &g_emb_rtos; -} - -#if (NUTTX_SUPPORT) -_THUMB2 static void *bl_get_nuttx_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ - if (bl_get_partition(p_fdt, PATH_PARTITION_NUTTX, &g_emb_nuttx, p_id) != 0) { - return NULL; - } - g_emb_nuttx.EmbType = EMBTYPE_NUTTX; - - return &g_emb_nuttx; -} -#endif - -_THUMB2 static void *bl_get_teeos_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ -#if (FDT_SUPPORT) - if (bl_get_partition(p_fdt, PATH_PARTITION_TEEOS, &g_emb_teeos, p_id) != 0) { - return NULL; - } -#else - *p_id = NVTPACK_IDX_TEEOS; -#endif - g_emb_teeos.EmbType = EMBTYPE_TEEOS; - - return &g_emb_teeos; -} -#endif - -// return decompress_fw_size -_THUMB2 static unsigned int bl_decompress_rtos(UINT32 compress_addr, UINT32 compress_size, UINT32 fw_base_addr) -{ - UINT32 decoded_size; - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)compress_addr; - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - UINT32 size_uncomp_le = invertEndian(pBfc->uiSizeUnComp); - - size_comp_le = (compress_size < size_comp_le) ? compress_size : size_comp_le; - decoded_size = LZ_Un_compress((UINT8 *)compress_addr + sizeof(NVTPACK_BFC_HDR), (UINT8 *)fw_base_addr, size_comp_le); - //because some padding bytes are decoded, we must return real rtos size - return (decoded_size < size_uncomp_le) ? decoded_size : size_uncomp_le; -} - -#if !REMOVED_FLASH -_THUMB2 static int bl_load_uboot_from_all_in_one(unsigned char *p_fdt, unsigned char *p_all_in_one, unsigned int all_in_one_size) -{ - NVTPACK_ER er; - NVTPACK_MEM mem_uboot; - int uboot_partition_id; - NVTPACK_GET_PARTITION_INPUT input; - DRAM_PARTITION *p_dram_partition = NULL; - EMB_PARTITION *p_emb_partition_uboot = bl_get_uboot_partition(p_fdt, &uboot_partition_id); - - if (p_emb_partition_uboot == NULL) { - debug_err("null p_emb_partition_uboot\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // get partition data address and size - input.id = (unsigned int)uboot_partition_id; - input.mem.p_data = (void *)p_all_in_one; - input.mem.len = all_in_one_size; - er = nvtpack_get_partition(&input, &mem_uboot); - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - - debug_msg_var("uboot_addr", p_dram_partition->uboot_addr); -// debug_msg_var("uboot_size", p_dram_partition->uboot_size); -# if 0 - if(0) { -#else -#if (_FPGA_EMULATION_ == 0) - if(is_secure_enable() == 0) { -#else - if (1) { -#endif -#endif - if (bl_chk_uboot((unsigned int)mem_uboot.p_data, mem_uboot.len) != 0) { - return -1; - } - - // flow to handle compressed u-boot and uncompressed one. - HEADINFO *p_headinfo = (HEADINFO *)(mem_uboot.p_data + BIN_INFO_OFFSET_UBOOT); // describe uncompressed u-boot - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)mem_uboot.p_data; // describe compressed u-boot - - // load uboot bin to dram partiton location - //debug_msg_var("uboot_addr", p_dram_partition->uboot_addr); - //debug_msg_var("uboot_size", p_dram_partition->uboot_size); - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - if((cpu_to_be32(pBfc->uiAlgorithm) & 0xFF ) == 11) { -#if (_ROM_PUBLIC_API_ == 1) - UINT32 lzma_addr = *(UINT32 *)ROM_LZMA_POSITION; - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - UINT32 size_uncomp_le = invertEndian(pBfc->uiSizeUnComp); - rom_lzma_inflate = (int (*)(UINT8 *, UINT32 , UINT8 * , UINT32 , UINT8 *, UINT32 ))((lzma_addr)); - rom_lzma_inflate(mem_uboot.p_data + sizeof(NVTPACK_BFC_HDR), size_comp_le, (unsigned char *) p_dram_partition->uboot_addr, size_uncomp_le, (UINT8 *)lzma_temp_buffer, 65536); - debug_msg("lzma "); - -#else - debug_msg("Can not support LZMA\r\n"); -#endif - } else { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - LZ_Un_compress(mem_uboot.p_data + sizeof(NVTPACK_BFC_HDR), (unsigned char *) p_dram_partition->uboot_addr, size_comp_le); - debug_msg("lz"); - } - } else { - debug_msg("nml"); - utl_memcpy((void *)p_dram_partition->uboot_addr, mem_uboot.p_data, p_headinfo->BinLength); - } - } else { -#if (SECURE_DECRYPT_UBOOT) - utl_memcpy((void *)p_dram_partition->uboot_addr, mem_uboot.p_data, mem_uboot.len); - unsigned int plaintext_size =0; - - if((er = do_decrypt_aes(p_dram_partition->uboot_addr, p_dram_partition->uboot_addr, &plaintext_size, p_dram_partition->uboot_size))!= 0 ) - { - //debug_err("aes fail\r\n"); - return er; - } - if (bl_chk_uboot((unsigned int)p_dram_partition->uboot_addr, plaintext_size) != 0) { - return -1; - } -#else - debug_msg("please enable SECURE_DECRYPT_UBOOT\r\n"); - return -1; -#endif - } - - return 0; -} - -#if (NUTTX_SUPPORT) -_THUMB2 static int bl_load_nuttx_from_all_in_one(unsigned char *p_fdt, unsigned char *p_all_in_one, unsigned int all_in_one_size) -{ - NVTPACK_ER er; - NVTPACK_MEM mem_nuttx; - int nuttx_partition_id; - NVTPACK_GET_PARTITION_INPUT input; - DRAM_PARTITION *p_dram_partition = NULL; - EMB_PARTITION *p_emb_partition_nuttx = bl_get_nuttx_partition(p_fdt, &nuttx_partition_id); - - if (p_emb_partition_nuttx == NULL) { - debug_err("null p_emb_partition_nuttx\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // get partition data address and size - input.id = (unsigned int)nuttx_partition_id; - input.mem.p_data = (void *)p_all_in_one; - input.mem.len = all_in_one_size; - er = nvtpack_get_partition(&input, &mem_nuttx); - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - - // using check uboot's check sum is ok - if (bl_chk_uboot((unsigned int)mem_nuttx.p_data, mem_nuttx.len) != 0) { - return -1; - } - - // flow to handle compressed u-boot and uncompressed one. - HEADINFO *p_headinfo = (HEADINFO *)(mem_nuttx.p_data + BIN_INFO_OFFSET_NUTTX); // describe uncompressed u-boot - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)mem_nuttx.p_data; // describe compressed u-boot - - // load nuttx bin to dram partiton location - debug_msg_var("nuttx_addr", p_dram_partition->nuttx_addr); - debug_msg_var("nuttx_size", p_dram_partition->nuttx_size); - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - LZ_Un_compress(mem_nuttx.p_data + sizeof(NVTPACK_BFC_HDR), (unsigned char *) p_dram_partition->nuttx_addr, size_comp_le); - } else { - utl_memcpy((void *)p_dram_partition->nuttx_addr, mem_nuttx.p_data, p_headinfo->BinLength); - } - - return 0; -} -#endif - -_THUMB2 static int bl_load_teeos_from_all_in_one(unsigned char *p_fdt, unsigned char *p_all_in_one, unsigned int all_in_one_size) -{ - NVTPACK_ER er; - NVTPACK_MEM mem_teeos; - int teeos_partition_id; - NVTPACK_GET_PARTITION_INPUT input; - DRAM_PARTITION *p_dram_partition = NULL; - EMB_PARTITION *p_emb_partition_teeos = bl_get_teeos_partition(p_fdt, &teeos_partition_id); - HEADINFO *p_headinfo = NULL; - if (p_emb_partition_teeos == NULL) { - debug_err("null p_emb_partition_teeos\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // get partition data address and size - input.id = (unsigned int)teeos_partition_id; - input.mem.p_data = (void *)p_all_in_one; - input.mem.len = all_in_one_size; - er = nvtpack_get_partition(&input, &mem_teeos); - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - -#if 0 - if(1){ -#else - if(is_secure_enable()) { -#endif -#if (SECURE_DECRYPT_OPTEE_OS) - unsigned int plaintext_size =0; - utl_memcpy((void *)p_dram_partition->teeos_addr, mem_teeos.p_data, mem_teeos.len); - if((er = do_decrypt_aes(p_dram_partition->teeos_addr, p_dram_partition->teeos_addr,&plaintext_size, p_dram_partition->teeos_size))!= 0) - { - //debug_err("aes fail\r\n"); - return er; - } - - //this is the second headinfo information , not encrpyted headinfo - p_headinfo = (HEADINFO *)(p_dram_partition->teeos_addr + BIN_INFO_OFFSET_TEEOS); -#else - debug_err("please enable SECURE_DECRYPT_OPTEE_OS"); - return -1; -#endif - } - else{ - p_headinfo = (HEADINFO *)(mem_teeos.p_data + BIN_INFO_OFFSET_TEEOS); // describe uncompressed u-boot - utl_memcpy((void *)p_dram_partition->teeos_addr, (unsigned char*)mem_teeos.p_data, p_headinfo->BinLength); - } - UINT32 teeos_addr = p_headinfo->Resv1[HEADINFO_TEEOS_RESV_IDX_LOAD_ADDR]; - - //check addr matched or not - debug_msg_var("teeos_addr", p_dram_partition->teeos_addr); - if (teeos_addr != p_dram_partition->teeos_addr) { - debug_msg_var("teeos_addr(bin)", teeos_addr); - debug_err("teeos addr not matched.\r\n"); - return -1; - } - - // using check uboot's check sum is ok - if (bl_chk_uboot((unsigned int)teeos_addr, p_headinfo->BinLength) != 0) { - return -1; - } - - return 0; -} - -_THUMB2 static int bl_load_uboot_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) -{ - int er; - int uboot_partition_id; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned int blk_size = int_strg_obj->flash_getBlockSize(); - EMB_PARTITION *p_emb_partition_uboot = bl_get_uboot_partition(p_fdt, &uboot_partition_id); - - if (p_emb_partition_uboot == NULL) { - debug_err("null p_emb_partition_uboot\r\n"); - return -1; - } - - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - -#if (SECURE_DECRYPT_UBOOT) - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(BIN_INFO_OFFSET_UBOOT + sizeof(HEADINFO), blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read uboot failed - return -1; - } -#else - - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(BIN_INFO_OFFSET_UBOOT + sizeof(HEADINFO), blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read uboot failed - return -1; - } - -#endif - - debug_msg_var("uboot_addr", p_dram_partition->uboot_addr); - debug_msg_var("uboot_size", p_dram_partition->uboot_size); -#if 0 - if(0){ -#else - if(is_secure_enable() == 0) { -#endif - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp + BIN_INFO_OFFSET_UBOOT); // describe uncompressed u-boot - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)p_tmp; // describe compressed u-boot - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) - { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(size_comp_le, blk_size),p_tmp, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash_comp,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - if((cpu_to_be32(pBfc->uiAlgorithm) & 0xFF ) == 11) { -#if (_ROM_PUBLIC_API_ == 1) - UINT32 lzma_addr = *(UINT32 *)ROM_LZMA_POSITION; - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - UINT32 size_uncomp_le = invertEndian(pBfc->uiSizeUnComp); - rom_lzma_inflate = (int (*)(UINT8 *, UINT32 , UINT8 * , UINT32 , UINT8 *, UINT32 ))((lzma_addr)); - rom_lzma_inflate(p_tmp + sizeof(NVTPACK_BFC_HDR), size_comp_le, (unsigned char *) p_dram_partition->uboot_addr, size_uncomp_le, (UINT8 *)lzma_temp_buffer, 65536); - debug_msg("lzma "); -#else - debug_msg("Can not support LZMA\r\n"); -#endif - } else { - LZ_Un_compress(p_tmp + sizeof(NVTPACK_BFC_HDR), (unsigned char *)p_dram_partition->uboot_addr, size_comp_le); - } - } - else - { - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(p_headinfo->BinLength, blk_size), - (UINT8 *)p_dram_partition->uboot_addr, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - } - } - else - { -#if (SECURE_DECRYPT_UBOOT) - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp); // describe uncompressed u-boot - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(p_headinfo->BinLength, blk_size), - (UINT8 *)p_dram_partition->uboot_addr, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - unsigned int plaintext_size=0; - if((er =do_decrypt_aes(p_dram_partition->uboot_addr, p_dram_partition->uboot_addr, &plaintext_size, p_dram_partition->uboot_size))!= 0) - { - //debug_err("aes fail\r\n"); - return er; - } -#else - debug_msg("plase enable SECURE_DECRYPT_UBOOT config\r\n"); - return -1; -#endif - } - return 0; -} - -_THUMB2 static int bl_load_rtos_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) -{ - int er; - int rtos_partition_id; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned int blk_size = int_strg_obj->flash_getBlockSize(); - EMB_PARTITION *p_emb_partition_rtos = bl_get_rtos_partition(p_fdt, &rtos_partition_id); - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - - if (p_emb_partition_rtos == NULL) { - debug_err("null p_emb_partition_rtos\r\n"); - return -1; - } - - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - if(bl_is_smp(p_fdt)) { - bl_core2_prepare(p_dram_partition, 0); - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - bl_core2_reset(); - } -#endif - - // load 1st block of rtos to tmp dram (to detect compressed u-boot) - unsigned int bininfo_preload_size = ALIGN_CEIL(BIN_INFO_OFFSET_RTOS + sizeof(HEADINFO), blk_size); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset / blk_size, bininfo_preload_size, p_tmp, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read rtos failed - } - - // flow to handle compressed u-boot and uncompressed one. - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)p_tmp; // describe compressed u-boot - - // load rtos bin to dram partiton location - //debug_msg_var("rtos_addr", p_dram_partition->rtos_addr); - //debug_msg_var("rtos_size", p_dram_partition->rtos_size); - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - - if((cpu_to_be32(pBfc->uiAlgorithm) & 0xFF ) == 11) - { - /* lzma compressed image*/ - debug_msg("lzma, use uboot\r\n"); - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - - // boot uboot - er = bl_boot_uboot((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot uboot failed\r\n"); - } - } else { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset / blk_size, ALIGN_CEIL(size_comp_le, blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash_comp,er=", er); // read bfc-rtos failed - bl_displayErrMsg(RWErrorMsg); - } - LZ_Un_compress(p_tmp + sizeof(NVTPACK_BFC_HDR), (unsigned char *)p_dram_partition->rtos_addr, size_comp_le); - } - } else { - BININFO *p_bininfo = (BININFO *)(p_tmp + BIN_INFO_OFFSET_RTOS); // describe uncompressed u-boot - if (p_bininfo->head.Resv1[HEADINFO_RESV_IDX_BOOT_FLAG] & BOOT_FLAG_PARTLOAD_EN) { - // copy bininfo_preload to rtos_addr - bl_memcpy((UINT8 *)p_dram_partition->rtos_addr, p_tmp, bininfo_preload_size); - // preload some to get part-1 size for partial load and partial compressed load - UINT32 preload_size = ALIGN_CEIL(FW_PART1_SIZE_OFFSET, blk_size) - bininfo_preload_size; - - if (preload_size!= 0) { - er = int_strg_obj->flash_readSectors( - (p_emb_partition_rtos->PartitionOffset + bininfo_preload_size) / blk_size, - preload_size, - (UINT8 *)(p_dram_partition->rtos_addr + bininfo_preload_size), NAND_RW_FIRMWARE - ); - - if (er < 0) { - debug_err_var("bl_load_rtos_from_flash_pl1,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - } - UINT32 part1_size = *(UINT32 *)(p_dram_partition->rtos_addr + FW_PART1_SIZE_OFFSET); - debug_msg_var("part1_size",part1_size); - part1_size = ALIGN_CEIL(part1_size, blk_size); - //debug_msg_var("part1_size_aligned",part1_size); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset / blk_size, part1_size, (UINT8 *)p_dram_partition->rtos_addr, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash_pl1,er=", er); - bl_displayErrMsg(RWErrorMsg); - } - // update loaded size - p_shminfo->boot.LdLoadSize = part1_size; - } else { - // full load - debug_msg_var("rtos_size", p_bininfo->head.BinLength); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset /blk_size, ALIGN_CEIL(p_bininfo->head.BinLength, blk_size), (UINT8 *)p_dram_partition->rtos_addr, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - // update loaded size - p_shminfo->boot.LdLoadSize = p_bininfo->head.BinLength; - } - } - return 0; -} - -_THUMB2 static int bl_load_teeos_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) -{ - int er; - int teeos_partition_id; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned int blk_size = int_strg_obj->flash_getBlockSize(); - EMB_PARTITION *p_emb_partition_teeos = bl_get_teeos_partition(p_fdt, &teeos_partition_id); - - if (p_emb_partition_teeos == NULL) { - debug_err("null p_emb_partition_teeos\r\n"); - return -1; - } - - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // load 1st block of u-boot to tmp dram (to detect compressed u-boot) - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_teeos->PartitionOffset / blk_size, ALIGN_CEIL(BIN_INFO_OFFSET_TEEOS + sizeof(HEADINFO), blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_teeos_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read teeos failed - } - - // flow to handle compressed u-boot and uncompressed one. -#if (SECURE_DECRYPT_OPTEE_OS) - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp); // describe uncompressed u-boot -#else - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp + BIN_INFO_OFFSET_TEEOS); // describe uncompressed u-boot - -#endif - - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_teeos->PartitionOffset / blk_size, ALIGN_CEIL(p_headinfo->BinLength, blk_size), (UINT8 *)p_dram_partition->teeos_addr, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_teeos_from_flash,er=", er); // read bfc-teeos failed - bl_displayErrMsg(RWErrorMsg); - } -#if 0 - if(1){ -#else - if(is_secure_enable()) { -#endif -#if (SECURE_DECRYPT_OPTEE_OS) - - unsigned int plaintext_size=0; - if((er = do_decrypt_aes(p_dram_partition->teeos_addr, p_dram_partition->teeos_addr, &plaintext_size, p_dram_partition->teeos_size)) != 0) - { - //debug_err("aes fail\r\n"); - return er; - } - - p_headinfo = (HEADINFO *)(p_dram_partition->teeos_addr + BIN_INFO_OFFSET_TEEOS); // describe uncompressed u-boot -#else - debug_err("please ENABLE SECURE_DECRYPT_OPTEE_OS config\n"); - return -1; -#endif - } - - // load teeos bin to dram partiton location - UINT32 teeos_addr = p_headinfo->Resv1[HEADINFO_TEEOS_RESV_IDX_LOAD_ADDR]; - debug_msg_var("teeos_addr", p_dram_partition->teeos_addr); - if (teeos_addr != p_dram_partition->teeos_addr) { - debug_msg_var("teeos_addr(bin)", teeos_addr); - debug_err("teeos addr not matched.\r\n"); - return -1; - } - //check check sum - if (bl_chk_uboot((unsigned int)teeos_addr, p_headinfo->BinLength) != 0) { - return -1; - } - return 0; -} -#endif - -#if !(USB_WRITELOADER || UART_UPDATE) -_THUMB2 static int bl_load_rtos_from_non_nvtpack(unsigned int src_addr, unsigned int src_size, unsigned int *p_dst_addr, unsigned int *p_dst_size) -{ - NVTPACK_BFC_HDR *pBFC = (NVTPACK_BFC_HDR *)src_addr; - HEADINFO *p_headinfo = (HEADINFO *)(src_addr + BIN_INFO_OFFSET_RTOS); - if (pBFC->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - // to avoid rtos_addr is overlapped by src_addr, we need extract some bits to get real rtos addr. - // compressed firmware - debug_msg("compressed t.bin\r\n"); - // decode some bytes to get uncompressed address - bl_decompress_rtos(src_addr, SIZE_PRELOAD, src_addr + SIZE_PRELOAD); - p_headinfo = (HEADINFO *)(src_addr + SIZE_PRELOAD + BIN_INFO_OFFSET_RTOS); - // check if valid after decode - if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - UINT32 compress_size = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - //adjust src_addr that lay compressed f.w followed by uncomppressed f.w - src_addr = uncompress_addr + uncompress_size; - src_addr = ALIGN_CEIL(src_addr, 4); - src_size = fat_read_rootfile((UINT8 *)src_addr, compress_size); - } else { - return -1; - } - } else if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - // uncompressed firmware - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - - src_size = fat_read_rootfile((UINT8 *)src_addr, uncompress_size); - src_addr = uncompress_addr; - src_size = uncompress_size; - debug_msg("uncompressed t.bin\r\n"); -#if (DRAM_RANGE_SCAN_EN == ENABLE) - } else if (utl_is_sram_fw(src_addr) == TRUE) { - debug_msg("detected as SRAM fw\r\n"); - src_size = fat_read_rootfile((UINT8 *)src_addr, FAT_READ_TOTAL_FILE_LENGTH); -#endif - } else { - return -1; - } - - *p_dst_addr = src_addr; - *p_dst_size = src_size; - return 0; -} -#endif - -#if 0//(STORAGE_EXT_TYPE == STORAGE_EXT_USB) -_THUMB2 static int bl_load_rtos_from_usb_raw(unsigned int src_addr, unsigned int src_size, unsigned int *p_dst_addr, unsigned int *p_dst_size) -{ - NVTPACK_BFC_HDR *pBFC = (NVTPACK_BFC_HDR *)src_addr; - HEADINFO *p_headinfo = (HEADINFO *)(src_addr + BIN_INFO_OFFSET_RTOS); - if (pBFC->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - // to avoid rtos_addr is overlapped by src_addr, we need extract some bits to get real rtos addr. - // compressed firmware - debug_msg("compressed t.bin\r\n"); - // decode some bytes to get uncompressed address - // assume usb write loader receive full fw at 0x0200_0000, decompress it to smaller address - bl_decompress_rtos(src_addr, SIZE_PRELOAD, src_addr - SIZE_PRESERVE_USB); - p_headinfo = (HEADINFO *)(src_addr - SIZE_PRESERVE_USB + BIN_INFO_OFFSET_RTOS); - // check if valid after decode - if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - UINT32 compress_size = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - //adjust src_addr that lay compressed f.w followed by uncomppressed f.w - utl_memcpy((void *)(uncompress_addr + uncompress_size), (void *)src_addr, compress_size); - src_addr = uncompress_addr + uncompress_size; - src_addr = ALIGN_CEIL(src_addr, 4); - src_size = compress_size; - } else { - return -1; - } - } else if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - // uncompressed firmware - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - debug_msg("uncompressed t.bin\r\n"); - utl_memcpy((void *)uncompress_addr, (void *)src_addr, uncompress_size); - src_size = uncompress_size; -#if (DRAM_RANGE_SCAN_EN == ENABLE) - } else if (utl_is_sram_fw(src_addr) == TRUE) { - debug_msg("detected as SRAM fw. NOt Support from USB\r\n"); -#endif - } else { - return -1; - } - - *p_dst_addr = src_addr; - *p_dst_size = src_size; - return 0; -} -#endif - -//#if !USB_WRITELOADER -#if !((STORAGE_EXT_TYPE == STORAGE_EXT_USB) || (STORAGE_EXT_TYPE == STORAGE_EXT_UART)) -_THUMB2 static int bl_load_rtos_from_uart(unsigned int src_addr, unsigned int src_size, unsigned int *p_dst_addr, unsigned int *p_dst_size) -{ -#if UART_UPDATE_ - UINT32 tick_kms = 10; // timeout 1000 ms - char key; - - debug_msg("UART press Enter to\r\n"); - - while (--tick_kms) { - uart_chkChar(&key); - - if (key != 0x00) { - break; - } - timer_delay(100000); //100000 - debug_msg("."); - } - - if (tick_kms) { - UINT32 uiLength; - debug_msg("\r\nEnter uboot length (Decimal):\r\n"); //must \r\n at the end because of auto_test tool - uart_getStr_polling(g_strLength); - uiLength = DecStr2Int(g_strLength); - debug_msg("\r\nPlz pass uboot bin > "); - uart_getBinary((char *)src_addr, uiLength); // Temp Receive to DRAM start - debug_msg("\r\nGot it\r\n"); -#if (DRAM_RANGE_SCAN_EN == ENABLE) - // First word is code entry point address, once if entry address is 0xC000XXXX - // represent code is running on sram. - if (bl_checkDramScanFW(src_addr) == TRUE) { - UINT32 i; - - // Enable sram usage - SETREG32(0xF0900128, 0x00000002); - SETREG32(0xF0800128, 0x00000006); - SETREG32(0xF0020060, 0x00030002); - - uiLength = ((uiLength + 3) & 0xFFFFFFFC); - - for (i = 0; i < uiLength; i += 4) { - *(UINT32 *)(src_addr + i) = *(UINT32 *)(src_addr + i); - } - *(UINT32 *)(src_addr) = *(UINT32 *)(src_addr); - return 1; - } -#endif - if (*(UINT32 *)src_addr == MAKEFOURCC('B', 'C', 'L', '1')) { - HEADINFO *p_headinfo = NULL; - NVTPACK_BFC_HDR *pBFC = (NVTPACK_BFC_HDR *)src_addr; - bl_checkFW(src_addr, uiLength); - debug_msg_var("uiLength", uiLength); - debug_msg("compressed t.bin\r\n"); - // decode some bytes to get uncompressed address - bl_decompress_rtos(src_addr, SIZE_PRELOAD, src_addr + uiLength); - p_headinfo = (HEADINFO *)(src_addr + uiLength + BIN_INFO_OFFSET_RTOS); - // check if valid after decode - if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - UINT32 compress_size = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - unsigned int ori_src_addr = src_addr; - //adjust src_addr that lay compressed f.w followed by uncomppressed f.w - src_addr = uncompress_addr + uncompress_size; - src_addr = ALIGN_CEIL(src_addr, 4); - src_size = uncompress_size; - utl_memcpy((void *)src_addr, (void *)ori_src_addr, uiLength); - *p_dst_addr = src_addr; - *p_dst_size = compress_size; - return 0; - } else { - return -1; - } - return 0; - } - } -#endif - return -1; -} -#endif - -_THUMB2 static void bl_update_uItron_headInfo(UINT32 fw_base_addr, DRAM_PARTITION *p_dram_partition) -{ - HEADINFO *pHeadInfo; -#if (UITRON_FW == ENABLE) - BININFO *pBinInfo; -#endif - pHeadInfo = (HEADINFO *)(fw_base_addr + BIN_INFO_OFFSET_RTOS); - if (p_dram_partition) { - pHeadInfo->ModelextAddr = p_dram_partition->fdt_addr; - } else { - pHeadInfo->ModelextAddr = 0; -#if (UITRON_FW == ENABLE) - pBinInfo = (BININFO *)(fw_base_addr + BIN_INFO_OFFSET_RTOS); - pBinInfo->ld.Resv[0] = LoaderInternalInfo[1]; - pBinInfo->ld.LdPackage = (LoaderInternalInfo[3] & 0xFFFF); -#endif - } -} - -_THUMB2 static int bl_update_loader_bininfo(unsigned char *p_fdt, unsigned int ld_flag, unsigned int rtos_loaded_size) -{ - BOOTINFO *p_ld; - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - BININFO *p_bininfo = (BININFO *)(p_dram_partition->rtos_addr + BIN_INFO_OFFSET_RTOS); - - p_ld = &p_shminfo->boot; - if (!(p_bininfo->head.Resv1[HEADINFO_RESV_IDX_BOOT_FLAG] & BOOT_FLAG_PARTLOAD_EN)) { - // LdLoadSize updated on uboot or bl_load_rtos_from_flash(), if BOOT_FLAG_PARTLOAD_EN - p_ld->LdLoadSize = rtos_loaded_size; - } - p_ld->LdLoadTime = timer_getLdrElapse(); - p_ld->LdResvSize = 0; //unused - p_ld->FWResvSize = 0; //unused - return 0; -} - -_THUMB2 static int bl_is_smp(unsigned char *p_fdt) -{ -#if (FDT_SUPPORT) - int len; - const char *nodep; - nodep = (const char *)bl_get_fdt_property(p_fdt, PATH_NVT_INFO, PROPERTY_NVT_LINUX_SMP, &len); - debug_msg_var("nodep", (UINT32)nodep); - if (nodep == NULL) { - return 0; - } - debug_msg((char *)nodep); - if (strcmp(nodep, "NVT_LINUX_SMP_ON") == 0) { - return 1; - } - return 0; -#else - return 0; -#endif -} - -#if !REMOVED_FLASH -_THUMB2 int bl_boot_uboot(unsigned char *p_fdt) -{ -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - UINT32 No_CPU; -#endif - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // update shminfo - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - unsigned int *p_param = (unsigned int *)(&_load_LOADER_CONFIGRAM_FREQ_PARAM_start_base[0]); - p_shminfo->boot.LdPackage = p_param[3] & 0xFFFF; - p_shminfo->boot.LdStorage = (p_param[3] >> 16) & 0xFF; - - // update headinfo as real u-boot address - HEADINFO *p_headinfo = (HEADINFO *)(p_dram_partition->uboot_addr + BIN_INFO_OFFSET_UBOOT); - - if (bl_chk_uboot(p_dram_partition->uboot_addr, p_headinfo->BinLength) != 0) { - return -1; - } - // start cpu2 - if (p_dram_partition->uboot_addr != p_headinfo->CodeEntry) { - debug_err_var("drampat-uboot_addr ", (int)p_dram_partition->uboot_addr); - debug_err_var("bin-uboot_addr ", (int)p_headinfo->CodeEntry); - return -1; - } - // for uboot to indicate this boot is all-in-one fw or non-all-in-one boot from uart or usb - // if boot from uart or usb with non-all-in-one fw, the uboot's ModelextAddr will be zero - p_headinfo->ModelextAddr = p_dram_partition->fdt_addr; - - CPUflushWriteCache(p_headinfo->CodeEntry, p_headinfo->BinLength); - UINT32 isSMP = bl_is_smp(p_fdt); - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - No_CPU = *(UINT32 *)0xFFD00004; - No_CPU &= 0x3; - debug_msg_var("core No.=", No_CPU+1); -#endif - // init cpu timer -// bl_cpu_timer_init(CPU_TIMER_SETTING); -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - if (!isSMP || !No_CPU) -#else - if (!isSMP) -#endif - { -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - debug_msg_var("Bin core=", isSMP+1); -#endif - bl_entry_boot(p_fdt, p_headinfo->CodeEntry); - } else { -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - // init cpu timer - bl_cpu_timer_init(global_timer_freq); - - bl_smp_start(p_fdt, p_headinfo->CodeEntry); - // boot u-boot and never return back to loader -#else - //bl_smp_start(p_fdt, p_headinfo->CodeEntry); - debug_err("not support smp\r\n"); -#endif - } - return 0; -} - -#if (NUTTX_SUPPORT) -_THUMB2 static int bl_boot_nuttx(unsigned char *p_fdt) -{ - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // update headinfo as real u-boot address - HEADINFO *p_headinfo = (HEADINFO *)(p_dram_partition->nuttx_addr + BIN_INFO_OFFSET_NUTTX); - - if (bl_chk_uboot(p_dram_partition->nuttx_addr, p_headinfo->BinLength) != 0) { - return -1; - } - - // start cpu2 - if (p_dram_partition->nuttx_addr != p_headinfo->CodeEntry) { - debug_err_var("drampat-nuttx_addr ", (int)p_dram_partition->nuttx_addr); - debug_err_var("bin-nuttx_addr ", (int)p_headinfo->CodeEntry); - return -1; - } - - CPUflushWriteCache(p_headinfo->CodeEntry, p_headinfo->BinLength); - - // init cpu timer - bl_cpu_timer_init(CPU_TIMER_SETTING); - - bl_entry_boot(p_fdt, p_headinfo->CodeEntry); - // boot nuttx and never return back to loader - return 0; -} -#endif - -_THUMB2 static int bl_boot_teeos(unsigned char *p_fdt) -{ - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // update headinfo as real u-boot address - HEADINFO *p_headinfo = (HEADINFO *)(p_dram_partition->teeos_addr + BIN_INFO_OFFSET_TEEOS); - - // update uboot addr for teeos - p_headinfo->Resv1[HEADINFO_TEEOS_RESV_IDX_UBOOT_ADDR] = p_dram_partition->uboot_addr; - - -#if 0 //do not checksum, because teeos header has removed cause checksum failed - if (bl_chk_uboot(p_dram_partition->teeos_addr, p_headinfo->BinLength) != 0) { - return -1; - } -#endif - - //flush uboot - CPUflushWriteCache(p_dram_partition->uboot_addr, p_dram_partition->uboot_size); - //flush teeos - CPUflushWriteCache(p_headinfo->CodeEntry, p_headinfo->BinLength); - - // init cpu timer - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - bl_cpu_timer_init(CPU_TIMER_SETTING); - // boot core2 (after teeos is loaded) - if (HEADINFO_UBOOT(p_dram_partition)->BinCtrl & 0x00000002) { - //if SMP, trigger core2 - debug_msg("smp(tee)\r\n"); - bl_core2_prepare(p_dram_partition, p_headinfo->CodeEntry); - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - bl_core2_reset(); - } else { - debug_msg_var("not smp\r\n", p_headinfo->BinCtrl); - } -#endif - bl_entry_boot(p_fdt, p_headinfo->CodeEntry); - // boot teeos and never return back to loader - return 0; -} - -_THUMB2 static int bl_update_loader_flag(unsigned char *p_fdt, UINT32 uiLoaderFunc) -{ - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - - utl_memcpy(p_bininfo->boot.LdInfo_1, "LD_NVT", 6); - - p_bininfo->boot.LdCtrl2 = 0; - if (uiLoaderFunc & FUNC_UPDATE_FW) { - p_bininfo->boot.LdCtrl2 |= LDCF_UPDATE_FW; - } - if (uiLoaderFunc & FUNC_UPDATE_LOADER) { - p_bininfo->boot.LdCtrl2 |= LDCF_UPDATE_LD; - } - if (uiLoaderFunc & FUNC_RUN_CARD) { - p_bininfo->boot.LdCtrl2 |= LDCF_BOOT_CARD; - } - if (uiLoaderFunc & FUNC_RUN_FLASH) { - p_bininfo->boot.LdCtrl2 |= LDCF_BOOT_FLASH; - } - //CPUflushWriteCache((UINT32)p_bininfo, sizeof(BININFO)); - debug_msg_var("LdCtrl2", p_bininfo->boot.LdCtrl2); - - unsigned int ver; - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - BOOTINFO *p_ld = &p_shminfo->boot; - - utl_memset(p_ld->LdInfo_1, 0, sizeof(p_ld->LdInfo_1)); - utl_memcpy(p_ld->LdInfo_1, "LD_NVT", 6); - - ver = (((LoaderInternalInfo[1] >> 28) & 0xF) << 24) | - (((LoaderInternalInfo[1] >> 24) & 0xF) << 16) | - ((LoaderInternalInfo[1] >> 16) & 0xFF); - - if (g_uiVersion == 0) { - g_uiVersion = ver; - } - - utl_memcpy(&p_ld->LdInfo_1[8], &g_uiVersion, sizeof(g_uiVersion)); - unsigned int *p_param = (unsigned int *)(&_load_LOADER_CONFIGRAM_FREQ_PARAM_start_base[0]); - p_ld->LdPackage = p_param[3] & 0xFFFF; - p_ld->LdStorage = (p_param[3] >> 16) & 0xFF; - - return 0; -} - -// return uItron_fw_addr -_THUMB2 unsigned int bl_process_all_in_one(UINT32 uiFwBuf, UINT32 uiFwBufSize, DRAM_PARTITION **pOut_dram_partition, UINT32 uiLoaderFunc, UINT32 *p_comp_addr, UINT32 *p_comp_size) -{ - int er; - unsigned char *p_fdt = NULL; - DRAM_PARTITION *p_dram_partition = NULL; - //p_tmp for the case of all-in-one without fdt or uboot - unsigned char *p_tmp = (unsigned char *)(uiFwBuf + ALIGN_CEIL(uiFwBufSize, 4)); - - // load fdt - er = bl_load_fdt_from_all_in_one((unsigned char *)uiFwBuf, uiFwBufSize, &p_fdt); - if (er == -2) { // try to load from nand - debug_msg("fdt from flash.\r\n"); - // open flash - if (bl_flash_open() != 0) { // dont move flash open outside section, consider that T without flash device. - bl_displayErrMsg("flash open failed\r\n"); - } - - //p_tmp for the case of all-in-one without fdt or uboot - unsigned char *p_tmp = (unsigned char *)(uiFwBuf + ALIGN_CEIL(uiFwBufSize, 4)); - er = bl_load_fdt_from_flash(p_tmp, 0x2000000, &p_fdt); // dtb size less than 32MB to be safer. - if (er != 0) { - bl_displayErrMsg("load fdt failed\r\n"); - } - } - - // update loader flag - bl_update_loader_flag(p_fdt, uiLoaderFunc); - if (uiLoaderFunc & FUNC_UPDATE_FW) { - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - p_bininfo->comm.Resv[5] = uiFwBuf; // COMM_FW_UPD_ADDR - p_bininfo->comm.Resv[6] = uiFwBufSize; // COMM_FW_UPD_LEN - debug_msg_var("upd_src_addr=", uiFwBuf); - debug_msg_var("upd_src_size=", uiFwBufSize); - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - //check loader addr is matched with loader self. - extern char _loader_exec_compres_start[]; - if (p_dram_partition->loader_addr != (UINT32)_loader_exec_compres_start) { - debug_msg_var("p_dram_partition->loader_addr", p_dram_partition->loader_addr); - debug_msg_var("_loader_exec_compres_start", (UINT32)_loader_exec_compres_start); - bl_displayErrMsg("loader addr is not match."); - } - //when rtos boot from flash, the boot from loader directly, - //but when rtos need to burn image, the uboot is still required. - //so, any one need to burn image, uboot is always needed to boot. - //if ((uiLoaderFunc & FUNC_UPDATE_FW) || p_dram_partition->rtos_addr == 0) { - if (1) { - // always use uboot to handle all-in-one bin - if (p_dram_partition->nuttx_size == 0 && p_dram_partition->teeos_size == 0) { - // load uboot - er = bl_load_uboot_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er == -2) { // try to load from nand - debug_msg("uboot from flash.\r\n"); - // open flash - if (bl_flash_open() != 0) { // dont move flash open outside section, consider that T without flash device. - bl_displayErrMsg("flash open failed\r\n"); - } - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - } - - er = bl_boot_uboot((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot uboot failed\r\n"); - } - } else if (p_dram_partition->nuttx_size) { -#if (NUTTX_SUPPORT) - // load nuttx - er = bl_load_nuttx_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er != 0) { - bl_displayErrMsg("load nuttx failed\r\n"); - } - er = bl_boot_nuttx((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot nuttx failed\r\n"); - } -#else - bl_displayErrMsg("NUTTX_SUPPORT disabled\r\n"); -#endif - } else if (p_dram_partition->teeos_size) { - // load teeos - er = bl_load_teeos_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er != 0) { - bl_displayErrMsg("load teeos failed\r\n"); - } - // load uboot - er = bl_load_uboot_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - // boot teeos - er = bl_boot_teeos((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot teeos failed\r\n"); - } - } - return er; - } else { - // update rtos information - // the following is for uncompressed-rtos only, others needing uboot - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_dram_partition->fdt_addr, MODELEXT_TYPE_BIN_INFO); - - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - *p_comp_addr = p_bininfo->comm.Resv[3]; // COMM_UITRON_COMP_ADDR - *p_comp_size = p_bininfo->comm.Resv[4]; // COMM_UITRON_COMP_LEN - - *pOut_dram_partition = p_dram_partition; - return bl_load_rtos_from_all_in_one((unsigned char *)uiFwBuf, uiFwBufSize, &p_fdt); - } -} -#endif - -// return uItron_fw_addr, no need to fully decode -_THUMB2 static unsigned int bl_process_rtos_only(UINT32 uiFwBuf, UINT32 uiFwBufSize, UINT32 uiLoaderFunc, UINT32 *p_comp_addr, UINT32 *p_comp_size) -{ - UINT32 uItron_fw_addr; - NVTPACK_BFC_HDR *pBFC; - HEADINFO *p_headinfo; - - debug_msg("\r\nbl_process_rtos_only\r\n"); - pBFC = (NVTPACK_BFC_HDR *)uiFwBuf; - if (pBFC->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - UINT32 compressSize; - unsigned char *p_tmp = (unsigned char *)(uiFwBuf + ALIGN_CEIL(uiFwBufSize, 4)); - LZ_Un_compress((UINT8 *)uiFwBuf + LDC_HEADER_SIZE, p_tmp, SIZE_PRELOAD); - p_headinfo = (HEADINFO *)(p_tmp + BIN_INFO_OFFSET_RTOS); - uItron_fw_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; -#if UITRON_FW - uItron_fw_addr = p_headinfo->CodeEntry - CODE_ENTRY_OFFSET; // cliff -#endif - - if ((uItron_fw_addr & 0x0000FFFF) != 0) { //cc engine's limitation - debug_err_var("rtos addr must match (&0x0000FFFF)==0", uItron_fw_addr); // but 660 allow - uItron_fw_addr = uItron_fw_addr & 0xFFFF0000; - } - compressSize = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - //debug_dump_addr(tmpBuf,0x200); - debug_msg_var("F compress uItron_fw_addr", uItron_fw_addr); - // uiFwBuf has adjusted on bl_load_rtos_from_non_nvtpack() - *p_comp_addr = uiFwBuf; - *p_comp_size = compressSize; - } else { - p_headinfo = (HEADINFO *)(uiFwBuf + BIN_INFO_OFFSET_RTOS); - uItron_fw_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; -#if UITRON_FW - uItron_fw_addr = p_headinfo->CodeEntry - CODE_ENTRY_OFFSET; // cliff -#endif - - if ((uItron_fw_addr & 0x0000FFFF) != 0) { //cc engine's limitation - debug_err_var("rtos addr must match (&0x0000FFFF)==0", uItron_fw_addr); // but 660 allow - uItron_fw_addr = uItron_fw_addr & 0xFFFF0000; - } - - debug_msg_var("Normal uItron_fw_addr", uItron_fw_addr); - *p_comp_addr = 0; - *p_comp_size = 0; - } - return uItron_fw_addr; -} -#if !UPDATE_EMU_CODE && !REMOVED_FLASH -_THUMB2 static unsigned int bl_process_flash_boot(unsigned char *p_tmp, DRAM_PARTITION **pOut_dram_partition, UINT32 uiLoaderFunc, UINT32 *p_comp_addr, UINT32 *p_comp_size) -{ - int er; - unsigned char *p_fdt = NULL; - DRAM_PARTITION *p_dram_partition = NULL; - - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - - // load fdt - er = bl_load_fdt_from_flash(p_tmp, SDRAM_Start_FW, &p_fdt); // dtb size less than 32MB to be safer. - if (er != 0) { - bl_displayErrMsg("load fdt failed\r\n"); - } - - // update loader flag - bl_update_loader_flag(p_fdt, uiLoaderFunc); - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition->teeos_size) { - // load teeos - er = bl_load_teeos_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load teeos failed\r\n"); - } - // load uboot - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - // boot teeos - er = bl_boot_teeos((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot teeos failed\r\n"); - } - } else if (p_dram_partition->rtos_addr == 0 || DUAL_RTOS_SUPPORT || (gFastbootKeyCallBack == NULL) || (!gFastbootKeyCallBack())) { - // load uboot - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - - // boot uboot - er = bl_boot_uboot((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot uboot failed\r\n"); - } - } else { - // load rtos - er = bl_load_rtos_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load rtos failed\r\n"); - } - } - - // update compressed rtos information - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((unsigned char *)p_dram_partition->fdt_addr, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - *p_comp_addr = p_bininfo->comm.Resv[3]; // COMM_UITRON_COMP_ADDR - *p_comp_size = p_bininfo->comm.Resv[4]; // COMM_UITRON_COMP_LEN - - *pOut_dram_partition = p_dram_partition; - return p_dram_partition->rtos_addr; -} -#endif - -/** - bl_process_update_loader. - - Write loader will update loader binary file - - @param[in] loader_addr loader in DRAM starting address - @param[in] loader_size loader code length (from loader header offset 0x24) - @return void -*/ -_THUMB2 static int bl_process_update_loader(unsigned int loader_addr, unsigned int loader_size) -{ - unsigned int reload_addr; - - // Check boot loader read from SD card - if(is_data_area_encrypted() == 0) { - -#if ((STORAGE_EXT_TYPE == STORAGE_EXT_ETH)|(STORAGE_EXT_TYPE == STORAGE_EXT_USB)) - //UINT32 uiOffset; - //uiOffset = *((UINT32 *)(loader_addr + 0x80)); - //if(uiOffset) {//Combo loader - // if(*(UINT32*)0xF00100F0 == 0x50210000) { - // debug_msg("combo loader 528\r\n"); - // bl_checkLoader(loader_addr+uiOffset, COMBINATION_LOADER_SIZE - uiOffset); //check 528 - // } else{ - // debug_msg("combo loader 52X\r\n"); - // bl_checkLoader(loader_addr, loader_size); //check 52x - // } - //}else - bl_checkLoader(loader_addr, loader_size); -#else -#if 0//(LOADER_TYPE == COMBINATION_528) - debug_msg("CB8\r\n"); - bl_checkLoader(loader_addr + loader_size, (COMBINATION_LOADER_SIZE - loader_size)); -#else //STAND_ALONE_LOADER or combination 52x loader - //debug_msg("STD\r\n"); - bl_checkLoader(loader_addr, loader_size); -#endif -#endif - } - debug_msg("update loader\r\n"); - - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - - // Program loader -#if 0 -#if ((STORAGE_EXT_TYPE == STORAGE_EXT_ETH)|(STORAGE_EXT_TYPE == STORAGE_EXT_USB)) - UINT32 uiOffset; - uiOffset = *((UINT32 *)(loader_addr + 0x80)); - if(uiOffset) //Combo loader - loader_size = COMBINATION_LOADER_SIZE; - //If single loader , it already got -#else -#if (LOADER_TYPE == STAND_ALONE_LOADER_560) || (LOADER_TYPE == STAND_ALONE_LOADER_528) -#else //Combination loader - loader_size = COMBINATION_LOADER_SIZE; -#endif -#endif -#endif - if (int_strg_obj->flash_writeSectors(StartNandBlkUpdateLoader, loader_size, (UINT8 *)loader_addr, NAND_RW_LOADER) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - // Read back - reload_addr = loader_addr + loader_size; - if (int_strg_obj->flash_readSectors(StartNandBlkUpdateLoader, loader_size, (UINT8 *)reload_addr, NAND_RW_LOADER) < 0) { - bl_displayErrMsg("rd fail\r\n"); - } - // Verify - if (memcmp((void *)loader_addr, (void *)reload_addr, loader_size) != 0) { - bl_displayErrMsg("verify fail\r\n"); - } - return 0; -} -#if UPDATE_EMU_CODE -_THUMB2 static int bl_process_update_emu_firmware(unsigned int emu_addr, unsigned int emu_size) -{ - unsigned int reload_addr; - - // Check boot loader read from SD card -// bl_checkFW(emu_addr, emu_size); - debug_msg("update emu firmware size"); - uart_putSystemUARTStr(Dec2HexStr(emu_size)); - uart_putSystemUARTStr("\r\n"); - - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - - // Program firmware - if (int_strg_obj->flash_writeSectors(g_uiStartBlkUpdateFW, emu_size, (UINT8 *)emu_addr, NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - // Read back - reload_addr = emu_addr + emu_size; - if (int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW, emu_size, (UINT8 *)reload_addr, NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg("rd fail\r\n"); - } - // Verify - if (memcmp((void *)emu_addr, (void *)reload_addr, emu_size) != 0) { - bl_displayErrMsg("verify fail\r\n"); - } - return 0; -} -#endif - -_THUMB2 void bl_read_rtos_addr(UINT32 *pLoadAddr, UINT32 *pTargetAddr, UINT32 *pSize) -{ - *pLoadAddr = g_rtos_load_addr; - *pTargetAddr = g_rtos_target_addr; - *pSize = g_rtos_size; -} - -/** - main flow code - - If there is Calibration Firmware code store in NAND, running flow as follow - O's work flow - - @return fw base addr -*/ - -_THUMB2 UINT32 bl_mainFlow(void) -{ - UINT32 uiUpdateFileLen = 0; - UINT32 uiLoaderFunc = 0; - UINT32 uiLoaderSize = 32 * 1024; // pre-assume 32KB, actual size is parsed from loader - //Show Duty calibration log -#if (_LOADER_DUTY_CALIBRATION_ == ENABLE && _LOADER_DUTY_CALIBRATION_LOG_ == ENABLE) - UINT32 uiLoaderAddress; - UINT32 uiLogSramAddress; -#endif - -#if !(USB_WRITELOADER || UART_UPDATE) - unsigned int adjusted_addr = 0; - unsigned int adjusted_size = 0; -#endif - UINT32 uiFwBaseAddr = SDRAM_Start_FW; // FW base address - DRAM_PARTITION *p_dram_partition = NULL; - - // BaseOfStack is initialized at doRemapLZ.s - UINT32 uiheapBufferAddr = (UINT32)_loader_heap_base; -// UINT32 uiheapBufferAddr = BaseOfStack + 0x40000; // reserve 16KB for tmp buffer usage - UINT32 uiTmpBufferAddr = uiheapBufferAddr + FAT_HEAP_BUFFER_SIZE; - UINT32 uiUpdateBootloaderBufAddr = uiTmpBufferAddr + 0x4000; - UINT32 uiUpdateMainBinBufAddr = SDRAM_Start_FW; - - // UART initial sequence - //uart_openSystemUART(); - // rtc reset shutdown timer - // rtc_resetShutDownTimer(); - - - - -#if 0 - // adjust PAD driving (if required) - bl_adjustDriving(); - /* - - @b RTC_PWR_SW_STS: Power on source is PWR_SW - - @b RTC_PWR_VBAT_STS: Power on source is PWR_VBAT - - @b RTC_PWR_VBUS_STS: Power on source is PWR_VBUS - */ - uiPowerOnSrc = rtc_getPWRONSource(); - - if (uiPowerOnSrc & RTC_PWR_SW_STS) { - uart_putSystemUARTStr("\r\nSW PON\r\n"); - } else if (uiPowerOnSrc & RTC_PWR_VBAT_STS) { - uart_putSystemUARTStr("\r\nVBAT PON\r\n"); - } else if (uiPowerOnSrc & RTC_PWR_VBUS_STS) { - uart_putSystemUARTStr("\r\nVBUS PON\r\n"); - } else if (rtc_getIsAlarmPowerOn()) { - uart_putSystemUARTStr("\r\nPwrAlarm PON\r\n"); - } else { - uart_putSystemUARTStr("\r\nPOR PON\r\n"); - } -#endif - // Display Loader Version - debug_msg((char *)LOADER_START_STR); - UTL_setDrvTmpBufferAddress(uiTmpBufferAddr); - - -#if 0 // for now, reduce code size - if (rtc_chkS3boot()) { - UINT32 resume_addr; - - uart_putSystemUARTStr("main selfing..\r\n"); - resume_addr = bl_resume_cpu1((unsigned char *)_BOARD_IPC_ADDR_); - if (resume_addr == 0) { - // in codition for MODELEXT_BUILT_IN_ON - resume_addr = RESUME_ADDR; - } - return resume_addr; - } else { - - uart_putSystemUARTStr("main not selfing..\r\n"); - } -#endif - -#if 0 - // Sample to hook spi flash extending function - flash_installIdentifyCB(bl_spiIdentify); -#endif - prj_main(); - -#if !(USB_WRITELOADER) - set_usb_suspend(); -#endif - - if(utl_get_bootsrc() == BOOT_SOURCE_UART) - { -#if UART_UPDATE - debug_msg("Boot from UART ...\r\n"); - bl_uart();//never returned. -#else - bl_displayErrMsg("UART_UPDATE must enable on loader\r\n"); -#endif - } - - if(USB_WRITELOADER || utl_get_bootsrc() == BOOT_SOURCE_USB) - { -#if USB_WRITELOADER - debug_msg("Boot from USB ...\r\n"); - bl_usb(); //never returned. -#else - bl_displayErrMsg("USB_WRITELOADER must enable on loader\r\n"); -#endif - } - -#if !(USB_WRITELOADER || UART_UPDATE) - if (bl_load_rtos_from_uart(uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH, &adjusted_addr, &adjusted_size) == 0) { - //specail case, load small rtos from uart - uiUpdateMainBinBufAddr = adjusted_addr; - uiUpdateFileLen = adjusted_size; - uiLoaderFunc |= FUNC_RUN_CARD; - } else if ((int_strg_obj->flash_getBlockSize() == EMMC_BLOCK_SIZE) && gRecoveryTriggerCallBack && gRecoveryTriggerCallBack()) { - debug_msg("Recovery triggered not support currently.\r\n"); -#if 0 - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } else { - flash_mount_fs(0, BaseOfStack + 0x4000, FAT_HEAP_BUFFER_SIZE); - if (flash_mount_partition(g_uiPartitionID) == E_OK) { - if (flash_open_file(RECOVERY_FW_NAME) == TRUE) { - NVTPACK_MEM mem_in ; - flash_read_file((UINT8 *)uiUpdateMainBinBufAddr, SIZE_PRELOAD); - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - // all in one bin - if (bl_chk_valid_all_in_one(&mem_in) == 0) { - // Read all - uiUpdateFileLen = flash_read_file((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - uiLoaderFunc |= FUNC_UPDATE_FW; - g_is_recovery_triggered = TRUE; - } else { - debug_msg("Recovery should be all in one bin!\r\n"); - } - } else { - debug_msg("no recovery bin!\r\n"); - } - } else { - debug_msg("Partition error!\r\n"); - } - } -#endif - } else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack()) && - ((gCardDetectCallBack == NULL) || gCardDetectCallBack())) { - if (card_open() == TRUE && fat_initFAT(uiheapBufferAddr, FAT_HEAP_BUFFER_SIZE) == TRUE) { -#if UPDATE_SIM_CODE - BOOL bWDTInit = UTL_canUpdateSecKey(); - if (bWDTInit && fat_open_rootfile(RUN_WRKEY_NAME) == TRUE) { - debug_msg("sim.bin exist\r\n"); // the others A or T are skipped. - // Read byte count specified in file directory entry - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - uiLoaderFunc |= FUNC_RUN_WRBIN; - } else { // exclude others update if FUNC_RUN_WRBIN is existing. -#endif - // Update loader or not, loader is fixed to 16 KB - if (fat_open_rootfile(UPDATE_LOADER_NAME) == TRUE) { - // Read byte count specified in file directory entry - fat_read_rootfile((UINT8 *)uiUpdateBootloaderBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - uiLoaderFunc |= FUNC_UPDATE_LOADER; - uiLoaderSize = *((UINT32 *)(uiUpdateBootloaderBufAddr + 0x24)); - } - // "Update FW" or "Run FW" function - // Update FW has higher priority - if (fat_open_rootfile(UPDATE_FW_NAME) == TRUE) { - NVTPACK_MEM mem_in ; - fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, SIZE_PRELOAD); - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - // all in one bin - if (bl_chk_valid_all_in_one(&mem_in) == 0) { - // Read all - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - uiLoaderFunc |= FUNC_UPDATE_FW; - } else { - // only rtos - debug_msg("not all-in-one, force behavior as T bin.\r\n"); - adjusted_addr = 0; - adjusted_size = 0; - if (bl_load_rtos_from_non_nvtpack(uiUpdateMainBinBufAddr, uiUpdateFileLen, &adjusted_addr, &adjusted_size) == 0) { - uiFwBaseAddr = adjusted_addr; //fix compressed fit bl_checkDramScanFW() after copy its to temp area, see commit log - uiUpdateFileLen = adjusted_size; - } else { - bl_displayErrMsg("invalid firmware"); - } -#if UPDATE_EMU_CODE - uiLoaderFunc |= FUNC_UPDATE_FW; -#else - uiLoaderFunc |= FUNC_RUN_CARD; -#endif - - } - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - } - // Run FW has lower priority - else if (fat_open_rootfile(RUN_FW_NAME) == TRUE) { - NVTPACK_MEM mem_in ; - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, SIZE_PRELOAD); - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - if (bl_chk_valid_all_in_one(&mem_in) == 0) { - // Read all - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - } else { - // Read rtos - unsigned int adjusted_addr = 0; - unsigned int adjusted_size = 0; - if (bl_load_rtos_from_non_nvtpack(uiUpdateMainBinBufAddr, uiUpdateFileLen, &adjusted_addr, &adjusted_size) != 0) { - bl_displayErrMsg("invalid firmware"); - } else { - uiFwBaseAddr = adjusted_addr; //fix compressed fit bl_checkDramScanFW() after copy its to temp area, see commit log - uiUpdateFileLen = adjusted_size; - } - uiLoaderFunc |= FUNC_RUN_CARD; - } - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - uiLoaderFunc |= FUNC_RUN_CARD; - } -#if UPDATE_SIM_CODE - } -#endif - card_close(); - } else { - debug_msg("card open fail\r\n"); -// while (1); - } - } else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack()) && - ((gCardDetectCallBack != NULL) || (gCardDetectCallBack() == FALSE))) { - debug_msg("No card inserted\r\n"); - } -#endif - - if (uiLoaderFunc & FUNC_UPDATE_LOADER) { - bl_process_update_loader(uiUpdateBootloaderBufAddr, uiLoaderSize); - } - - // Run FW - UINT32 comp_addr = 0; - UINT32 comp_size = 0; - if (uiLoaderFunc & (FUNC_RUN_CARD | FUNC_UPDATE_FW)) { - debug_msg("RC\r\n"); - NVTPACK_MEM mem_in ; - int chk_valid_all_in_one; -#if (DRAM_RANGE_SCAN_EN == ENABLE) - // First word is code entry point address, once if entry address is 0xC000XXXX - // represent code is running on sram. - debug_msg("Check SRAM fw\r\n"); - if (bl_checkDramScanFW(uiUpdateMainBinBufAddr) == TRUE) { - - debug_msg("This fw is on SRAM\r\n"); - // Enable sram usage - SETREG32(0xF0900128, 0x00000002); - SETREG32(0xF0800128, 0x00000006); - SETREG32(0xF0020060, 0x00030002); - - debug_msg(Dec2HexStr(*((UINT32 *)SRAM_Start_FW))); - debug_msg("before jump\r\n"); -// while (b_debug_go == FALSE); - load_dram_scan(uiUpdateMainBinBufAddr, uiUpdateFileLen); - return *((UINT32 *)SRAM_Start_FW); - } -#endif - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - chk_valid_all_in_one = bl_chk_valid_all_in_one(&mem_in); - if (chk_valid_all_in_one == 0) { - // all-in-one flow - // File len got from fat_read_rootfile() may exceed actual file size. - // In such condition, we should use info in NVTPACK_FW_HDR2 - if (((NVTPACK_FW_HDR2 *)uiUpdateMainBinBufAddr)->TotalSize < uiUpdateFileLen) { - uiUpdateFileLen = ((NVTPACK_FW_HDR2 *)uiUpdateMainBinBufAddr)->TotalSize; - mem_in.len = uiUpdateFileLen; - } -#if (REMOVED_FLASH == ENABLE) - bl_displayErrMsg("cannot process all-in-one fw"); -#else - uiFwBaseAddr = bl_process_all_in_one(uiUpdateMainBinBufAddr, uiUpdateFileLen, &p_dram_partition, uiLoaderFunc, &comp_addr, &comp_size); -#endif - } else { - // non-all-in-one flow - // check valid - if (uiLoaderFunc & FUNC_UPDATE_FW) { -#if UPDATE_EMU_CODE - bl_process_update_emu_firmware(uiUpdateMainBinBufAddr, uiUpdateFileLen); -#else - bl_displayErrMsg("cannot write non-all-in-one fw"); -#endif - } - uiFwBaseAddr = bl_process_rtos_only(uiUpdateMainBinBufAddr, mem_in.len, uiLoaderFunc, &comp_addr, &comp_size); - } - - // here uiFwBaseAddr is ready to use. - if (comp_addr == 0) { - HEADINFO *p_headinfo = (HEADINFO *)(uiFwBaseAddr + BIN_INFO_OFFSET_RTOS); - debug_msg("Nrml\r\n"); - if (chk_valid_all_in_one == 0) { - uiUpdateFileLen = p_headinfo->BinLength; - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } else { - // uiUpdateFileLen is already set when file is loaded - } - } else { - debug_msg("Fcompress\r\n"); - //for speed up, u-boot only copy compressed rtos and loader needs to decode it - uiUpdateFileLen = bl_decompress_rtos(comp_addr, comp_size, uiFwBaseAddr); - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } - debug_msg_var("uiUpdateFileLen", uiUpdateFileLen); - //boot from flash or update fw is no need to check sanity because of ecc, turn on it just for debug - if (uiLoaderFunc & FUNC_RUN_CARD) { - bl_checkFW(uiUpdateMainBinBufAddr, uiUpdateFileLen); - } - if (chk_valid_all_in_one == 0) { - bl_update_uItron_headInfo(uiFwBaseAddr, p_dram_partition); - } else { - debug_msg_var("fw load addr", uiUpdateMainBinBufAddr); - bl_update_uItron_headInfo(uiUpdateMainBinBufAddr, p_dram_partition); - } - } else { //boot from flash -#if (REMOVED_FLASH == DISABLE) -#if UPDATE_EMU_CODE -// UINT32 uiNandBlkSize; - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - debug_msg("RFlash\r\n"); - if (int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW, g_uiNandBlkSize, (UINT8 *)SDRAM_Start_FW, NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - - uiUpdateFileLen = *(volatile UINT32 *)(SDRAM_Start_FW + 0x168); - - if (int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW + 1, uiUpdateFileLen - g_uiNandBlkSize, (UINT8 *)(SDRAM_Start_FW + g_uiNandBlkSize), NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - - uiFwBaseAddr = bl_process_rtos_only(SDRAM_Start_FW, uiUpdateFileLen, uiLoaderFunc, &comp_addr, &comp_size); - bl_checkFW(SDRAM_Start_FW, uiUpdateFileLen); - uiUpdateMainBinBufAddr = SDRAM_Start_FW; - if (comp_addr == 0) { - debug_msg("Nrml\r\n"); - } else { - debug_msg("Fcompress not support\r\n"); - } - -#else - uiFwBaseAddr = bl_process_flash_boot((UINT8 *)SDRAM_Start_FW, &p_dram_partition, uiLoaderFunc, &comp_addr, &comp_size); - if (comp_addr == 0) { - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } else { - //for speed up, u-boot only copy compressed rtos and loader needs to decode it - uiUpdateFileLen = bl_decompress_rtos(comp_addr, comp_size, uiFwBaseAddr); - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } - // no need to bl_checkFW, because check sanity in flash_read - bl_update_uItron_headInfo(uiFwBaseAddr, p_dram_partition); -#endif -#endif - } - - if (p_dram_partition) { - bl_update_loader_bininfo((unsigned char *)p_dram_partition->fdt_addr, uiLoaderFunc, uiUpdateFileLen); - } - -#if UPDATE_EMU_CODE - debug_msg_var("emu fw len", uiUpdateFileLen); -#endif - g_rtos_load_addr = uiUpdateMainBinBufAddr; - g_rtos_target_addr = uiFwBaseAddr; - g_rtos_size = uiUpdateFileLen; - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - CPUInvalidateICacheAll(); - debug_msg_var("rtos start", uiFwBaseAddr); - return uiFwBaseAddr; - -} - -_THUMB2 void loader_setUpdateFwName(char *fileName) -{ - strncpy((char *)UPDATE_FW_NAME, fileName, sizeof(UPDATE_FW_NAME)); -} - -_THUMB2 void loader_setUpdateLdrName(char *fileName) -{ - strncpy((char *)UPDATE_LOADER_NAME, fileName, sizeof(UPDATE_LOADER_NAME)); -} - -_THUMB2 void loader_setRunFwName(char *fileName) -{ - strncpy((char *)RUN_FW_NAME, fileName, sizeof(RUN_FW_NAME)); -} - -_THUMB2 void loader_setRecoveryFwName(char *fileName) -{ - strncpy((char *)RECOVERY_FW_NAME, fileName, sizeof(RECOVERY_FW_NAME)); -} - -_THUMB2 void loader_setRecoveryPartitionID(UINT32 partition_id) -{ - g_uiPartitionID = partition_id; -} - -_THUMB2 void loader_setVersion(UINT32 version) -{ - g_uiVersion = version; -} - -_THUMB2 void loader_installSpecialKeyCB(LDR_SPECIAL_KEY_CB callback) -{ - gSpecialKeyCallBack = callback; -} - -_THUMB2 void loader_installCardDetectCB(LDR_CARD_DETECT_CB callback) -{ - gCardDetectCallBack = callback; -} - -_THUMB2 void loader_installRecoveryTriggerCB(LDR_RECOVERY_TRIGGER_CB callback) -{ - gRecoveryTriggerCallBack = callback; -} - -_THUMB2 void loader_installFastbootKeyCB(LDR_FASTBOOT_KEY_CB callback) -{ - gFastbootKeyCallBack = callback; -} - -_THUMB2 void loader_setStorageIntType(STORAGEINT type, PSTORAGE_OBJ strg_obj) -{ - gStorageIntType = type; - int_strg_obj = strg_obj; -} diff --git a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.jack b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.jack deleted file mode 100755 index 9cee3e1ea..000000000 --- a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c.jack +++ /dev/null @@ -1,3221 +0,0 @@ -/* - Main control function - - This file is implement by user mode - - @file bl_func.c - - Copyright Novatek Microelectronics Corp. 2014. All rights reserved. -*/ - -#include "fuart.h" -#include "fat.h" -#include "rtc.h" -#include "timer.h" -#include "StorageDef.h" -#include "global.h" -#include "Clock.h" -#include "bl_func.h" -#include "Cache.h" -#include "string.h" -#include "lz.h" -#include "debug.h" -#include "CC.h" -#include "loader.h" -#include "nvtpack.h" -#include "dram_partition_info.h" -#include "emb_partition_info.h" -#include "modelext_parser.h" -#include "bin_info.h" -#include "shm_info.h" -#include "gic.h" -#include "libfdt.h" -#include -#include "bl_u2.h" -#include "crypto.h" -#include "nand.h" -#include "nor.h" - -//#if (LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) -//static uint32_t global_timer_freq = 3000000; //3MHz = 3000000 Hz -//#endif -PSTORAGE_OBJ int_strg_obj = NULL; - -#define FW_PART1_SIZE_OFFSET (CODE_SECTION_OFFSET + 0x04) //ref to CodeInfo.S on rtos (addr of _section_01_size) -//#define TEE_HEADER_SIZE 0x1C // refer to: optee_header_t - -#define _THUMB2 __attribute__((target("thumb2"))) - -#define bl_memcpy utl_memcpy -#define bl_memset utl_memset -#define ALIGN_FLOOR(value, base) ((value) & ~((base)-1)) -#define ALIGN_CEIL(value, base) ALIGN_FLOOR((value) + ((base)-1), base) -#define SIZE_PRELOAD 0x400 -#define SIZE_PRESERVE_USB 0x2000 - -#define HEADINFO_UBOOT(p_parti) ((HEADINFO *)(p_parti->uboot_addr + BIN_INFO_OFFSET_UBOOT)) -#define HEADINFO_TEEOS(p_parti) ((HEADINFO *)(p_parti->teeos_addr + BIN_INFO_OFFSET_TEEOS)) -#define IS_BIN_OVERLAP(addr1, size1, addr2, size2) (!(((addr1 + size1 - 1) < addr2) || (addr1 > (addr2 + size2 - 1)))) - -#if (STORAGE_EXT_TYPE != STORAGE_EXT_USB) -extern void set_usb_suspend(void); -#endif - -#if (_ROM_PUBLIC_API_ == 1) -#define ROM_LZMA_POSITION 0x7fd0 -UINT8 lzma_temp_buffer[65536]; -int (*rom_lzma_inflate)(UINT8 *in_ptr, UINT32 in_size, UINT8 *out_ptr, UINT32 out_size, UINT8 *p_tmp, UINT32 tmp_size); -#endif - -extern char _loader_exec_compres_start[]; -//extern char _load_nand_table_start_base[]; -extern char _load_LOADER_CONFIGRAM_FREQ_PARAM_end_base[]; -extern void core1_reset(void); - -// Function from Timer.c -//extern UINT32 timer_getLdrElapse(void); - -// Define in MakeConfig.txt -static UINT8 UPDATE_FW_NAME[] = {"FW98520A.BIN"}; -static UINT8 UPDATE_LOADER_NAME[] = {"LD98520A.BIN"}; -static UINT8 RUN_FW_NAME[] = {"FW98520T.BIN"}; -static UINT8 *LOADER_START_STR = {(UINT8 *)"\r\nLoader Start ..."}; -//#if !USB_WRITELOADER -#if (STORAGE_EXT_TYPE != STORAGE_EXT_USB) -//static UINT8 *RUN_WRKEY_NAME = {(UINT8 *)"WRKEY.BIN"}; -#if UPDATE_SIM_CODE -static UINT8 *RUN_WRKEY_NAME = {(UINT8 *)"SIM.BIN"}; -#endif -#endif -static UINT8 RECOVERY_FW_NAME[] = {"FW98520R.BIN"}; -static UINT32 g_uiPartitionID = 2; - -static UINT32 g_uiVersion = 0; - -// Error message -static char FWErrorMsg[] = "\r\nFW check fail\r\n"; -static char RWErrorMsg[] = "\r\nR/W error\r\n"; -static char LoaderErrorMsg[] = "\r\nLoader check fail\r\n"; - -UINT32 TopOfStack; -UINT32 BaseOfStack; - -extern char _loader_heap_base[]; - -static BOOL g_is_flash_open = FALSE; // indicate flash is open for updating non-fully all-in-one bin. - -static LDR_FASTBOOT_KEY_CB gFastbootKeyCallBack = NULL; -static LDR_SPECIAL_KEY_CB gSpecialKeyCallBack = NULL; -static LDR_CARD_DETECT_CB gCardDetectCallBack = NULL; -static STORAGEINT gStorageIntType = STORAGEINT_UNOKNOWN; - -static LDR_RECOVERY_TRIGGER_CB gRecoveryTriggerCallBack = NULL; -//#if (!USB_WRITELOADER) -//#if (STORAGE_EXT_TYPE != STORAGE_EXT_USB) -//static BOOL g_is_recovery_triggered = FALSE; // indicate recovery flow is triggered. -//#endif -_THUMB2 static int bl_is_smp(unsigned char *p_fdt); -static UINT32 g_uiStartBlkUpdateFW = StartNandBlkUpdateFW; -static UINT32 g_uiNandBlkSize = 0; -static UINT32 g_rtos_load_addr = 0; -static UINT32 g_rtos_target_addr = 0; -static UINT32 g_rtos_size = 0; - -#if (FDT_SUPPORT) -#define PATH_MEM_DRAM "/nvt_memory_cfg/dram" -#define PATH_MEM_LOADER "/nvt_memory_cfg/loader" -#define PATH_MEM_UBOOT "/nvt_memory_cfg/uboot" -#define PATH_MEM_FDT "/nvt_memory_cfg/fdt" -#define PATH_MEM_SHMEM "/nvt_memory_cfg/shmem" -#define PATH_MEM_RTOS "/nvt_memory_cfg/rtos" -#define PATH_MEM_NUTTX "/nvt_memory_cfg/nuttx" -#define PATH_MEM_TEEOS "/nvt_memory_cfg/teeos" -#define PATH_MEM_HDAL "/hdal-memory/media" -#define PATH_MEM_CORE2_ENTRY1 "/nvt_memory_cfg/core2entry1" -#define PATH_MEM_CORE2_ENTRY2 "/nvt_memory_cfg/core2entry2" -#define PATH_NVT_INFO "/nvt_info" -#define PATH_NVTPACK_INDEX "nvtpack/index" -#define PATH_PARTITION_LOADER "partition_loader" -#define PATH_PARTITION_FDT "partition_fdt" -#define PATH_PARTITION_UBOOT "partition_uboot" -#define PATH_PARTITION_NUTTX "partition_nuttx" -#define PATH_PARTITION_TEEOS "partition_teeos" -#define PATH_PARTITION_RTOS "partition_rtos" -#define PROPERTY_REG "reg" -#define PROPERTY_LABEL "label" -#define PROPERTY_PARTITION_NAME "partition_name" -#define PROPERTY_NVT_LINUX_SMP "NVT_LINUX_SMP" -static DRAM_PARTITION g_dram_partition = {0}; -static EMB_PARTITION g_emb_uboot = {0}; -static EMB_PARTITION g_emb_teeos = {0}; -static EMB_PARTITION g_emb_rtos = {0}; -#else // NO FDT_SUPPORT -// refer to met-tbl.dtsi /nvt_memory_cfg -static DRAM_PARTITION g_dram_partition = { - .dram_addr = 0x00000000, - .dram_size = 0x20000000, - .rev_addr = 0x00007E00, ///< shmem - .rev_size = 0x00000200, ///< shmem - .loader_addr = 0x01000000, - .loader_size = 0x00800000, - .fdt_addr = 0x01800000, - .fdt_size = 0x00040000, - .uboot_addr = 0x1E000000, - .uboot_size = 0x01FC0000, - .rtos_addr = 0x01840000, ///< optional, only for fast-boot, - .rtos_size = 0x00780000, ///< optional, only for fast-boot - .core2_entry1_addr = 0x00000000, ///< optional, only for dual core IC (fixed here, and must be) - .core2_entry1_size = 0x00004000, ///< optional, only for dual core IC - .core2_entry2_addr = 0x1FFC0000, ///< optional, only for dual core IC (address better in the bottom of dram to avoid memory space overlap) - .core2_entry2_size = 0x00040000, ///< optional, only for dual core IC -}; -// refer to storage-partition.dtsi -static EMB_PARTITION g_emb_uboot = { - .PartitionOffset = 0xC0000, - .PartitionSize = 0xA0000, -}; -static EMB_PARTITION g_emb_rtos = { ///< optional, only for fast-boot, - .PartitionOffset = 0x2B40000, - .PartitionSize = 0xA00000, -}; -static EMB_PARTITION g_emb_teeos = { ///< optional, only for optee, - .PartitionOffset = 0, - .PartitionSize = 0, -}; -//following just for processing all-in-one bin (nvtpack) -//refer to nvtpack.dtsi -#define NVTPACK_IDX_UBOOT 3 -#define NVTPACK_IDX_TEEOS -1 -#define NVTPACK_IDX_RTOS 10 -#endif - - - -#if (UART_UPDATE_ == ENABLE) -static char g_strLength[80]; // buffer to store length string -#endif - -//--------------------------------------------------------------------------- -// Static function -//--------------------------------------------------------------------------- -int bl_boot_uboot(unsigned char *p_fdt); - -/** - Display error message. - - Display error message. - CPU loop forever and LED is red. - - @param Msg: Message to display - @return void -*/ -_THUMB2 static void bl_displayErrMsg(char *Msg) -{ - // Display error message to UART - debug_msg(Msg); - // Loop forever - while (1) { - ; - } -} - - -/** - Invert endianess of input word - - - @param[in] a input word - - @return translated word -*/ -_THUMB2 static UINT32 invertEndian(UINT32 a) -{ - return __builtin_bswap32(a); -} - - -/** - Check FW code. - - Check FW code and file length. - The FW binary file must be post-proecessd by encrypt_bin.exe. - This function must sync to encrypt_bin.exe. - If FW checking is fail, the CPU will loop forever and LED is red. - - @param[in] uiAddress FW code in DRAM starting address - @param[in] uiFileLen FW code length - @return void -*/ -_THUMB2 static void bl_checkFW(UINT32 uiAddress, UINT32 uiFileLen) -{ - NVTPACK_MEM mem = {0}; - mem.p_data = (void *)uiAddress; - mem.len = uiFileLen; - if (nvtpack_calc_nvt_sum(&mem) != 0) { - bl_displayErrMsg(FWErrorMsg); - } -} - -/** - Check boot loader code. - - Check boot loader code. - - @return void -*/ -_THUMB2 static void bl_checkLoader(UINT32 uiAddr, UINT32 uiSize) -{ - UINT16 *puiValue, uiSum; - UINT32 i; - - puiValue = (UINT16 *)uiAddr; - uiSum = 0; - - for (i = 0; i < (uiSize >> 1); i++) { - uiSum += (*puiValue + i); - puiValue++; - } - - if ((*(UINT16 *)(uiAddr + LOADER_TAG_OFFSET) != LOADER_TAG_VALUE) || - (uiSum != 0)) { - bl_displayErrMsg(LoaderErrorMsg); - } -} -#if (SECURE_DECRYPT_UBOOT || SECURE_DECRYPT_OPTEE_OS) - - -_THUMB2 static void get_bininfo_size_offset(unsigned char* bininfo,unsigned int* size,unsigned int *offset) -{ - /****this headinfo is for encrypt header - BinInfo will set partition offset and size - BinInfo_1[0~3] public key offset - BinInfo_1[4~7] public key length - BinInfo_2[0~3] signature offset - BinInfo_2[4~7] signature length - BinInfo_3[0~3] encrypted offset - BinInfo_3[4~7] encrypted size - BinLength total bin size - Checksum total bin checksum - others parameters set 0 - */ - *size = bininfo[4] | bininfo[5]<<8 | bininfo[6] << 16 | bininfo[7] << 24; - *offset = bininfo[0] | bininfo[1] << 8 | bininfo[2] << 16 | bininfo[3] <<24; -} - - - - -_THUMB2 static int decrypt_aes_cbc(unsigned int input, unsigned int output, unsigned int len) -{ - - CRYPT_OP crypt_op_param; - if(len &0x0f) - { - debug_msg_var("enc size", len); - debug_err("not align 16\r\n"); - return -21; - } - if((input & 0x03) || (output & 0x03) || (len & 0x03) ){ //check word alignment - //debug_msg_var("input", input); - //debug_msg_var("output", output); - //debug_msg_var("len", len); - //debug_err("not word align\r\n"); - return -22; - } - crypt_op_param.op_mode = CRYPTO_CBC; - crypt_op_param.en_de_crypt = CRYPTO_DECRYPT; - crypt_op_param.src_addr = input; - crypt_op_param.dst_addr = output; - crypt_op_param.length = len; //Need align to 16bytes align - //debug_msg_var("src",(unsigned int)crypt_op_param.src_addr); - //debug_msg_var("dst",(unsigned int)crypt_op_param.dst_addr); - - #if 0 - debug_msg_var("input",input); - debug_msg_var("output",output); - debug_msg_var("len",len); - unsigned char *tmp = (unsigned char *) crypt_op_param.src_addr; - int i=0; - debug_msg_var("encryped buf addr",(unsigned int)tmp); - for(i=0;i<16;i++){ - debug_msg_var("encryped buf",(unsigned int)tmp[i]); - } - #endif - if(crypto_data_operation(EFUSE_OTP_1ST_KEY_SET_FIELD, crypt_op_param) != 0) - { - //debug_err("aes dec fail\r\n"); - return -23; - } - #if 0 - unsigned char *tmp = (unsigned char *) crypt_op_param.src_addr; - int i=0; - tmp = (unsigned char *) crypt_op_param.dst_addr; - debug_msg_var("decryped addr",(unsigned int)&tmp[0]); - for(i=0;i<16;i++){ - debug_msg_var("decryped buf",(unsigned int)tmp[i]); - } - - #endif - return 0; - -} -#if (SECURE_SIGNATURE_BY_AES == 0) -_THUMB2 static void data_reverse(unsigned char* input_data, unsigned int size) -{ - unsigned int i=0; - unsigned char tmp=0; - for(i=0;i< (size/2);i++) - { - tmp = input_data[size - 1 - i]; - input_data[size - 1 - i] = input_data[i]; - input_data[i] = tmp; - } - -} -#endif -_THUMB2 static int do_decrypt_aes(unsigned int input_data, unsigned int output_data, unsigned int* output_size,unsigned int partition_size) -{ - - unsigned int encrypt_offset =0; - unsigned int encrypt_size =0; - unsigned int data_size = 0; - HEADINFO *p_headinfo = (HEADINFO *)input_data; - int er=0; - get_bininfo_size_offset((unsigned char *)p_headinfo->BinInfo_3, &encrypt_size, &encrypt_offset); - data_size = p_headinfo->BinLength - encrypt_offset; -#if 1 //for signature check - unsigned int signature_offset =0; - unsigned int signature_size = 0; - UINT32 hash_buf[8]; - unsigned int sha256_align_size =0; - UINT32 * signature_buff = NULL; - get_bininfo_size_offset((unsigned char *)p_headinfo->BinInfo_2, &signature_size, &signature_offset); - #if (SECURE_SIGNATURE_BY_AES == 0) - unsigned int key_offset =0; - unsigned int key_size =0; - unsigned int n_size=0; - unsigned int e_size=0; - UINT32 sign_rsa_output[64]; - UINT32 *key_n = NULL; - UINT32 *key_e = NULL; - UINT32 *signature_addr = NULL; - get_bininfo_size_offset((unsigned char *)p_headinfo->BinInfo_1, &key_size, &key_offset); - n_size = signature_size;// if rsa 2048 , signature_size should be 256 bytes - e_size = key_size - n_size; - key_n = (UINT32 *)(input_data + key_offset); - // now only support rsa 2048 - key_e = (UINT32 *)(input_data + key_offset + signature_size); // signature_size should be 256 bytes, n key should be 256 - data_reverse((unsigned char *)(key_n),n_size); - data_reverse((unsigned char *)(key_e),e_size); - - er = rsa_keycheck(key_n, 1);// check rsa n key in efuse 1 and 2 field, 0 field for aes key - if(er == 0) - { - debug_err("key fail\r\n"); - return -20; - } - signature_addr = (UINT32 *)(input_data + signature_offset); - data_reverse((unsigned char *)signature_addr, signature_size); - - //decrypt signature - rsa_decrypt(signature_addr, signature_size, key_n, n_size, key_e, e_size,sign_rsa_output); - - data_reverse((unsigned char *)sign_rsa_output, signature_size); - - //remove pending data 0, the last 32 bytes will be signature data - signature_buff = (UINT32 *)&sign_rsa_output[(sizeof(sign_rsa_output)/4 ) - (32/4 )];// offset need devided by 4, because of UINT32 type - #else - //UINT32 sign_aes_output[8]; - - er = decrypt_aes_cbc((UINT32 )(input_data + signature_offset), output_data,signature_size); - if(er != 0) - { - debug_err("decrypt_aes_cbc fail\r\n"); - return -20; - } - signature_buff =(UINT32 *)output_data; - - #endif - //hash encrypt data - - if((data_size & 0x3f) != 0) - { - // hardware sha256 need align 64, need set pending 0 - sha256_align_size = ((data_size/0x40) + 1)*0x40; - bl_memset((unsigned char *)(input_data + encrypt_offset + data_size),0, sha256_align_size - data_size); - } - else - { - sha256_align_size = data_size; - } - - shahw((unsigned char *)(input_data + encrypt_offset), sha256_align_size, hash_buf); - - - //compare signature and current hash - if(memcmp((void *)hash_buf, (void *)signature_buff, sizeof(hash_buf)) != 0) - { - debug_err("sig fail\r\n"); - return -20; - } -#endif - - //decrypt data - //dma addr should 4 alignment, input_data address is 4 alignment - if((input_data + encrypt_offset) & 0x03) - { - utl_memcpy((void *)input_data,(unsigned char*)(input_data + encrypt_offset), data_size); - er = decrypt_aes_cbc(input_data, output_data, encrypt_size); - } - else - { - er = decrypt_aes_cbc(input_data + encrypt_offset, output_data, encrypt_size); - } - if(er != 0) - { - debug_err("aes fail\r\n"); - return er; - } - - *output_size = data_size; - - //add plaintext data to output buf--> aes should 16 alignment, if data not alignment, the last bytes we will not encrypt data - int plaintext_size = data_size - encrypt_size; - unsigned char *p_output = (unsigned char *)output_data; - if( plaintext_size > 0) - { - utl_memcpy(&p_output[encrypt_size], (unsigned char*)(input_data + encrypt_offset+ encrypt_size),plaintext_size); - } - return 0; - -} -#endif - -//#NT#2013/04/25#Steven Wang -begin -//#NT#Show Duty calibration log -#if (_LOADER_DUTY_CALIBRATION_ == ENABLE && _LOADER_DUTY_CALIBRATION_LOG_ == ENABLE) -void BL_showROMLog(UINT32 buffer) -{ - UINT32 value; - UINT32 index; - UINT32 P_duty; - UINT32 N_duty; - UINT32 diff; - - index = 0; - diff = 0; - P_duty = 0; - N_duty = 0; - uart_putSystemUARTStr("\r\n"); - while (1) { - value = INREG32(buffer + index); - - if ((value & 0xF0000000) == 0xF0000000) { - value &= ~(0x40000000); - uart_putSystemUARTStr(Dec2HexStr(value)); - uart_putSystemUARTStr(" = "); - } - - else if ((value & 0xF0000000) == 0x50000000) { - uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr("\r\n"); - } - - else if ((value & 0xF0000000) == 0x20000000) { -// uart_putSystemUARTStr("P_duty = "); - P_duty = value & 0xFFFFFFF; - //uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr(Dec2HexStr(P_duty)); - uart_putSystemUARTStr("\r\n"); - } - - else if ((value & 0xF0000000) == 0x30000000) { -// uart_putSystemUARTStr("N_duty = "); - N_duty = value & 0xFFFFFFF; - //uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr(Dec2HexStr(N_duty)); - uart_putSystemUARTStr("\r\n"); - if (P_duty > N_duty) { - if (diff == 2) { - uart_putSystemUARTStr("============\r\n"); - P_duty = 0; - N_duty = 0; - diff = 0; -// diff = 3; - } else { - diff = 1; - } - } else { - if (diff == 1) { - uart_putSystemUARTStr("============\r\n"); - P_duty = 0; - N_duty = 0; - diff = 0; -// diff = 3; - } else { - diff = 2; - } - } - } else if ((value & 0xF0000000) == 0x60000000) { - uart_putSystemUARTStr("N+P = "); - uart_putSystemUARTStr(Dec2HexStr(value & 0xFFFFFFF)); - uart_putSystemUARTStr("\r\n"); - } else if ((value & 0xF0000000) == 0x70000000) { - if ((value & 0xFFFFFFF) == 0x0654321) { - break; - } - } else { - uart_putSystemUARTStr("Unknow \r\n"); - } - index += 4; - } - uart_putSystemUARTStr("\r\n[0xC0001000] = 0x"); - uart_putSystemUARTStr(Dec2HexStr(INREG32(0xC0001000))); - uart_putSystemUARTStr(" [0xC000101C] = 0x"); - uart_putSystemUARTStr(Dec2HexStr(INREG32(0xC000101C))); - uart_putSystemUARTStr("\r\n"); -} -#endif -//#NT#2013/04/25#Steven Wang -end - - -#if (DRAM_RANGE_SCAN_EN == ENABLE) -/** - Check Sram code. - - Check is dram scan code or not - - @param[in] uiAddress Scan FW code in DRAM starting address - @return void -*/ -static BOOL bl_checkDramScanFW(UINT32 uiAddress) -{ - if ((*(UINT32 *)uiAddress & SRAM_TAG) == SRAM_TAG) { - return TRUE; - } else { - return FALSE; - } -} -#endif - -#if 0 -static BOOL bl_spiIdentify(UINT32 uiMfgID, UINT32 uiTypeID, UINT32 uiCapacityID, PSPI_IDENTIFY pIdentify) -{ - // Sample to support SST25VF032 - if ((uiMfgID == 0xBF) && - (uiCapacityID == 0x4A)) { - pIdentify->bDualRead = FALSE; - pIdentify->bSupportAAI = TRUE; - pIdentify->bSupportEWSR = TRUE; - pIdentify->uiFlashSize = 4 * 1024 * 1024; - return TRUE; - } - - return FALSE; -} -#endif - -/* - Update multi-binary image - - - @param[in] uiFwBuf buffer store fw read from card - - @return - -@ b TRUE: success - -@ b FALSE: fail -*/ - -#if !REMOVED_FLASH -#if 0 -static void bl_interrupt_init(void) -{ - debug_msg("arm_gic_distif_setup\r\n"); - arm_gic_distif_setup(); - debug_msg("arm_gic_cpuif_setup\r\n"); - arm_gic_cpuif_setup(); - - // - //debug_dump_addr(0xF1500000+0x1000,0x500); - //debug_dump_addr(0xF1500000+0x2000,0x100); -} -#endif - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) -#define OUTW(addr,value) (*(UINT32 volatile *)(addr) = (UINT32)(value)) -#define INW(addr) (*(UINT32 volatile *)(addr)) - - -static void bl_cpu_timer_init(UINT32 value) -{ - UINT32 dwVal; - OUTW(configARM_TIMER_BASEADDR + ARM_TIMER_LOAD_OFFSET, value); - - dwVal = INW(configARM_TIMER_BASEADDR + ARM_TIMER_CONTROL_OFFSET); - /* Enable Auto reload mode. */ - dwVal |= ARM_TIMER_CONTROL_AUTO_RELOAD_MASK; - /* Clear prescaler control bits */ - dwVal &= ~ARM_TIMER_CONTROL_PRESCALER_MASK; - /* Set prescaler value */ - dwVal |= ((CYGHWR_HAL_RTC_PRESCALER - 1) << ARM_TIMER_CONTROL_PRESCALER_SHIFT); - /* Enable the decrementer */ - //dwVal |= ARM_TIMER_CONTROL_ENABLE_MASK; - /* Enable the interrupt */ - dwVal |= ARM_TIMER_CONTROL_IRQ_ENABLE_MASK; - - OUTW(configARM_TIMER_BASEADDR + ARM_TIMER_CONTROL_OFFSET, dwVal); - - OUTW(configARM_TIMER_BASEADDR + ARM_TIMER_ISR_OFFSET, - ARM_TIMER_ISR_EVENT_FLAG_MASK); - -} -#endif -#endif -_THUMB2 int bl_flash_open(void) -{ - int er; - //UINT32 uiStorageVersion = (UINT32)&_load_nand_table_start_base; - - if (g_is_flash_open) { - return 0; - } - //========================================================================== - //= User define SPI-NAND id table sample code = - //= You can remove // to use it = - //========================================================================== - //int_strg_obj->flash_setConfig(FLASH_CFG_ID_SPI_IDENTIFY_CB, (UINT32)nand_identify); - - //========================================================================== - //= User define SPI-NOR id table sample code = - //= You can remove // to use it = - //========================================================================== - //int_strg_obj->flash_installIdentifyCB(nor_identify); - - er = int_strg_obj->flash_open(); - if (er < 0) { - debug_err("flash open fail\r\n"); - return -1; - } - - //OUTREG32(NAND_TABLE_VERSION_ADDR, INREG32(uiStorageVersion)); - - //if (er == E_OK) { - // OUTREG32(NAND_TABLE_FLAG_ADDR, 0x46495053); //'S''P''I''F' - //} else { // E_OK_TABLE_FOUND(1) or E_OK_TABLE_NOT_FOUND(2) - // OUTREG32(NAND_TABLE_FLAG_ADDR, er); - //} - g_uiNandBlkSize = int_strg_obj->flash_getBlockSize(); - if (g_uiNandBlkSize == 0x10000) { - debug_msg("SPI NOR\r\n"); - g_uiStartBlkUpdateFW = 1; - } else if (g_uiNandBlkSize == EMMC_BLOCK_SIZE) { - debug_msg("EMMC\r\n"); - g_uiStartBlkUpdateFW = FDT_OFFSET / EMMC_BLOCK_SIZE; - } else { - g_uiStartBlkUpdateFW = StartNandBlkUpdateFW; - } - - g_is_flash_open = TRUE; - return 0; -} - -#if 0 //[-Werror=unused-function] -static int bl_flash_close(void) -{ - if (!g_is_flash_open) { - return 0; - } - - flash_close(); - g_is_flash_open = FALSE; - return 0; -} -#endif - -#if (FDT_SUPPORT) -_THUMB2 static const void *bl_get_fdt_property(const void *p_dtb, const char *p_path, const char *p_property, int *len) -{ - int nodeoffset; /* next node offset from libfdt */ - const void *nodep; /* property node pointer */ - - nodeoffset = fdt_path_offset(p_dtb, p_path); - if (nodeoffset < 0) { - return NULL; - } - nodep = fdt_getprop(p_dtb, nodeoffset, p_property, len); - if (len == 0) { - return NULL; - } - return nodep; -} - -_THUMB2 static const void *bl_get_fdt_nvt_memory_cfg_property(const void *p_dtb, const char *p_path, const char *p_property, int *len) -{ - static int nodeoffset_nvt_memory_cfg = -FDT_ERR_NOTFOUND;; /* next node offset from libfdt */ - - int nodeoffset; - const void *nodep; /* property node pointer */ - - if (strncmp(p_path, "/nvt_memory_cfg/", 3) != 0) { - debug_err("path prefix must be /nvt_memory_cfg/\r\n"); - return NULL; - } - - if (nodeoffset_nvt_memory_cfg == -FDT_ERR_NOTFOUND) { - nodeoffset_nvt_memory_cfg = fdt_path_offset(p_dtb, "/nvt_memory_cfg"); - } - - nodeoffset = fdt_subnode_offset(p_dtb, nodeoffset_nvt_memory_cfg, &p_path[16]); - if (nodeoffset < 0) { - return NULL; - } - nodep = fdt_getprop(p_dtb, nodeoffset, p_property, len); - if (len == 0) { - return NULL; - } - return nodep; -} -#endif - - -_THUMB2 static unsigned char *bl_get_fdt_cfg(const void *p_dtb, MODELEXT_TYPE type) -{ -#if (FDT_SUPPORT) - int len; - const int *nodep; - - UINT8 *p_rt = NULL; - - switch (type) { - case MODELEXT_TYPE_DRAM_PARTITION: - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_DRAM, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get dram fail\r\n"); - return NULL; - } - g_dram_partition.dram_addr = be32_to_cpu(nodep[0]); - g_dram_partition.dram_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_LOADER, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get loader fail\r\n"); - return NULL; - } - g_dram_partition.loader_addr = be32_to_cpu(nodep[0]); - g_dram_partition.loader_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_UBOOT, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get uboot fail\r\n"); - return NULL; - } - g_dram_partition.uboot_addr = be32_to_cpu(nodep[0]); - g_dram_partition.uboot_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_FDT, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get fdt fail\r\n"); - return NULL; - } - g_dram_partition.fdt_addr = be32_to_cpu(nodep[0]); - g_dram_partition.fdt_size = be32_to_cpu(nodep[1]); - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_RTOS, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.rtos_addr = be32_to_cpu(nodep[0]); - g_dram_partition.rtos_size = be32_to_cpu(nodep[1]); - } - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_NUTTX, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.nuttx_addr = be32_to_cpu(nodep[0]); - g_dram_partition.nuttx_size = be32_to_cpu(nodep[1]); - } - - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_TEEOS, PROPERTY_REG, &len); - if (nodep != NULL) { - g_dram_partition.teeos_addr = be32_to_cpu(nodep[0]); - g_dram_partition.teeos_size = be32_to_cpu(nodep[1]); - } - - p_rt = (UINT8 *)&g_dram_partition; - break; - - case MODELEXT_TYPE_BIN_INFO: - nodep = (const int *)bl_get_fdt_nvt_memory_cfg_property(p_dtb, PATH_MEM_SHMEM, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("dtb get shmem fail\r\n"); - return NULL; - } - - if (sizeof(SHMINFO) > be32_to_cpu(nodep[1])) { - debug_err("shmem size mismatch\r\n"); - return NULL; - } - - p_rt = (UINT8 *)be32_to_cpu(nodep[0]); - break; - - default: - debug_err_var("not handle type\r\n", type); - return NULL; - } - return p_rt; -#else // NO FDT_SUPPORT - switch (type) { - case MODELEXT_TYPE_DRAM_PARTITION: - return (UINT8 *)&g_dram_partition; - case MODELEXT_TYPE_BIN_INFO: - return (UINT8 *)g_dram_partition.rev_addr; - default: - return NULL; - } -#endif -} - -_THUMB2 int bl_chk_valid_all_in_one(NVTPACK_MEM *p_mem_all_in_one) -{ - NVTPACK_ER er; - NVTPACK_VER ver; - - er = nvtpack_getver(p_mem_all_in_one, &ver); - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - - if (ver == NVTPACK_VER_16072017) { - return 0; - } - - return -1; -} - - -#if !REMOVED_FLASH -_THUMB2 int bl_chk_fdt(unsigned int addr, unsigned int size) -{ - DRAM_PARTITION *p_dram_partition = NULL; - - if (fdt_check_full((void *)addr, size) != 0) { - debug_err("invalid dtb\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)addr, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("invalid dram_partition\r\n"); - return -1; - } - - // check tmp memory (file load) cannot overlap with uboot and teeos - // we allow to overlap with linux, root-fs because uboot will reload bin file later - debug_msg_var("tmp_addr", SDRAM_Start_FW); - -// if ((addr < p_dram_partition->uboot_addr && addr + size > p_dram_partition->uboot_addr) || -// (addr > p_dram_partition->uboot_addr && addr + size < p_dram_partition->uboot_addr + p_dram_partition->uboot_size)) { - if (IS_BIN_OVERLAP(addr, size, p_dram_partition->uboot_addr, p_dram_partition->uboot_size)) { - debug_err_var("a", addr); - debug_err_var("s", size); - debug_err("uboot olp\r\n"); - return -1; - } -#if 1 - //if ((addr < p_dram_partition->teeos_addr && addr + size > p_dram_partition->teeos_addr) || - // (addr > p_dram_partition->teeos_addr && addr + size < p_dram_partition->teeos_addr + p_dram_partition->teeos_size)) { - if (p_dram_partition->teeos_size) { - if (IS_BIN_OVERLAP(addr, size, p_dram_partition->teeos_addr, p_dram_partition->teeos_size)) { - debug_err_var("a", addr); - debug_err_var("s", size); - debug_err("teeos olp\r\n"); - return -1; - } - } -#endif - // check if memory size matched real size - UINT32 ld_dram1_size = dma_get_dram_capacity(DMA_ID_1); - if (p_dram_partition->dram_size > ld_dram1_size) { - debug_err_var("fw_d1_s", p_dram_partition->dram_size); - debug_err_var("ld_d1_s", ld_dram1_size); - debug_err("d1 s not matched.\r\n"); - return -1; - } - return 0; -} -#endif - -#if !REMOVED_FLASH -_THUMB2 int bl_chk_uboot(unsigned int addr, unsigned int size) -{ -#if (_FPGA_EMULATION_ == 0) - NVTPACK_MEM mem = {0}; - mem.p_data = (void *)addr; - mem.len = size; - if (nvtpack_calc_nvt_sum(&mem) != 0) { - debug_err("uboot check sum fail"); - return -1; - } -#endif - return 0; -} - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) -static void bl_core2_reset(void) -{ - UINT32 core_reg; - - debug_msg("core2_reset\r\n"); - - core_reg = *(volatile UINT32 *)0xF0E400F0; - core_reg &= ~(1<<3); - core_reg &= ~(1<<11); - *(volatile UINT32 *)0xF0E400F0 = core_reg; - core_reg |= (1<<2)|(1<<10) | (1<<21); - core_reg |= (1<<17); - *(volatile UINT32 *)0xF0E400F0 = core_reg; -} - -static void bl_core2_prepare(DRAM_PARTITION *p_dram_partition, unsigned int last_addr) -{ - extern char _load_core2_jump_program_start_base[]; - extern char _load_core2_jump_program_end_base[]; - extern char _load_core2_entry_program_start_base[]; - extern char _load_core2_entry_program_end_base[]; - UINT32 code2JumpCodelen, code2EntryCodelen; - - //check core2_entry1 must at addr 0 - if (p_dram_partition->core2_entry1_addr != CORE2_JUMP_ADDR) { - bl_displayErrMsg("core2entry1 != 0"); - } - - // copy core2 jump code to dram 0x0 - code2JumpCodelen = _load_core2_jump_program_end_base - _load_core2_jump_program_start_base; - utl_memcpy((void *)p_dram_partition->core2_entry1_addr, _load_core2_jump_program_start_base, code2JumpCodelen); -// CPUflushWriteCache(p_dram_partition->core2_entry1_addr, code2JumpCodelen); - - debug_msg_var("core2_jump_program", (int)_load_core2_jump_program_start_base); - debug_msg_var("code2JumpCodelen", (int)code2JumpCodelen); - debug_msg_var("core2_entry2_addr", (int)p_dram_partition->core2_entry2_addr); - - // copy core2 entry code to dram specified by fdt - *(volatile UINT32 *)(NVT_CORE2_START) = p_dram_partition->core2_entry2_addr; - code2EntryCodelen = _load_core2_entry_program_end_base - _load_core2_entry_program_start_base; - utl_memcpy((void *)p_dram_partition->core2_entry2_addr, _load_core2_entry_program_start_base, code2EntryCodelen); -// CPUflushWriteCache(p_dram_partition->core2_entry2_addr, code2EntryCodelen); - - debug_msg_var("core2_entry_program", (int)_load_core2_entry_program_start_base); - debug_msg_var("code2EntryCodelen", (int)code2EntryCodelen); - - *(volatile UINT32 *)0xF07F8000 = last_addr; - - debug_msg_var("0xF07F8000=", (int)*(volatile UINT32 *)0xF07F8000); -} - -static int bl_smp_start(unsigned char *p_modelext, UINT32 uboot_entry) -{ - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_modelext, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_modelext, MODELEXT_TYPE_DRAM_PARTITION); - if (p_bininfo == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - debug_msg_var("fdt", (UINT32)p_modelext); - debug_msg_var("shm", (UINT32)p_bininfo); - - p_bininfo->boot.fdt_addr = (UINT32)p_modelext; - debug_msg_var("p_bininfo->boot.fdt_addr", p_bininfo->boot.fdt_addr); - utl_memset(p_bininfo->boot.LdInfo_1, 0, sizeof(p_bininfo->boot.LdInfo_1)); - utl_memcpy(p_bininfo->boot.LdInfo_1, "LD_NVT", 6); - // clear cc_core1_addr, cc_core2_addr -#if USB_WRITELOADER - if(utl_get_bootsrc() == BOOT_SOURCE_UART) { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_UART; - } else if(USB_WRITELOADER || utl_get_bootsrc() == BOOT_SOURCE_USB) { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_USB; - } else { - p_bininfo->comm.Resv[0] = BOOT_REASON_NORMAL; - } -#else -// if (card_get_type() == EXT_STORAGE_TYPE_ETH) -// p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_ETH; -// else if (g_is_recovery_triggered) -// p_bininfo->comm.Resv[0] = BOOT_REASON_RECOVERY_SYS; -// else -#if (STORAGE_EXT_TYPE == STORAGE_EXT_ETH) - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_ETH; -#else - p_bininfo->comm.Resv[0] = BOOT_REASON_NORMAL; -#endif -#endif - p_bininfo->comm.Resv[1] = 0; // COMM_CORE1_START - p_bininfo->comm.Resv[2] = 0; // COMM_CORE2_START - p_bininfo->comm.Resv[3] = 0; // COMM_UITRON_COMP_ADDR - p_bininfo->comm.Resv[4] = 0; // COMM_UITRON_COMP_LEN - - debug_msg("smp(no tee)\r\n"); - - bl_core2_prepare(p_dram_partition, 0); - -//#if USB_WRITELOADER -#if 0 - USBStateMachine(); - uart_putSystemUARTStr("USB update Done\n\r"); - timer_delay(1000000); - USBOTGReset(); -#endif - - - - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - CPUInvalidateICacheAll(); - - //reset core2 - bl_core2_reset(); - - { - typedef void (*BRANCH_CB)(void); - BRANCH_CB p_func = (BRANCH_CB)uboot_entry; - debug_msg_var("jump", uboot_entry); - p_func(); - } - - return 0; -} -#endif -_THUMB2 static int bl_entry_boot(unsigned char *p_fdt, UINT32 uboot_entry) -{ - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - - debug_msg_var("fdt", (UINT32)p_fdt); - debug_msg_var("shm", (UINT32)p_bininfo); - - p_bininfo->boot.fdt_addr = (UINT32)p_fdt; - utl_memset(p_bininfo->boot.LdInfo_1, 0, sizeof(p_bininfo->boot.LdInfo_1)); - utl_memcpy(p_bininfo->boot.LdInfo_1, "LD_NVT", 6); - // clear cc_core1_addr, cc_core2_addr -#if USB_WRITELOADER - CPUflushWriteCache((UINT32)p_bininfo, sizeof(BININFO)); - if(utl_get_bootsrc() == BOOT_SOURCE_USB) { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_USB; - } else { - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_UART; - } -#else - if (card_get_type() == EXT_STORAGE_TYPE_ETH) - p_bininfo->comm.Resv[0] = BOOT_REASON_FROM_ETH; - // else if (g_is_recovery_triggered) - // p_bininfo->comm.Resv[0] = BOOT_REASON_RECOVERY_SYS; - else - p_bininfo->comm.Resv[0] = BOOT_REASON_NORMAL; -#endif - p_bininfo->comm.Resv[1] = 0; // COMM_CORE1_START - p_bininfo->comm.Resv[2] = 0; // COMM_CORE2_START - p_bininfo->comm.Resv[3] = 0; // COMM_UITRON_COMP_ADDR - p_bininfo->comm.Resv[4] = 0; // COMM_UITRON_COMP_LEN - - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - CPUInvalidateICacheAll(); - - { - typedef void (*BRANCH_CB)(void); - BRANCH_CB p_func = (BRANCH_CB)uboot_entry; - debug_msg_var("jump", uboot_entry); - p_func(); - } - - return 0; -} - -_THUMB2 int bl_copy_fdt_to_fdt_addr(unsigned char *p_fdt /*IN*/, unsigned char **pp_fdt /*OUT*/) -{ - DRAM_PARTITION *p_dram_partition; - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("bl_copy_fdt_to_fdt_addr failed.\r\n"); - return -1; - } - - // load fdt to fdt buffer - utl_memcpy((void *)p_dram_partition->fdt_addr, p_fdt, fdt_totalsize(p_fdt)); - *pp_fdt = (unsigned char *)p_dram_partition->fdt_addr; - - //reset shminfo - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - bl_memset(p_bininfo, 0, sizeof(SHMINFO)); - return 0; -} - -_THUMB2 static int bl_load_fdt_from_all_in_one(unsigned char *p_all_in_one, unsigned int all_in_one_size, unsigned char **pp_fdt /*OUT*/) -{ - NVTPACK_ER er; - NVTPACK_MEM emb_fdt; - NVTPACK_VERIFY_OUTPUT np_verify = {0}; - NVTPACK_GET_PARTITION_INPUT np_get_input; - NVTPACK_MEM mem_in = {(void *)p_all_in_one, (unsigned int)all_in_one_size}; - - if (nvtpack_verify(&mem_in, &np_verify) != NVTPACK_ER_SUCCESS) { - debug_err("packbin verify failed.\r\n"); - return -1; - } - - np_get_input.id = 1; // fdt must always put in partition[1] - np_get_input.mem = mem_in; - er = nvtpack_get_partition(&np_get_input, &emb_fdt); - - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } else if (er == NVTPACK_ER_SUCCESS) { - debug_msg_var("fdt addr", (int)emb_fdt.p_data); - debug_msg_var("fdt size", (int)emb_fdt.len); - if (bl_chk_fdt((unsigned int)emb_fdt.p_data, emb_fdt.len) == 0) { - return bl_copy_fdt_to_fdt_addr(emb_fdt.p_data, pp_fdt); - } - } - return -1; -} - -_THUMB2 static unsigned int bl_load_rtos_from_all_in_one(unsigned char *p_all_in_one, unsigned int all_in_one_size, unsigned char **pp_fdt /*OUT*/) -{ - UINT32 uItron_fw_addr= 0; - NVTPACK_ER er; - NVTPACK_MEM emb_fdt; - NVTPACK_VERIFY_OUTPUT np_verify = {0}; - NVTPACK_GET_PARTITION_INPUT np_get_input; - NVTPACK_MEM mem_in = {(void *)p_all_in_one, (unsigned int)all_in_one_size}; - HEADINFO *p_headinfo; - - if (nvtpack_verify(&mem_in, &np_verify) != NVTPACK_ER_SUCCESS) { - debug_err("packbin verify failed.\r\n"); - return 0; - } - - np_get_input.id = 5; // rtos must always put in partition[5] for now - np_get_input.mem = mem_in; - er = nvtpack_get_partition(&np_get_input, &emb_fdt);//&np_get_input, &emb_fdt); - - if (er == NVTPACK_ER_NOT_FOUND) { - return 0; - } else if (er == NVTPACK_ER_SUCCESS) { - debug_msg("get rtos partition ok\r\n"); - - p_headinfo = (HEADINFO *)(emb_fdt.p_data + BIN_INFO_OFFSET_RTOS); - uItron_fw_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - - utl_memcpy((void *)uItron_fw_addr, emb_fdt.p_data, emb_fdt.len); - CPUflushWriteCache(uItron_fw_addr, emb_fdt.len); - } - debug_msg_var("uItron_fw_addr=", uItron_fw_addr); - return uItron_fw_addr; -} - -_THUMB2 static int bl_load_fdt_from_flash(unsigned char *p_tmp, unsigned int tmp_size, unsigned char **pp_fdt /*OUT*/) -{ - - // read first block to get dtb size - int blk_size = (int)int_strg_obj->flash_getBlockSize(); - int er = int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW, blk_size, p_tmp, NAND_RW_FIRMWARE); - if (er < 0) { - debug_err("bl_load_fdt_from_flash"); - return -1; - } - - int total_size = ALIGN_CEIL(fdt_totalsize(p_tmp), blk_size); - if ((int)tmp_size < total_size) { - debug_err_var("tmp_size too small, require:", fdt_totalsize(p_tmp)); - return -1; - } - - total_size -= blk_size; - if (total_size > 0) { - // read remain to get uboot starting addr on dram and offset in flash - er = int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW+1, total_size, p_tmp+blk_size, NAND_RW_FIRMWARE); - if (er < 0) { - debug_err("bl_load_fdt_from_flash"); - return -1; - } - } - - if (bl_chk_fdt((unsigned int)p_tmp, fdt_totalsize(p_tmp)) == 0) { - return bl_copy_fdt_to_fdt_addr(p_tmp, pp_fdt); - } - - return -1; -} - -#if (FDT_SUPPORT) -_THUMB2 static int bl_get_partition_fdt_offset(unsigned char *p_fdt) -{ - static int nodeoffset= -FDT_ERR_NOTFOUND; - - if (nodeoffset > 0) { - return nodeoffset; - } - - const static char *p_names[3] = { - "/nand", - "/nor", - "/mmc@f0510000" - }; - - const char *name = NULL; - switch(gStorageIntType) { - case STORAGEINT_SPI_NAND: - name = p_names[0]; - break; - case STORAGEINT_SPI_NOR: - name = p_names[1]; - break; - case STORAGEINT_EMMC: - name = p_names[2]; - break; - default: - debug_err("loader_setStorageIntType needs.\r\n"); - return NULL; - } - - nodeoffset = fdt_path_offset(p_fdt, name); - - if (nodeoffset < 0) { - debug_err("E:bl_get_partition_name\r\n"); - } - return nodeoffset; -} -#endif - -#if (FDT_SUPPORT) -_THUMB2 static const void *bl_get_fdt_partition_property(const void *p_dtb, const char *p_path, const char *p_property, int *len) -{ - int nodeoffset_partition = bl_get_partition_fdt_offset((unsigned char *)p_dtb); - - int nodeoffset; - const void *nodep; /* property node pointer */ - - if (nodeoffset_partition < 0) { - debug_err("nodeoffset_partition invalid \r\n"); - return NULL; - } - - nodeoffset = fdt_subnode_offset(p_dtb, nodeoffset_partition, p_path); - if (nodeoffset < 0) { - return NULL; - } - nodep = fdt_getprop(p_dtb, nodeoffset, p_property, len); - if (len == 0) { - return NULL; - } - return nodep; -} -#endif - -#if (FDT_SUPPORT) -_THUMB2 static int bl_get_partition(unsigned char *p_fdt /*IN*/, char *p_emb_name /*IN*/, EMB_PARTITION *p_emb/*OUT*/, int *p_id) -{ - int len; - const unsigned long long *nodep; - - // get partition offset and size - nodep = (const unsigned long long *)bl_get_fdt_partition_property(p_fdt, p_emb_name, PROPERTY_REG, &len); - if (nodep == NULL) { - debug_err("bl_get_partition-1\r\n"); - return -1; - } - - p_emb->PartitionOffset = be64_to_cpu(nodep[0]); - p_emb->PartitionSize = be64_to_cpu(nodep[1]); - - // get partition label - char *p_label_name = (char *)bl_get_fdt_partition_property(p_fdt, p_emb_name, PROPERTY_LABEL, &len); - if (p_label_name == NULL) { - debug_err("bl_get_partition-2\r\n"); - return -1; - } - - // get id - int nodeoffset_partition = bl_get_partition_fdt_offset(p_fdt); - int nodeoffset = fdt_subnode_offset(p_fdt, nodeoffset_partition, "nvtpack"); - nodeoffset = fdt_subnode_offset(p_fdt, nodeoffset, "index"); - - for (nodeoffset = fdt_first_subnode(p_fdt, nodeoffset); - (nodeoffset >= 0); - (nodeoffset = fdt_next_subnode(p_fdt, nodeoffset))) { - const struct fdt_property *prop; - - if (!(prop = fdt_get_property(p_fdt, nodeoffset, PROPERTY_PARTITION_NAME, &len))) { - break; - } - const char *p_id_name = fdt_get_name(p_fdt, nodeoffset, &len); - - if (strcmp(p_label_name, (char *)prop->data) == 0) { - *p_id = atoi(p_id_name + strlen("id")); - return 0; - } - } - - return -1; -} -#endif - -_THUMB2 static void *bl_get_uboot_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ -#if (FDT_SUPPORT) - if (bl_get_partition(p_fdt, PATH_PARTITION_UBOOT, &g_emb_uboot, p_id) != 0) { - return NULL; - } -#else - *p_id = NVTPACK_IDX_UBOOT; -#endif - g_emb_uboot.EmbType = EMBTYPE_UBOOT; - return &g_emb_uboot; -} - -_THUMB2 static void *bl_get_rtos_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ -#if (FDT_SUPPORT) - if (bl_get_partition(p_fdt, PATH_PARTITION_RTOS, &g_emb_rtos, p_id) != 0) { - return NULL; - } -#else - *p_id = NVTPACK_IDX_RTOS; -#endif - g_emb_rtos.EmbType = EMBTYPE_RTOS; - return &g_emb_rtos; -} - -#if (NUTTX_SUPPORT) -_THUMB2 static void *bl_get_nuttx_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ - if (bl_get_partition(p_fdt, PATH_PARTITION_NUTTX, &g_emb_nuttx, p_id) != 0) { - return NULL; - } - g_emb_nuttx.EmbType = EMBTYPE_NUTTX; - - return &g_emb_nuttx; -} -#endif - -_THUMB2 static void *bl_get_teeos_partition(unsigned char *p_fdt /*IN*/, int *p_id /*OUT*/) -{ -#if (FDT_SUPPORT) - if (bl_get_partition(p_fdt, PATH_PARTITION_TEEOS, &g_emb_teeos, p_id) != 0) { - return NULL; - } -#else - *p_id = NVTPACK_IDX_TEEOS; -#endif - g_emb_teeos.EmbType = EMBTYPE_TEEOS; - - return &g_emb_teeos; -} -#endif - -// return decompress_fw_size -_THUMB2 static unsigned int bl_decompress_rtos(UINT32 compress_addr, UINT32 compress_size, UINT32 fw_base_addr) -{ - UINT32 decoded_size; - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)compress_addr; - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - UINT32 size_uncomp_le = invertEndian(pBfc->uiSizeUnComp); - - size_comp_le = (compress_size < size_comp_le) ? compress_size : size_comp_le; - decoded_size = LZ_Un_compress((UINT8 *)compress_addr + sizeof(NVTPACK_BFC_HDR), (UINT8 *)fw_base_addr, size_comp_le); - //because some padding bytes are decoded, we must return real rtos size - return (decoded_size < size_uncomp_le) ? decoded_size : size_uncomp_le; -} - -#if !REMOVED_FLASH -_THUMB2 static int bl_load_uboot_from_all_in_one(unsigned char *p_fdt, unsigned char *p_all_in_one, unsigned int all_in_one_size) -{ - NVTPACK_ER er; - NVTPACK_MEM mem_uboot; - int uboot_partition_id; - NVTPACK_GET_PARTITION_INPUT input; - DRAM_PARTITION *p_dram_partition = NULL; - EMB_PARTITION *p_emb_partition_uboot = bl_get_uboot_partition(p_fdt, &uboot_partition_id); - - if (p_emb_partition_uboot == NULL) { - debug_err("null p_emb_partition_uboot\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // get partition data address and size - input.id = (unsigned int)uboot_partition_id; - input.mem.p_data = (void *)p_all_in_one; - input.mem.len = all_in_one_size; - er = nvtpack_get_partition(&input, &mem_uboot); - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - - debug_msg_var("uboot_addr", p_dram_partition->uboot_addr); -// debug_msg_var("uboot_size", p_dram_partition->uboot_size); -# if 0 - if(0) { -#else -#if (_FPGA_EMULATION_ == 0) - if(is_secure_enable() == 0) { -#else - if (1) { -#endif -#endif - if (bl_chk_uboot((unsigned int)mem_uboot.p_data, mem_uboot.len) != 0) { - return -1; - } - - // flow to handle compressed u-boot and uncompressed one. - HEADINFO *p_headinfo = (HEADINFO *)(mem_uboot.p_data + BIN_INFO_OFFSET_UBOOT); // describe uncompressed u-boot - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)mem_uboot.p_data; // describe compressed u-boot - - // load uboot bin to dram partiton location - //debug_msg_var("uboot_addr", p_dram_partition->uboot_addr); - //debug_msg_var("uboot_size", p_dram_partition->uboot_size); - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - if((cpu_to_be32(pBfc->uiAlgorithm) & 0xFF ) == 11) { -#if (_ROM_PUBLIC_API_ == 1) - UINT32 lzma_addr = *(UINT32 *)ROM_LZMA_POSITION; - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - UINT32 size_uncomp_le = invertEndian(pBfc->uiSizeUnComp); - rom_lzma_inflate = (int (*)(UINT8 *, UINT32 , UINT8 * , UINT32 , UINT8 *, UINT32 ))((lzma_addr)); - rom_lzma_inflate(mem_uboot.p_data + sizeof(NVTPACK_BFC_HDR), size_comp_le, (unsigned char *) p_dram_partition->uboot_addr, size_uncomp_le, (UINT8 *)lzma_temp_buffer, 65536); - debug_msg("lzma "); - -#else - debug_msg("Can not support LZMA\r\n"); -#endif - } else { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - LZ_Un_compress(mem_uboot.p_data + sizeof(NVTPACK_BFC_HDR), (unsigned char *) p_dram_partition->uboot_addr, size_comp_le); - debug_msg("lz"); - } - } else { - debug_msg("nml"); - utl_memcpy((void *)p_dram_partition->uboot_addr, mem_uboot.p_data, p_headinfo->BinLength); - } - } else { -#if (SECURE_DECRYPT_UBOOT) - utl_memcpy((void *)p_dram_partition->uboot_addr, mem_uboot.p_data, mem_uboot.len); - unsigned int plaintext_size =0; - - if((er = do_decrypt_aes(p_dram_partition->uboot_addr, p_dram_partition->uboot_addr, &plaintext_size, p_dram_partition->uboot_size))!= 0 ) - { - //debug_err("aes fail\r\n"); - return er; - } - if (bl_chk_uboot((unsigned int)p_dram_partition->uboot_addr, plaintext_size) != 0) { - return -1; - } -#else - debug_msg("please enable SECURE_DECRYPT_UBOOT\r\n"); - return -1; -#endif - } - - return 0; -} - -#if (NUTTX_SUPPORT) -_THUMB2 static int bl_load_nuttx_from_all_in_one(unsigned char *p_fdt, unsigned char *p_all_in_one, unsigned int all_in_one_size) -{ - NVTPACK_ER er; - NVTPACK_MEM mem_nuttx; - int nuttx_partition_id; - NVTPACK_GET_PARTITION_INPUT input; - DRAM_PARTITION *p_dram_partition = NULL; - EMB_PARTITION *p_emb_partition_nuttx = bl_get_nuttx_partition(p_fdt, &nuttx_partition_id); - - if (p_emb_partition_nuttx == NULL) { - debug_err("null p_emb_partition_nuttx\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // get partition data address and size - input.id = (unsigned int)nuttx_partition_id; - input.mem.p_data = (void *)p_all_in_one; - input.mem.len = all_in_one_size; - er = nvtpack_get_partition(&input, &mem_nuttx); - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - - // using check uboot's check sum is ok - if (bl_chk_uboot((unsigned int)mem_nuttx.p_data, mem_nuttx.len) != 0) { - return -1; - } - - // flow to handle compressed u-boot and uncompressed one. - HEADINFO *p_headinfo = (HEADINFO *)(mem_nuttx.p_data + BIN_INFO_OFFSET_NUTTX); // describe uncompressed u-boot - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)mem_nuttx.p_data; // describe compressed u-boot - - // load nuttx bin to dram partiton location - debug_msg_var("nuttx_addr", p_dram_partition->nuttx_addr); - debug_msg_var("nuttx_size", p_dram_partition->nuttx_size); - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - LZ_Un_compress(mem_nuttx.p_data + sizeof(NVTPACK_BFC_HDR), (unsigned char *) p_dram_partition->nuttx_addr, size_comp_le); - } else { - utl_memcpy((void *)p_dram_partition->nuttx_addr, mem_nuttx.p_data, p_headinfo->BinLength); - } - - return 0; -} -#endif - -_THUMB2 static int bl_load_teeos_from_all_in_one(unsigned char *p_fdt, unsigned char *p_all_in_one, unsigned int all_in_one_size) -{ - NVTPACK_ER er; - NVTPACK_MEM mem_teeos; - int teeos_partition_id; - NVTPACK_GET_PARTITION_INPUT input; - DRAM_PARTITION *p_dram_partition = NULL; - EMB_PARTITION *p_emb_partition_teeos = bl_get_teeos_partition(p_fdt, &teeos_partition_id); - HEADINFO *p_headinfo = NULL; - if (p_emb_partition_teeos == NULL) { - debug_err("null p_emb_partition_teeos\r\n"); - return -1; - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // get partition data address and size - input.id = (unsigned int)teeos_partition_id; - input.mem.p_data = (void *)p_all_in_one; - input.mem.len = all_in_one_size; - er = nvtpack_get_partition(&input, &mem_teeos); - if (er == NVTPACK_ER_NOT_FOUND) { - return -2; - } - - if (er != NVTPACK_ER_SUCCESS) { - return -1; - } - -#if 0 - if(1){ -#else - if(is_secure_enable()) { -#endif -#if (SECURE_DECRYPT_OPTEE_OS) - unsigned int plaintext_size =0; - utl_memcpy((void *)p_dram_partition->teeos_addr, mem_teeos.p_data, mem_teeos.len); - if((er = do_decrypt_aes(p_dram_partition->teeos_addr, p_dram_partition->teeos_addr,&plaintext_size, p_dram_partition->teeos_size))!= 0) - { - //debug_err("aes fail\r\n"); - return er; - } - - //this is the second headinfo information , not encrpyted headinfo - p_headinfo = (HEADINFO *)(p_dram_partition->teeos_addr + BIN_INFO_OFFSET_TEEOS); -#else - debug_err("please enable SECURE_DECRYPT_OPTEE_OS"); - return -1; -#endif - } - else{ - p_headinfo = (HEADINFO *)(mem_teeos.p_data + BIN_INFO_OFFSET_TEEOS); // describe uncompressed u-boot - utl_memcpy((void *)p_dram_partition->teeos_addr, (unsigned char*)mem_teeos.p_data, p_headinfo->BinLength); - } - UINT32 teeos_addr = p_headinfo->Resv1[HEADINFO_TEEOS_RESV_IDX_LOAD_ADDR]; - - //check addr matched or not - debug_msg_var("teeos_addr", p_dram_partition->teeos_addr); - if (teeos_addr != p_dram_partition->teeos_addr) { - debug_msg_var("teeos_addr(bin)", teeos_addr); - debug_err("teeos addr not matched.\r\n"); - return -1; - } - - // using check uboot's check sum is ok - if (bl_chk_uboot((unsigned int)teeos_addr, p_headinfo->BinLength) != 0) { - return -1; - } - - return 0; -} - -_THUMB2 static int bl_load_uboot_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) -{ - int er; - int uboot_partition_id; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned int blk_size = int_strg_obj->flash_getBlockSize(); - EMB_PARTITION *p_emb_partition_uboot = bl_get_uboot_partition(p_fdt, &uboot_partition_id); - - if (p_emb_partition_uboot == NULL) { - debug_err("null p_emb_partition_uboot\r\n"); - return -1; - } - - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - -#if (SECURE_DECRYPT_UBOOT) - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(BIN_INFO_OFFSET_UBOOT + sizeof(HEADINFO), blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read uboot failed - return -1; - } -#else - - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(BIN_INFO_OFFSET_UBOOT + sizeof(HEADINFO), blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read uboot failed - return -1; - } - -#endif - - debug_msg_var("uboot_addr", p_dram_partition->uboot_addr); - debug_msg_var("uboot_size", p_dram_partition->uboot_size); -#if 0 - if(0){ -#else - if(is_secure_enable() == 0) { -#endif - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp + BIN_INFO_OFFSET_UBOOT); // describe uncompressed u-boot - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)p_tmp; // describe compressed u-boot - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) - { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(size_comp_le, blk_size),p_tmp, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash_comp,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - if((cpu_to_be32(pBfc->uiAlgorithm) & 0xFF ) == 11) { -#if (_ROM_PUBLIC_API_ == 1) - UINT32 lzma_addr = *(UINT32 *)ROM_LZMA_POSITION; - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - UINT32 size_uncomp_le = invertEndian(pBfc->uiSizeUnComp); - rom_lzma_inflate = (int (*)(UINT8 *, UINT32 , UINT8 * , UINT32 , UINT8 *, UINT32 ))((lzma_addr)); - rom_lzma_inflate(p_tmp + sizeof(NVTPACK_BFC_HDR), size_comp_le, (unsigned char *) p_dram_partition->uboot_addr, size_uncomp_le, (UINT8 *)lzma_temp_buffer, 65536); - debug_msg("lzma "); -#else - debug_msg("Can not support LZMA\r\n"); -#endif - } else { - LZ_Un_compress(p_tmp + sizeof(NVTPACK_BFC_HDR), (unsigned char *)p_dram_partition->uboot_addr, size_comp_le); - } - } - else - { - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(p_headinfo->BinLength, blk_size), - (UINT8 *)p_dram_partition->uboot_addr, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - } - } - else - { -#if (SECURE_DECRYPT_UBOOT) - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp); // describe uncompressed u-boot - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_uboot->PartitionOffset / blk_size, - ALIGN_CEIL(p_headinfo->BinLength, blk_size), - (UINT8 *)p_dram_partition->uboot_addr, NAND_RW_FIRMWARE)) < 0) - { - debug_err_var("bl_load_uboot_from_flash,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - unsigned int plaintext_size=0; - if((er =do_decrypt_aes(p_dram_partition->uboot_addr, p_dram_partition->uboot_addr, &plaintext_size, p_dram_partition->uboot_size))!= 0) - { - //debug_err("aes fail\r\n"); - return er; - } -#else - debug_msg("plase enable SECURE_DECRYPT_UBOOT config\r\n"); - return -1; -#endif - } - return 0; -} - -_THUMB2 static int bl_load_rtos_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) -{ - int er; - int rtos_partition_id; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned int blk_size = int_strg_obj->flash_getBlockSize(); - EMB_PARTITION *p_emb_partition_rtos = bl_get_rtos_partition(p_fdt, &rtos_partition_id); - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - - if (p_emb_partition_rtos == NULL) { - debug_err("null p_emb_partition_rtos\r\n"); - return -1; - } - - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - if(bl_is_smp(p_fdt)) { - bl_core2_prepare(p_dram_partition, 0); - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - bl_core2_reset(); - } -#endif - - // load 1st block of rtos to tmp dram (to detect compressed u-boot) - unsigned int bininfo_preload_size = ALIGN_CEIL(BIN_INFO_OFFSET_RTOS + sizeof(HEADINFO), blk_size); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset / blk_size, bininfo_preload_size, p_tmp, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read rtos failed - } - - // flow to handle compressed u-boot and uncompressed one. - NVTPACK_BFC_HDR *pBfc = (NVTPACK_BFC_HDR *)p_tmp; // describe compressed u-boot - - // load rtos bin to dram partiton location - //debug_msg_var("rtos_addr", p_dram_partition->rtos_addr); - //debug_msg_var("rtos_size", p_dram_partition->rtos_size); - - if (pBfc->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - - if((cpu_to_be32(pBfc->uiAlgorithm) & 0xFF ) == 11) - { - /* lzma compressed image*/ - debug_msg("lzma, use uboot\r\n"); - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - - // boot uboot - er = bl_boot_uboot((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot uboot failed\r\n"); - } - } else { - UINT32 size_comp_le = invertEndian(pBfc->uiSizeComp); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset / blk_size, ALIGN_CEIL(size_comp_le, blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash_comp,er=", er); // read bfc-rtos failed - bl_displayErrMsg(RWErrorMsg); - } - LZ_Un_compress(p_tmp + sizeof(NVTPACK_BFC_HDR), (unsigned char *)p_dram_partition->rtos_addr, size_comp_le); - } - } else { - BININFO *p_bininfo = (BININFO *)(p_tmp + BIN_INFO_OFFSET_RTOS); // describe uncompressed u-boot - if (p_bininfo->head.Resv1[HEADINFO_RESV_IDX_BOOT_FLAG] & BOOT_FLAG_PARTLOAD_EN) { - // copy bininfo_preload to rtos_addr - bl_memcpy((UINT8 *)p_dram_partition->rtos_addr, p_tmp, bininfo_preload_size); - // preload some to get part-1 size for partial load and partial compressed load - UINT32 preload_size = ALIGN_CEIL(FW_PART1_SIZE_OFFSET, blk_size) - bininfo_preload_size; - - if (preload_size!= 0) { - er = int_strg_obj->flash_readSectors( - (p_emb_partition_rtos->PartitionOffset + bininfo_preload_size) / blk_size, - preload_size, - (UINT8 *)(p_dram_partition->rtos_addr + bininfo_preload_size), NAND_RW_FIRMWARE - ); - - if (er < 0) { - debug_err_var("bl_load_rtos_from_flash_pl1,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - } - UINT32 part1_size = *(UINT32 *)(p_dram_partition->rtos_addr + FW_PART1_SIZE_OFFSET); - debug_msg_var("part1_size",part1_size); - part1_size = ALIGN_CEIL(part1_size, blk_size); - //debug_msg_var("part1_size_aligned",part1_size); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset / blk_size, part1_size, (UINT8 *)p_dram_partition->rtos_addr, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash_pl1,er=", er); - bl_displayErrMsg(RWErrorMsg); - } - // update loaded size - p_shminfo->boot.LdLoadSize = part1_size; - } else { - // full load - debug_msg_var("rtos_size", p_bininfo->head.BinLength); - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_rtos->PartitionOffset /blk_size, ALIGN_CEIL(p_bininfo->head.BinLength, blk_size), (UINT8 *)p_dram_partition->rtos_addr, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_rtos_from_flash,er=", er); // read bfc-uboot failed - bl_displayErrMsg(RWErrorMsg); - } - // update loaded size - p_shminfo->boot.LdLoadSize = p_bininfo->head.BinLength; - } - } - return 0; -} - -_THUMB2 static int bl_load_teeos_from_flash(unsigned char *p_fdt, unsigned char *p_tmp) -{ - int er; - int teeos_partition_id; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned int blk_size = int_strg_obj->flash_getBlockSize(); - EMB_PARTITION *p_emb_partition_teeos = bl_get_teeos_partition(p_fdt, &teeos_partition_id); - - if (p_emb_partition_teeos == NULL) { - debug_err("null p_emb_partition_teeos\r\n"); - return -1; - } - - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // load 1st block of u-boot to tmp dram (to detect compressed u-boot) - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_teeos->PartitionOffset / blk_size, ALIGN_CEIL(BIN_INFO_OFFSET_TEEOS + sizeof(HEADINFO), blk_size), p_tmp, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_teeos_from_flash,er=", er); - bl_displayErrMsg(RWErrorMsg); // read teeos failed - } - - // flow to handle compressed u-boot and uncompressed one. -#if (SECURE_DECRYPT_OPTEE_OS) - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp); // describe uncompressed u-boot -#else - HEADINFO *p_headinfo = (HEADINFO *)(p_tmp + BIN_INFO_OFFSET_TEEOS); // describe uncompressed u-boot - -#endif - - if ((er = int_strg_obj->flash_readSectors(p_emb_partition_teeos->PartitionOffset / blk_size, ALIGN_CEIL(p_headinfo->BinLength, blk_size), (UINT8 *)p_dram_partition->teeos_addr, NAND_RW_FIRMWARE)) < 0) { - debug_err_var("bl_load_teeos_from_flash,er=", er); // read bfc-teeos failed - bl_displayErrMsg(RWErrorMsg); - } -#if 0 - if(1){ -#else - if(is_secure_enable()) { -#endif -#if (SECURE_DECRYPT_OPTEE_OS) - - unsigned int plaintext_size=0; - if((er = do_decrypt_aes(p_dram_partition->teeos_addr, p_dram_partition->teeos_addr, &plaintext_size, p_dram_partition->teeos_size)) != 0) - { - //debug_err("aes fail\r\n"); - return er; - } - - p_headinfo = (HEADINFO *)(p_dram_partition->teeos_addr + BIN_INFO_OFFSET_TEEOS); // describe uncompressed u-boot -#else - debug_err("please ENABLE SECURE_DECRYPT_OPTEE_OS config\n"); - return -1; -#endif - } - - // load teeos bin to dram partiton location - UINT32 teeos_addr = p_headinfo->Resv1[HEADINFO_TEEOS_RESV_IDX_LOAD_ADDR]; - debug_msg_var("teeos_addr", p_dram_partition->teeos_addr); - if (teeos_addr != p_dram_partition->teeos_addr) { - debug_msg_var("teeos_addr(bin)", teeos_addr); - debug_err("teeos addr not matched.\r\n"); - return -1; - } - //check check sum - if (bl_chk_uboot((unsigned int)teeos_addr, p_headinfo->BinLength) != 0) { - return -1; - } - return 0; -} -#endif - -#if !(USB_WRITELOADER || UART_UPDATE) -_THUMB2 static int bl_load_rtos_from_non_nvtpack(unsigned int src_addr, unsigned int src_size, unsigned int *p_dst_addr, unsigned int *p_dst_size) -{ - NVTPACK_BFC_HDR *pBFC = (NVTPACK_BFC_HDR *)src_addr; - HEADINFO *p_headinfo = (HEADINFO *)(src_addr + BIN_INFO_OFFSET_RTOS); - if (pBFC->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - // to avoid rtos_addr is overlapped by src_addr, we need extract some bits to get real rtos addr. - // compressed firmware - debug_msg("compressed t.bin\r\n"); - // decode some bytes to get uncompressed address - bl_decompress_rtos(src_addr, SIZE_PRELOAD, src_addr + SIZE_PRELOAD); - p_headinfo = (HEADINFO *)(src_addr + SIZE_PRELOAD + BIN_INFO_OFFSET_RTOS); - // check if valid after decode - if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - UINT32 compress_size = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - //adjust src_addr that lay compressed f.w followed by uncomppressed f.w - src_addr = uncompress_addr + uncompress_size; - src_addr = ALIGN_CEIL(src_addr, 4); - src_size = fat_read_rootfile((UINT8 *)src_addr, compress_size); - } else { - return -1; - } - } else if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - // uncompressed firmware - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - - src_size = fat_read_rootfile((UINT8 *)src_addr, uncompress_size); - src_addr = uncompress_addr; - src_size = uncompress_size; - debug_msg("uncompressed t.bin\r\n"); -#if (DRAM_RANGE_SCAN_EN == ENABLE) - } else if (utl_is_sram_fw(src_addr) == TRUE) { - debug_msg("detected as SRAM fw\r\n"); - src_size = fat_read_rootfile((UINT8 *)src_addr, FAT_READ_TOTAL_FILE_LENGTH); -#endif - } else { - return -1; - } - - *p_dst_addr = src_addr; - *p_dst_size = src_size; - return 0; -} -#endif - -#if 0//(STORAGE_EXT_TYPE == STORAGE_EXT_USB) -_THUMB2 static int bl_load_rtos_from_usb_raw(unsigned int src_addr, unsigned int src_size, unsigned int *p_dst_addr, unsigned int *p_dst_size) -{ - NVTPACK_BFC_HDR *pBFC = (NVTPACK_BFC_HDR *)src_addr; - HEADINFO *p_headinfo = (HEADINFO *)(src_addr + BIN_INFO_OFFSET_RTOS); - if (pBFC->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - // to avoid rtos_addr is overlapped by src_addr, we need extract some bits to get real rtos addr. - // compressed firmware - debug_msg("compressed t.bin\r\n"); - // decode some bytes to get uncompressed address - // assume usb write loader receive full fw at 0x0200_0000, decompress it to smaller address - bl_decompress_rtos(src_addr, SIZE_PRELOAD, src_addr - SIZE_PRESERVE_USB); - p_headinfo = (HEADINFO *)(src_addr - SIZE_PRESERVE_USB + BIN_INFO_OFFSET_RTOS); - // check if valid after decode - if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - UINT32 compress_size = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - //adjust src_addr that lay compressed f.w followed by uncomppressed f.w - utl_memcpy((void *)(uncompress_addr + uncompress_size), (void *)src_addr, compress_size); - src_addr = uncompress_addr + uncompress_size; - src_addr = ALIGN_CEIL(src_addr, 4); - src_size = compress_size; - } else { - return -1; - } - } else if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - // uncompressed firmware - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - debug_msg("uncompressed t.bin\r\n"); - utl_memcpy((void *)uncompress_addr, (void *)src_addr, uncompress_size); - src_size = uncompress_size; -#if (DRAM_RANGE_SCAN_EN == ENABLE) - } else if (utl_is_sram_fw(src_addr) == TRUE) { - debug_msg("detected as SRAM fw. NOt Support from USB\r\n"); -#endif - } else { - return -1; - } - - *p_dst_addr = src_addr; - *p_dst_size = src_size; - return 0; -} -#endif - -//#if !USB_WRITELOADER -#if !((STORAGE_EXT_TYPE == STORAGE_EXT_USB) || (STORAGE_EXT_TYPE == STORAGE_EXT_UART)) -_THUMB2 static int bl_load_rtos_from_uart(unsigned int src_addr, unsigned int src_size, unsigned int *p_dst_addr, unsigned int *p_dst_size) -{ -#if UART_UPDATE_ - UINT32 tick_kms = 10; // timeout 1000 ms - char key; - - debug_msg("UART press Enter to\r\n"); - - while (--tick_kms) { - uart_chkChar(&key); - - if (key != 0x00) { - break; - } - timer_delay(100000); //100000 - debug_msg("."); - } - - if (tick_kms) { - UINT32 uiLength; - debug_msg("\r\nEnter uboot length (Decimal):\r\n"); //must \r\n at the end because of auto_test tool - uart_getStr_polling(g_strLength); - uiLength = DecStr2Int(g_strLength); - debug_msg("\r\nPlz pass uboot bin > "); - uart_getBinary((char *)src_addr, uiLength); // Temp Receive to DRAM start - debug_msg("\r\nGot it\r\n"); -#if (DRAM_RANGE_SCAN_EN == ENABLE) - // First word is code entry point address, once if entry address is 0xC000XXXX - // represent code is running on sram. - if (bl_checkDramScanFW(src_addr) == TRUE) { - UINT32 i; - - // Enable sram usage - SETREG32(0xF0900128, 0x00000002); - SETREG32(0xF0800128, 0x00000006); - SETREG32(0xF0020060, 0x00030002); - - uiLength = ((uiLength + 3) & 0xFFFFFFFC); - - for (i = 0; i < uiLength; i += 4) { - *(UINT32 *)(src_addr + i) = *(UINT32 *)(src_addr + i); - } - *(UINT32 *)(src_addr) = *(UINT32 *)(src_addr); - return 1; - } -#endif - if (*(UINT32 *)src_addr == MAKEFOURCC('B', 'C', 'L', '1')) { - HEADINFO *p_headinfo = NULL; - NVTPACK_BFC_HDR *pBFC = (NVTPACK_BFC_HDR *)src_addr; - bl_checkFW(src_addr, uiLength); - debug_msg_var("uiLength", uiLength); - debug_msg("compressed t.bin\r\n"); - // decode some bytes to get uncompressed address - bl_decompress_rtos(src_addr, SIZE_PRELOAD, src_addr + uiLength); - p_headinfo = (HEADINFO *)(src_addr + uiLength + BIN_INFO_OFFSET_RTOS); - // check if valid after decode - if ((strncmp(p_headinfo->BinInfo_1, "NT", 2) == 0) || - (strncmp(p_headinfo->BinInfo_1, "NC", 2) == 0)) { - UINT32 uncompress_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; - UINT32 uncompress_size = p_headinfo->BinLength; - UINT32 compress_size = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - unsigned int ori_src_addr = src_addr; - //adjust src_addr that lay compressed f.w followed by uncomppressed f.w - src_addr = uncompress_addr + uncompress_size; - src_addr = ALIGN_CEIL(src_addr, 4); - src_size = uncompress_size; - utl_memcpy((void *)src_addr, (void *)ori_src_addr, uiLength); - *p_dst_addr = src_addr; - *p_dst_size = compress_size; - return 0; - } else { - return -1; - } - return 0; - } - } -#endif - return -1; -} -#endif - -_THUMB2 static void bl_update_uItron_headInfo(UINT32 fw_base_addr, DRAM_PARTITION *p_dram_partition) -{ - HEADINFO *pHeadInfo; -#if (UITRON_FW == ENABLE) - BININFO *pBinInfo; -#endif - pHeadInfo = (HEADINFO *)(fw_base_addr + BIN_INFO_OFFSET_RTOS); - if (p_dram_partition) { - pHeadInfo->ModelextAddr = p_dram_partition->fdt_addr; - } else { - pHeadInfo->ModelextAddr = 0; -#if (UITRON_FW == ENABLE) - pBinInfo = (BININFO *)(fw_base_addr + BIN_INFO_OFFSET_RTOS); - pBinInfo->ld.Resv[0] = LoaderInternalInfo[1]; - pBinInfo->ld.LdPackage = (LoaderInternalInfo[3] & 0xFFFF); -#endif - } -} - -_THUMB2 static int bl_update_loader_bininfo(unsigned char *p_fdt, unsigned int ld_flag, unsigned int rtos_loaded_size) -{ - BOOTINFO *p_ld; - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - BININFO *p_bininfo = (BININFO *)(p_dram_partition->rtos_addr + BIN_INFO_OFFSET_RTOS); - - p_ld = &p_shminfo->boot; - if (!(p_bininfo->head.Resv1[HEADINFO_RESV_IDX_BOOT_FLAG] & BOOT_FLAG_PARTLOAD_EN)) { - // LdLoadSize updated on uboot or bl_load_rtos_from_flash(), if BOOT_FLAG_PARTLOAD_EN - p_ld->LdLoadSize = rtos_loaded_size; - } - p_ld->LdLoadTime = timer_getLdrElapse(); - p_ld->LdResvSize = 0; //unused - p_ld->FWResvSize = 0; //unused - return 0; -} - -_THUMB2 static int bl_is_smp(unsigned char *p_fdt) -{ -#if (FDT_SUPPORT) - int len; - const char *nodep; - nodep = (const char *)bl_get_fdt_property(p_fdt, PATH_NVT_INFO, PROPERTY_NVT_LINUX_SMP, &len); - debug_msg_var("nodep", (UINT32)nodep); - if (nodep == NULL) { - return 0; - } - debug_msg((char *)nodep); - if (strcmp(nodep, "NVT_LINUX_SMP_ON") == 0) { - return 1; - } - return 0; -#else - return 0; -#endif -} - -#if !REMOVED_FLASH -_THUMB2 int bl_boot_uboot(unsigned char *p_fdt) -{ -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - UINT32 No_CPU; -#endif - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // update shminfo - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - unsigned int *p_param = (unsigned int *)(&_load_LOADER_CONFIGRAM_FREQ_PARAM_start_base[0]); - p_shminfo->boot.LdPackage = p_param[3] & 0xFFFF; - p_shminfo->boot.LdStorage = (p_param[3] >> 16) & 0xFF; - - // update headinfo as real u-boot address - HEADINFO *p_headinfo = (HEADINFO *)(p_dram_partition->uboot_addr + BIN_INFO_OFFSET_UBOOT); - - if (bl_chk_uboot(p_dram_partition->uboot_addr, p_headinfo->BinLength) != 0) { - return -1; - } - // start cpu2 - if (p_dram_partition->uboot_addr != p_headinfo->CodeEntry) { - debug_err_var("drampat-uboot_addr ", (int)p_dram_partition->uboot_addr); - debug_err_var("bin-uboot_addr ", (int)p_headinfo->CodeEntry); - return -1; - } - // for uboot to indicate this boot is all-in-one fw or non-all-in-one boot from uart or usb - // if boot from uart or usb with non-all-in-one fw, the uboot's ModelextAddr will be zero - p_headinfo->ModelextAddr = p_dram_partition->fdt_addr; - - CPUflushWriteCache(p_headinfo->CodeEntry, p_headinfo->BinLength); - UINT32 isSMP = bl_is_smp(p_fdt); - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - No_CPU = *(UINT32 *)0xFFD00004; - No_CPU &= 0x3; - debug_msg_var("core No.=", No_CPU+1); -#endif - // init cpu timer -// bl_cpu_timer_init(CPU_TIMER_SETTING); -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - if (!isSMP || !No_CPU) -#else - if (!isSMP) -#endif - { -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - debug_msg_var("Bin core=", isSMP+1); -#endif - bl_entry_boot(p_fdt, p_headinfo->CodeEntry); - } else { -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - // init cpu timer - bl_cpu_timer_init(global_timer_freq); - - bl_smp_start(p_fdt, p_headinfo->CodeEntry); - // boot u-boot and never return back to loader -#else - //bl_smp_start(p_fdt, p_headinfo->CodeEntry); - debug_err("not support smp\r\n"); -#endif - } - return 0; -} - -#if (NUTTX_SUPPORT) -_THUMB2 static int bl_boot_nuttx(unsigned char *p_fdt) -{ - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // update headinfo as real u-boot address - HEADINFO *p_headinfo = (HEADINFO *)(p_dram_partition->nuttx_addr + BIN_INFO_OFFSET_NUTTX); - - if (bl_chk_uboot(p_dram_partition->nuttx_addr, p_headinfo->BinLength) != 0) { - return -1; - } - - // start cpu2 - if (p_dram_partition->nuttx_addr != p_headinfo->CodeEntry) { - debug_err_var("drampat-nuttx_addr ", (int)p_dram_partition->nuttx_addr); - debug_err_var("bin-nuttx_addr ", (int)p_headinfo->CodeEntry); - return -1; - } - - CPUflushWriteCache(p_headinfo->CodeEntry, p_headinfo->BinLength); - - // init cpu timer - bl_cpu_timer_init(CPU_TIMER_SETTING); - - bl_entry_boot(p_fdt, p_headinfo->CodeEntry); - // boot nuttx and never return back to loader - return 0; -} -#endif - -_THUMB2 static int bl_boot_teeos(unsigned char *p_fdt) -{ - DRAM_PARTITION *p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return -1; - } - - // update headinfo as real u-boot address - HEADINFO *p_headinfo = (HEADINFO *)(p_dram_partition->teeos_addr + BIN_INFO_OFFSET_TEEOS); - - // update uboot addr for teeos - p_headinfo->Resv1[HEADINFO_TEEOS_RESV_IDX_UBOOT_ADDR] = p_dram_partition->uboot_addr; - - -#if 0 //do not checksum, because teeos header has removed cause checksum failed - if (bl_chk_uboot(p_dram_partition->teeos_addr, p_headinfo->BinLength) != 0) { - return -1; - } -#endif - - //flush uboot - CPUflushWriteCache(p_dram_partition->uboot_addr, p_dram_partition->uboot_size); - //flush teeos - CPUflushWriteCache(p_headinfo->CodeEntry, p_headinfo->BinLength); - - // init cpu timer - -#if 0//(LOADER_TYPE == STAND_ALONE_LOADER_528) || (LOADER_TYPE == COMBINATION_528) - bl_cpu_timer_init(CPU_TIMER_SETTING); - // boot core2 (after teeos is loaded) - if (HEADINFO_UBOOT(p_dram_partition)->BinCtrl & 0x00000002) { - //if SMP, trigger core2 - debug_msg("smp(tee)\r\n"); - bl_core2_prepare(p_dram_partition, p_headinfo->CodeEntry); - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - bl_core2_reset(); - } else { - debug_msg_var("not smp\r\n", p_headinfo->BinCtrl); - } -#endif - bl_entry_boot(p_fdt, p_headinfo->CodeEntry); - // boot teeos and never return back to loader - return 0; -} - -_THUMB2 static int bl_update_loader_flag(unsigned char *p_fdt, UINT32 uiLoaderFunc) -{ - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - - utl_memcpy(p_bininfo->boot.LdInfo_1, "LD_NVT", 6); - - p_bininfo->boot.LdCtrl2 = 0; - if (uiLoaderFunc & FUNC_UPDATE_FW) { - p_bininfo->boot.LdCtrl2 |= LDCF_UPDATE_FW; - } - if (uiLoaderFunc & FUNC_UPDATE_LOADER) { - p_bininfo->boot.LdCtrl2 |= LDCF_UPDATE_LD; - } - if (uiLoaderFunc & FUNC_RUN_CARD) { - p_bininfo->boot.LdCtrl2 |= LDCF_BOOT_CARD; - } - if (uiLoaderFunc & FUNC_RUN_FLASH) { - p_bininfo->boot.LdCtrl2 |= LDCF_BOOT_FLASH; - } - //CPUflushWriteCache((UINT32)p_bininfo, sizeof(BININFO)); - debug_msg_var("LdCtrl2", p_bininfo->boot.LdCtrl2); - - unsigned int ver; - SHMINFO *p_shminfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_fdt, MODELEXT_TYPE_BIN_INFO); - BOOTINFO *p_ld = &p_shminfo->boot; - - utl_memset(p_ld->LdInfo_1, 0, sizeof(p_ld->LdInfo_1)); - utl_memcpy(p_ld->LdInfo_1, "LD_NVT", 6); - - ver = (((LoaderInternalInfo[1] >> 28) & 0xF) << 24) | - (((LoaderInternalInfo[1] >> 24) & 0xF) << 16) | - ((LoaderInternalInfo[1] >> 16) & 0xFF); - - if (g_uiVersion == 0) { - g_uiVersion = ver; - } - - utl_memcpy(&p_ld->LdInfo_1[8], &g_uiVersion, sizeof(g_uiVersion)); - unsigned int *p_param = (unsigned int *)(&_load_LOADER_CONFIGRAM_FREQ_PARAM_start_base[0]); - p_ld->LdPackage = p_param[3] & 0xFFFF; - p_ld->LdStorage = (p_param[3] >> 16) & 0xFF; - - return 0; -} - -// return uItron_fw_addr -_THUMB2 unsigned int bl_process_all_in_one(UINT32 uiFwBuf, UINT32 uiFwBufSize, DRAM_PARTITION **pOut_dram_partition, UINT32 uiLoaderFunc, UINT32 *p_comp_addr, UINT32 *p_comp_size) -{ - int er; - unsigned char *p_fdt = NULL; - DRAM_PARTITION *p_dram_partition = NULL; - //p_tmp for the case of all-in-one without fdt or uboot - unsigned char *p_tmp = (unsigned char *)(uiFwBuf + ALIGN_CEIL(uiFwBufSize, 4)); - - // load fdt - er = bl_load_fdt_from_all_in_one((unsigned char *)uiFwBuf, uiFwBufSize, &p_fdt); - if (er == -2) { // try to load from nand - debug_msg("fdt from flash.\r\n"); - // open flash - if (bl_flash_open() != 0) { // dont move flash open outside section, consider that T without flash device. - bl_displayErrMsg("flash open failed\r\n"); - } - - //p_tmp for the case of all-in-one without fdt or uboot - unsigned char *p_tmp = (unsigned char *)(uiFwBuf + ALIGN_CEIL(uiFwBufSize, 4)); - er = bl_load_fdt_from_flash(p_tmp, 0x2000000, &p_fdt); // dtb size less than 32MB to be safer. - if (er != 0) { - bl_displayErrMsg("load fdt failed\r\n"); - } - } - - // update loader flag - bl_update_loader_flag(p_fdt, uiLoaderFunc); - if (uiLoaderFunc & FUNC_UPDATE_FW) { - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - p_bininfo->comm.Resv[5] = uiFwBuf; // COMM_FW_UPD_ADDR - p_bininfo->comm.Resv[6] = uiFwBufSize; // COMM_FW_UPD_LEN - debug_msg_var("upd_src_addr=", uiFwBuf); - debug_msg_var("upd_src_size=", uiFwBufSize); - } - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - //check loader addr is matched with loader self. - extern char _loader_exec_compres_start[]; - if (p_dram_partition->loader_addr != (UINT32)_loader_exec_compres_start) { - debug_msg_var("p_dram_partition->loader_addr", p_dram_partition->loader_addr); - debug_msg_var("_loader_exec_compres_start", (UINT32)_loader_exec_compres_start); - bl_displayErrMsg("loader addr is not match."); - } - //when rtos boot from flash, the boot from loader directly, - //but when rtos need to burn image, the uboot is still required. - //so, any one need to burn image, uboot is always needed to boot. - //if ((uiLoaderFunc & FUNC_UPDATE_FW) || p_dram_partition->rtos_addr == 0) { - if (1) { - // always use uboot to handle all-in-one bin - if (p_dram_partition->nuttx_size == 0 && p_dram_partition->teeos_size == 0) { - // load uboot - er = bl_load_uboot_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er == -2) { // try to load from nand - debug_msg("uboot from flash.\r\n"); - // open flash - if (bl_flash_open() != 0) { // dont move flash open outside section, consider that T without flash device. - bl_displayErrMsg("flash open failed\r\n"); - } - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - } - - er = bl_boot_uboot((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot uboot failed\r\n"); - } - } else if (p_dram_partition->nuttx_size) { -#if (NUTTX_SUPPORT) - // load nuttx - er = bl_load_nuttx_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er != 0) { - bl_displayErrMsg("load nuttx failed\r\n"); - } - er = bl_boot_nuttx((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot nuttx failed\r\n"); - } -#else - bl_displayErrMsg("NUTTX_SUPPORT disabled\r\n"); -#endif - } else if (p_dram_partition->teeos_size) { - // load teeos - er = bl_load_teeos_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er != 0) { - bl_displayErrMsg("load teeos failed\r\n"); - } - // load uboot - er = bl_load_uboot_from_all_in_one((unsigned char *)p_dram_partition->fdt_addr, (unsigned char *)uiFwBuf, uiFwBufSize); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - // boot teeos - er = bl_boot_teeos((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot teeos failed\r\n"); - } - } - return er; - } else { - // update rtos information - // the following is for uncompressed-rtos only, others needing uboot - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((const void *)p_dram_partition->fdt_addr, MODELEXT_TYPE_BIN_INFO); - - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - *p_comp_addr = p_bininfo->comm.Resv[3]; // COMM_UITRON_COMP_ADDR - *p_comp_size = p_bininfo->comm.Resv[4]; // COMM_UITRON_COMP_LEN - - *pOut_dram_partition = p_dram_partition; - return bl_load_rtos_from_all_in_one((unsigned char *)uiFwBuf, uiFwBufSize, &p_fdt); - } -} -#endif - -// return uItron_fw_addr, no need to fully decode -_THUMB2 static unsigned int bl_process_rtos_only(UINT32 uiFwBuf, UINT32 uiFwBufSize, UINT32 uiLoaderFunc, UINT32 *p_comp_addr, UINT32 *p_comp_size) -{ - UINT32 uItron_fw_addr; - NVTPACK_BFC_HDR *pBFC; - HEADINFO *p_headinfo; - - debug_msg("\r\nbl_process_rtos_only\r\n"); - pBFC = (NVTPACK_BFC_HDR *)uiFwBuf; - if (pBFC->uiFourCC == MAKEFOURCC('B', 'C', 'L', '1')) { - UINT32 compressSize; - unsigned char *p_tmp = (unsigned char *)(uiFwBuf + ALIGN_CEIL(uiFwBufSize, 4)); - LZ_Un_compress((UINT8 *)uiFwBuf + LDC_HEADER_SIZE, p_tmp, SIZE_PRELOAD); - p_headinfo = (HEADINFO *)(p_tmp + BIN_INFO_OFFSET_RTOS); - uItron_fw_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; -#if UITRON_FW - uItron_fw_addr = p_headinfo->CodeEntry - CODE_ENTRY_OFFSET; // cliff -#endif - - if ((uItron_fw_addr & 0x0000FFFF) != 0) { //cc engine's limitation - debug_err_var("rtos addr must match (&0x0000FFFF)==0", uItron_fw_addr); // but 660 allow - uItron_fw_addr = uItron_fw_addr & 0xFFFF0000; - } - compressSize = invertEndian(pBFC->uiSizeComp) + sizeof(NVTPACK_BFC_HDR); - //debug_dump_addr(tmpBuf,0x200); - debug_msg_var("F compress uItron_fw_addr", uItron_fw_addr); - // uiFwBuf has adjusted on bl_load_rtos_from_non_nvtpack() - *p_comp_addr = uiFwBuf; - *p_comp_size = compressSize; - } else { - p_headinfo = (HEADINFO *)(uiFwBuf + BIN_INFO_OFFSET_RTOS); - uItron_fw_addr = p_headinfo->CodeEntry - CODE_SECTION_OFFSET; -#if UITRON_FW - uItron_fw_addr = p_headinfo->CodeEntry - CODE_ENTRY_OFFSET; // cliff -#endif - - if ((uItron_fw_addr & 0x0000FFFF) != 0) { //cc engine's limitation - debug_err_var("rtos addr must match (&0x0000FFFF)==0", uItron_fw_addr); // but 660 allow - uItron_fw_addr = uItron_fw_addr & 0xFFFF0000; - } - - debug_msg_var("Normal uItron_fw_addr", uItron_fw_addr); - *p_comp_addr = 0; - *p_comp_size = 0; - } - return uItron_fw_addr; -} -#if !UPDATE_EMU_CODE && !REMOVED_FLASH -_THUMB2 static unsigned int bl_process_flash_boot(unsigned char *p_tmp, DRAM_PARTITION **pOut_dram_partition, UINT32 uiLoaderFunc, UINT32 *p_comp_addr, UINT32 *p_comp_size) -{ - int er; - unsigned char *p_fdt = NULL; - DRAM_PARTITION *p_dram_partition = NULL; - - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - - // load fdt - er = bl_load_fdt_from_flash(p_tmp, SDRAM_Start_FW, &p_fdt); // dtb size less than 32MB to be safer. - if (er != 0) { - bl_displayErrMsg("load fdt failed\r\n"); - } - - // update loader flag - bl_update_loader_flag(p_fdt, uiLoaderFunc); - - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - - if (p_dram_partition->teeos_size) { - // load teeos - er = bl_load_teeos_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load teeos failed\r\n"); - } - // load uboot - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - // boot teeos - er = bl_boot_teeos((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot teeos failed\r\n"); - } - } else if (p_dram_partition->rtos_addr == 0 || DUAL_RTOS_SUPPORT || (gFastbootKeyCallBack == NULL) || (!gFastbootKeyCallBack())) { - // load uboot - er = bl_load_uboot_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load uboot failed\r\n"); - } - - // boot uboot - er = bl_boot_uboot((unsigned char *)p_dram_partition->fdt_addr); - if (er != 0) { - bl_displayErrMsg("boot uboot failed\r\n"); - } - } else { - // load rtos - er = bl_load_rtos_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp); - if (er != 0) { - bl_displayErrMsg("load rtos failed\r\n"); - } - } - - // update compressed rtos information - SHMINFO *p_bininfo = (SHMINFO *)bl_get_fdt_cfg((unsigned char *)p_dram_partition->fdt_addr, MODELEXT_TYPE_BIN_INFO); - if (p_bininfo == NULL) { - debug_err("null p_bininfo\r\n"); - return -1; - } - *p_comp_addr = p_bininfo->comm.Resv[3]; // COMM_UITRON_COMP_ADDR - *p_comp_size = p_bininfo->comm.Resv[4]; // COMM_UITRON_COMP_LEN - - *pOut_dram_partition = p_dram_partition; - return p_dram_partition->rtos_addr; -} -#endif - -/** - bl_process_update_loader. - - Write loader will update loader binary file - - @param[in] loader_addr loader in DRAM starting address - @param[in] loader_size loader code length (from loader header offset 0x24) - @return void -*/ -_THUMB2 static int bl_process_update_loader(unsigned int loader_addr, unsigned int loader_size) -{ - unsigned int reload_addr; - - // Check boot loader read from SD card - if(is_data_area_encrypted() == 0) { - -#if ((STORAGE_EXT_TYPE == STORAGE_EXT_ETH)|(STORAGE_EXT_TYPE == STORAGE_EXT_USB)) - //UINT32 uiOffset; - //uiOffset = *((UINT32 *)(loader_addr + 0x80)); - //if(uiOffset) {//Combo loader - // if(*(UINT32*)0xF00100F0 == 0x50210000) { - // debug_msg("combo loader 528\r\n"); - // bl_checkLoader(loader_addr+uiOffset, COMBINATION_LOADER_SIZE - uiOffset); //check 528 - // } else{ - // debug_msg("combo loader 52X\r\n"); - // bl_checkLoader(loader_addr, loader_size); //check 52x - // } - //}else - bl_checkLoader(loader_addr, loader_size); -#else -#if 0//(LOADER_TYPE == COMBINATION_528) - debug_msg("CB8\r\n"); - bl_checkLoader(loader_addr + loader_size, (COMBINATION_LOADER_SIZE - loader_size)); -#else //STAND_ALONE_LOADER or combination 52x loader - //debug_msg("STD\r\n"); - bl_checkLoader(loader_addr, loader_size); -#endif -#endif - } - debug_msg("update loader\r\n"); - - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - - // Program loader -#if 0 -#if ((STORAGE_EXT_TYPE == STORAGE_EXT_ETH)|(STORAGE_EXT_TYPE == STORAGE_EXT_USB)) - UINT32 uiOffset; - uiOffset = *((UINT32 *)(loader_addr + 0x80)); - if(uiOffset) //Combo loader - loader_size = COMBINATION_LOADER_SIZE; - //If single loader , it already got -#else -#if (LOADER_TYPE == STAND_ALONE_LOADER_560) || (LOADER_TYPE == STAND_ALONE_LOADER_528) -#else //Combination loader - loader_size = COMBINATION_LOADER_SIZE; -#endif -#endif -#endif - if (int_strg_obj->flash_writeSectors(StartNandBlkUpdateLoader, loader_size, (UINT8 *)loader_addr, NAND_RW_LOADER) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - // Read back - reload_addr = loader_addr + loader_size; - if (int_strg_obj->flash_readSectors(StartNandBlkUpdateLoader, loader_size, (UINT8 *)reload_addr, NAND_RW_LOADER) < 0) { - bl_displayErrMsg("rd fail\r\n"); - } - // Verify - if (memcmp((void *)loader_addr, (void *)reload_addr, loader_size) != 0) { - bl_displayErrMsg("verify fail\r\n"); - } - return 0; -} -#if UPDATE_EMU_CODE -_THUMB2 static int bl_process_update_emu_firmware(unsigned int emu_addr, unsigned int emu_size) -{ - unsigned int reload_addr; - - // Check boot loader read from SD card -// bl_checkFW(emu_addr, emu_size); - debug_msg("update emu firmware size"); - uart_putSystemUARTStr(Dec2HexStr(emu_size)); - uart_putSystemUARTStr("\r\n"); - - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - - // Program firmware - if (int_strg_obj->flash_writeSectors(g_uiStartBlkUpdateFW, emu_size, (UINT8 *)emu_addr, NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - // Read back - reload_addr = emu_addr + emu_size; - if (int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW, emu_size, (UINT8 *)reload_addr, NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg("rd fail\r\n"); - } - // Verify - if (memcmp((void *)emu_addr, (void *)reload_addr, emu_size) != 0) { - bl_displayErrMsg("verify fail\r\n"); - } - return 0; -} -#endif - -_THUMB2 void bl_read_rtos_addr(UINT32 *pLoadAddr, UINT32 *pTargetAddr, UINT32 *pSize) -{ - *pLoadAddr = g_rtos_load_addr; - *pTargetAddr = g_rtos_target_addr; - *pSize = g_rtos_size; -} - -/** - main flow code - - If there is Calibration Firmware code store in NAND, running flow as follow - O's work flow - - @return fw base addr -*/ - -_THUMB2 UINT32 bl_mainFlow(void) -{ - UINT32 uiUpdateFileLen = 0; - UINT32 uiLoaderFunc = 0; - UINT32 uiLoaderSize = 32 * 1024; // pre-assume 32KB, actual size is parsed from loader - //Show Duty calibration log -#if (_LOADER_DUTY_CALIBRATION_ == ENABLE && _LOADER_DUTY_CALIBRATION_LOG_ == ENABLE) - UINT32 uiLoaderAddress; - UINT32 uiLogSramAddress; -#endif - -#if !(USB_WRITELOADER || UART_UPDATE) - unsigned int adjusted_addr = 0; - unsigned int adjusted_size = 0; -#endif - UINT32 uiFwBaseAddr = SDRAM_Start_FW; // FW base address - DRAM_PARTITION *p_dram_partition = NULL; - - // BaseOfStack is initialized at doRemapLZ.s - UINT32 uiheapBufferAddr = (UINT32)_loader_heap_base; -// UINT32 uiheapBufferAddr = BaseOfStack + 0x40000; // reserve 16KB for tmp buffer usage - UINT32 uiTmpBufferAddr = uiheapBufferAddr + FAT_HEAP_BUFFER_SIZE; - UINT32 uiUpdateBootloaderBufAddr = uiTmpBufferAddr + 0x4000; - UINT32 uiUpdateMainBinBufAddr = SDRAM_Start_FW; - - // UART initial sequence - //uart_openSystemUART(); - // rtc reset shutdown timer - // rtc_resetShutDownTimer(); - - - - -#if 0 - // adjust PAD driving (if required) - bl_adjustDriving(); - /* - - @b RTC_PWR_SW_STS: Power on source is PWR_SW - - @b RTC_PWR_VBAT_STS: Power on source is PWR_VBAT - - @b RTC_PWR_VBUS_STS: Power on source is PWR_VBUS - */ - uiPowerOnSrc = rtc_getPWRONSource(); - - if (uiPowerOnSrc & RTC_PWR_SW_STS) { - uart_putSystemUARTStr("\r\nSW PON\r\n"); - } else if (uiPowerOnSrc & RTC_PWR_VBAT_STS) { - uart_putSystemUARTStr("\r\nVBAT PON\r\n"); - } else if (uiPowerOnSrc & RTC_PWR_VBUS_STS) { - uart_putSystemUARTStr("\r\nVBUS PON\r\n"); - } else if (rtc_getIsAlarmPowerOn()) { - uart_putSystemUARTStr("\r\nPwrAlarm PON\r\n"); - } else { - uart_putSystemUARTStr("\r\nPOR PON\r\n"); - } -#endif - // Display Loader Version - debug_msg((char *)LOADER_START_STR); - UTL_setDrvTmpBufferAddress(uiTmpBufferAddr); - - -#if 0 // for now, reduce code size - if (rtc_chkS3boot()) { - UINT32 resume_addr; - - uart_putSystemUARTStr("main selfing..\r\n"); - resume_addr = bl_resume_cpu1((unsigned char *)_BOARD_IPC_ADDR_); - if (resume_addr == 0) { - // in codition for MODELEXT_BUILT_IN_ON - resume_addr = RESUME_ADDR; - } - return resume_addr; - } else { - - uart_putSystemUARTStr("main not selfing..\r\n"); - } -#endif - -#if 0 - // Sample to hook spi flash extending function - flash_installIdentifyCB(bl_spiIdentify); -#endif - prj_main(); - -#if !(USB_WRITELOADER) - set_usb_suspend(); -#endif - - if(utl_get_bootsrc() == BOOT_SOURCE_UART) - { -#if UART_UPDATE - debug_msg("Boot from UART ...\r\n"); - bl_uart();//never returned. -#else - bl_displayErrMsg("UART_UPDATE must enable on loader\r\n"); -#endif - } - - if(USB_WRITELOADER || utl_get_bootsrc() == BOOT_SOURCE_USB) - { -#if USB_WRITELOADER - debug_msg("Boot from USB ...\r\n"); - bl_usb(); //never returned. -#else - bl_displayErrMsg("USB_WRITELOADER must enable on loader\r\n"); -#endif - } - -#if !(USB_WRITELOADER || UART_UPDATE) - if (bl_load_rtos_from_uart(uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH, &adjusted_addr, &adjusted_size) == 0) { - //specail case, load small rtos from uart - uiUpdateMainBinBufAddr = adjusted_addr; - uiUpdateFileLen = adjusted_size; - uiLoaderFunc |= FUNC_RUN_CARD; - } else if ((int_strg_obj->flash_getBlockSize() == EMMC_BLOCK_SIZE) && gRecoveryTriggerCallBack && gRecoveryTriggerCallBack()) { - debug_msg("Recovery triggered not support currently.\r\n"); -#if 0 - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } else { - flash_mount_fs(0, BaseOfStack + 0x4000, FAT_HEAP_BUFFER_SIZE); - if (flash_mount_partition(g_uiPartitionID) == E_OK) { - if (flash_open_file(RECOVERY_FW_NAME) == TRUE) { - NVTPACK_MEM mem_in ; - flash_read_file((UINT8 *)uiUpdateMainBinBufAddr, SIZE_PRELOAD); - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - // all in one bin - if (bl_chk_valid_all_in_one(&mem_in) == 0) { - // Read all - uiUpdateFileLen = flash_read_file((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - uiLoaderFunc |= FUNC_UPDATE_FW; - g_is_recovery_triggered = TRUE; - } else { - debug_msg("Recovery should be all in one bin!\r\n"); - } - } else { - debug_msg("no recovery bin!\r\n"); - } - } else { - debug_msg("Partition error!\r\n"); - } - } -#endif - } else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack()) && - ((gCardDetectCallBack == NULL) || gCardDetectCallBack())) { - if (card_open() == TRUE && fat_initFAT(uiheapBufferAddr, FAT_HEAP_BUFFER_SIZE) == TRUE) { -#if UPDATE_SIM_CODE - BOOL bWDTInit = UTL_canUpdateSecKey(); - if (bWDTInit && fat_open_rootfile(RUN_WRKEY_NAME) == TRUE) { - debug_msg("sim.bin exist\r\n"); // the others A or T are skipped. - // Read byte count specified in file directory entry - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - uiLoaderFunc |= FUNC_RUN_WRBIN; - } else { // exclude others update if FUNC_RUN_WRBIN is existing. -#endif - // Update loader or not, loader is fixed to 16 KB - if (fat_open_rootfile(UPDATE_LOADER_NAME) == TRUE) { - // Read byte count specified in file directory entry - fat_read_rootfile((UINT8 *)uiUpdateBootloaderBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - uiLoaderFunc |= FUNC_UPDATE_LOADER; - uiLoaderSize = *((UINT32 *)(uiUpdateBootloaderBufAddr + 0x24)); - } - // "Update FW" or "Run FW" function - // Update FW has higher priority - if (fat_open_rootfile(UPDATE_FW_NAME) == TRUE) { - NVTPACK_MEM mem_in ; - fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, SIZE_PRELOAD); - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - // all in one bin - if (bl_chk_valid_all_in_one(&mem_in) == 0) { - // Read all - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - uiLoaderFunc |= FUNC_UPDATE_FW; - } else { - // only rtos - debug_msg("not all-in-one, force behavior as T bin.\r\n"); - adjusted_addr = 0; - adjusted_size = 0; - if (bl_load_rtos_from_non_nvtpack(uiUpdateMainBinBufAddr, uiUpdateFileLen, &adjusted_addr, &adjusted_size) == 0) { - uiFwBaseAddr = adjusted_addr; //fix compressed fit bl_checkDramScanFW() after copy its to temp area, see commit log - uiUpdateFileLen = adjusted_size; - } else { - bl_displayErrMsg("invalid firmware"); - } -#if UPDATE_EMU_CODE - uiLoaderFunc |= FUNC_UPDATE_FW; -#else - uiLoaderFunc |= FUNC_RUN_CARD; -#endif - - } - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - } - // Run FW has lower priority - else if (fat_open_rootfile(RUN_FW_NAME) == TRUE) { - NVTPACK_MEM mem_in ; - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, SIZE_PRELOAD); - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - if (bl_chk_valid_all_in_one(&mem_in) == 0) { - // Read all - uiUpdateFileLen = fat_read_rootfile((UINT8 *)uiUpdateMainBinBufAddr, FAT_READ_TOTAL_FILE_LENGTH); - } else { - // Read rtos - unsigned int adjusted_addr = 0; - unsigned int adjusted_size = 0; - if (bl_load_rtos_from_non_nvtpack(uiUpdateMainBinBufAddr, uiUpdateFileLen, &adjusted_addr, &adjusted_size) != 0) { - bl_displayErrMsg("invalid firmware"); - } else { - uiFwBaseAddr = adjusted_addr; //fix compressed fit bl_checkDramScanFW() after copy its to temp area, see commit log - uiUpdateFileLen = adjusted_size; - } - uiLoaderFunc |= FUNC_RUN_CARD; - } - fat_close_rootfile(); - debug_msg("\r\n"); // for line end RRRRRRR.... - uiLoaderFunc |= FUNC_RUN_CARD; - } -#if UPDATE_SIM_CODE - } -#endif - card_close(); - } else { - debug_msg("card open fail\r\n"); -// while (1); - } - } else if (((gSpecialKeyCallBack == NULL) || gSpecialKeyCallBack()) && - ((gCardDetectCallBack != NULL) || (gCardDetectCallBack() == FALSE))) { - debug_msg("No card inserted\r\n"); - } -#endif - - if (uiLoaderFunc & FUNC_UPDATE_LOADER) { - bl_process_update_loader(uiUpdateBootloaderBufAddr, uiLoaderSize); - } - - // Run FW - UINT32 comp_addr = 0; - UINT32 comp_size = 0; - if (uiLoaderFunc & (FUNC_RUN_CARD | FUNC_UPDATE_FW)) { - debug_msg("RC\r\n"); - NVTPACK_MEM mem_in ; - int chk_valid_all_in_one; -#if (DRAM_RANGE_SCAN_EN == ENABLE) - // First word is code entry point address, once if entry address is 0xC000XXXX - // represent code is running on sram. - debug_msg("Check SRAM fw\r\n"); - if (bl_checkDramScanFW(uiUpdateMainBinBufAddr) == TRUE) { - - debug_msg("This fw is on SRAM\r\n"); - // Enable sram usage - SETREG32(0xF0900128, 0x00000002); - SETREG32(0xF0800128, 0x00000006); - SETREG32(0xF0020060, 0x00030002); - - debug_msg(Dec2HexStr(*((UINT32 *)SRAM_Start_FW))); - debug_msg("before jump\r\n"); -// while (b_debug_go == FALSE); - load_dram_scan(uiUpdateMainBinBufAddr, uiUpdateFileLen); - return *((UINT32 *)SRAM_Start_FW); - } -#endif - mem_in.p_data = (void *)uiUpdateMainBinBufAddr; - mem_in.len = uiUpdateFileLen; - chk_valid_all_in_one = bl_chk_valid_all_in_one(&mem_in); - if (chk_valid_all_in_one == 0) { - // all-in-one flow - // File len got from fat_read_rootfile() may exceed actual file size. - // In such condition, we should use info in NVTPACK_FW_HDR2 - if (((NVTPACK_FW_HDR2 *)uiUpdateMainBinBufAddr)->TotalSize < uiUpdateFileLen) { - uiUpdateFileLen = ((NVTPACK_FW_HDR2 *)uiUpdateMainBinBufAddr)->TotalSize; - mem_in.len = uiUpdateFileLen; - } -#if (REMOVED_FLASH == ENABLE) - bl_displayErrMsg("cannot process all-in-one fw"); -#else - uiFwBaseAddr = bl_process_all_in_one(uiUpdateMainBinBufAddr, uiUpdateFileLen, &p_dram_partition, uiLoaderFunc, &comp_addr, &comp_size); -#endif - } else { - // non-all-in-one flow - // check valid - if (uiLoaderFunc & FUNC_UPDATE_FW) { -#if UPDATE_EMU_CODE - bl_process_update_emu_firmware(uiUpdateMainBinBufAddr, uiUpdateFileLen); -#else - bl_displayErrMsg("cannot write non-all-in-one fw"); -#endif - } - uiFwBaseAddr = bl_process_rtos_only(uiUpdateMainBinBufAddr, mem_in.len, uiLoaderFunc, &comp_addr, &comp_size); - } - - // here uiFwBaseAddr is ready to use. - if (comp_addr == 0) { - HEADINFO *p_headinfo = (HEADINFO *)(uiFwBaseAddr + BIN_INFO_OFFSET_RTOS); - debug_msg("Nrml\r\n"); - if (chk_valid_all_in_one == 0) { - uiUpdateFileLen = p_headinfo->BinLength; - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } else { - // uiUpdateFileLen is already set when file is loaded - } - } else { - debug_msg("Fcompress\r\n"); - //for speed up, u-boot only copy compressed rtos and loader needs to decode it - uiUpdateFileLen = bl_decompress_rtos(comp_addr, comp_size, uiFwBaseAddr); - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } - debug_msg_var("uiUpdateFileLen", uiUpdateFileLen); - //boot from flash or update fw is no need to check sanity because of ecc, turn on it just for debug - if (uiLoaderFunc & FUNC_RUN_CARD) { - bl_checkFW(uiUpdateMainBinBufAddr, uiUpdateFileLen); - } - if (chk_valid_all_in_one == 0) { - bl_update_uItron_headInfo(uiFwBaseAddr, p_dram_partition); - } else { - debug_msg_var("fw load addr", uiUpdateMainBinBufAddr); - bl_update_uItron_headInfo(uiUpdateMainBinBufAddr, p_dram_partition); - } - } else { //boot from flash -#if (REMOVED_FLASH == DISABLE) -#if UPDATE_EMU_CODE -// UINT32 uiNandBlkSize; - // open flash - if (bl_flash_open() != 0) { - bl_displayErrMsg("flash open failed\r\n"); - } - debug_msg("RFlash\r\n"); - if (int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW, g_uiNandBlkSize, (UINT8 *)SDRAM_Start_FW, NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - - uiUpdateFileLen = *(volatile UINT32 *)(SDRAM_Start_FW + 0x168); - - if (int_strg_obj->flash_readSectors(g_uiStartBlkUpdateFW + 1, uiUpdateFileLen - g_uiNandBlkSize, (UINT8 *)(SDRAM_Start_FW + g_uiNandBlkSize), NAND_RW_FIRMWARE) < 0) { - bl_displayErrMsg(RWErrorMsg); - } - - uiFwBaseAddr = bl_process_rtos_only(SDRAM_Start_FW, uiUpdateFileLen, uiLoaderFunc, &comp_addr, &comp_size); - bl_checkFW(SDRAM_Start_FW, uiUpdateFileLen); - uiUpdateMainBinBufAddr = SDRAM_Start_FW; - if (comp_addr == 0) { - debug_msg("Nrml\r\n"); - } else { - debug_msg("Fcompress not support\r\n"); - } - -#else - uiFwBaseAddr = bl_process_flash_boot((UINT8 *)SDRAM_Start_FW, &p_dram_partition, uiLoaderFunc, &comp_addr, &comp_size); - if (comp_addr == 0) { - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } else { - //for speed up, u-boot only copy compressed rtos and loader needs to decode it - uiUpdateFileLen = bl_decompress_rtos(comp_addr, comp_size, uiFwBaseAddr); - uiUpdateMainBinBufAddr = uiFwBaseAddr; - } - // no need to bl_checkFW, because check sanity in flash_read - bl_update_uItron_headInfo(uiFwBaseAddr, p_dram_partition); -#endif -#endif - } - - if (p_dram_partition) { - bl_update_loader_bininfo((unsigned char *)p_dram_partition->fdt_addr, uiLoaderFunc, uiUpdateFileLen); - } - -#if UPDATE_EMU_CODE - debug_msg_var("emu fw len", uiUpdateFileLen); -#endif - g_rtos_load_addr = uiUpdateMainBinBufAddr; - g_rtos_target_addr = uiFwBaseAddr; - g_rtos_size = uiUpdateFileLen; - //invalid Instruciton and data cache - CPUCleanInvalidateDCacheAll(); - CPUInvalidateICacheAll(); - debug_msg_var("rtos start", uiFwBaseAddr); - return uiFwBaseAddr; - -} - -_THUMB2 void loader_setUpdateFwName(char *fileName) -{ - strncpy((char *)UPDATE_FW_NAME, fileName, sizeof(UPDATE_FW_NAME)); -} - -_THUMB2 void loader_setUpdateLdrName(char *fileName) -{ - strncpy((char *)UPDATE_LOADER_NAME, fileName, sizeof(UPDATE_LOADER_NAME)); -} - -_THUMB2 void loader_setRunFwName(char *fileName) -{ - strncpy((char *)RUN_FW_NAME, fileName, sizeof(RUN_FW_NAME)); -} - -_THUMB2 void loader_setRecoveryFwName(char *fileName) -{ - strncpy((char *)RECOVERY_FW_NAME, fileName, sizeof(RECOVERY_FW_NAME)); -} - -_THUMB2 void loader_setRecoveryPartitionID(UINT32 partition_id) -{ - g_uiPartitionID = partition_id; -} - -_THUMB2 void loader_setVersion(UINT32 version) -{ - g_uiVersion = version; -} - -_THUMB2 void loader_installSpecialKeyCB(LDR_SPECIAL_KEY_CB callback) -{ - gSpecialKeyCallBack = callback; -} - -_THUMB2 void loader_installCardDetectCB(LDR_CARD_DETECT_CB callback) -{ - gCardDetectCallBack = callback; -} - -_THUMB2 void loader_installRecoveryTriggerCB(LDR_RECOVERY_TRIGGER_CB callback) -{ - gRecoveryTriggerCallBack = callback; -} - -_THUMB2 void loader_installFastbootKeyCB(LDR_FASTBOOT_KEY_CB callback) -{ - gFastbootKeyCallBack = callback; -} - -_THUMB2 void loader_setStorageIntType(STORAGEINT type, PSTORAGE_OBJ strg_obj) -{ - gStorageIntType = type; - int_strg_obj = strg_obj; -} diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/LDS_LZ_R.lds b/loader/Project/Model/Loader565_Data/Release/ObjectLds/LDS_LZ_R.lds deleted file mode 100644 index 331fba883..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/LDS_LZ_R.lds +++ /dev/null @@ -1,172 +0,0 @@ -/* Linker script for malta - * - * Version: Sourcery G++ Lite 4.3-221 - * Support: https://support.codesourcery.com/GNUToolchain/ - * - * Copyright (c) 2007, 2008, 2009 CodeSourcery, Inc. - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - * */ - -/* Rule: - * 1. to use .o in project layer just type the .o name with file extension. (UiFlow.o) - * 2. to use .o in library layer have to add prefix module name. (Loader565_Data/Release/ObjectLds/DscSystem/SysTask.o) - * */ - -OUTPUT_ARCH(arm) -ENTRY(__start) -SEARCH_DIR(.) - -SECTIONS -{ - .BOOT_EXEC 0xF07C0000|0x00000000: - AT (0) - { - _load_BOOT_EXEC_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/reset.o(.data*)); - Loader565_Data/Release/ObjectLds/Reset_560/reset.o(.text*); - _load_BOOT_EXEC_end_base = .; - } - .LOADER_CONFIGRAM (0xF07C0000|0x00000000) + 0x30: - AT (0x30) - { - _load_LOADER_CONFIGRAM_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Remap_LZ565/configramLZ.o(.data*)); - _load_LOADER_CONFIGRAM_end_base = .; - _load_LOADER_CONFIGRAM_FREQ_PARAM_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/configramFreqParam.o(.data*)); - _load_LOADER_CONFIGRAM_FREQ_PARAM_end_base = .; - } - .LOADER_CONFIGRAM2 (0xF07C0000|0x00000000) + 0x300: - AT (0x300) - { - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_tbl.o(.rodata*)); - config_dram1_tbl_2_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_2_tbl.o(.rodata*)); - } - .LOADER_CORE2_ENTRY_PROGRAM (0xF07C0000|0x00000000) + 0x500: - AT (0x500) - { - _load_core2_entry_program_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o(.text)); - _load_core2_entry_program_end_base = .; - } - .LOADER_REMAP (0xF07C0000|0x00000000) + 0x600: - AT (0x600) - { - _load_LOADER_REMAP_start_base = .; - Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o(.text*); - _load_LOADER_REMAP_end_base = .; - _load_vector_exp_table_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/exp.o(.text*)); - _load_vector_exp_table_end_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o(.text*)); - KEEP(Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o(.rodata*)); - KEEP(Loader565_Data/Release/ObjectLds/Driver/fuart.o(.text* .data* .rodata*)); - KEEP(Loader565_Data/Release/ObjectLds/Debug/debug.o (.text* .data* .bss*)); - KEEP(Loader565_Data/Release/ObjectLds/Common_exFAT/global.o (.text* .data* .bss* .rodata*)); - . = ALIGN(4); /* This is MUST. Ensure section size is word aligned. */ - } - - . = ALIGN(4); - .LOADER_EXEC ADDR(.LOADER_REMAP) + SIZEOF(.LOADER_REMAP) : - AT (LOADADDR(.LOADER_REMAP) + SIZEOF(.LOADER_REMAP)) - { - _loader_exec_start_base = .; - KEEP(Loader565_Data/Release/ObjectLds/Ctrl_Flow/main.o(.part1*)); - KEEP(Loader565_Data/Release/ObjectLds/Driver/rtc.o(.part1*)); - * (.part1) - _loader_exec_end_base = .; - } - _loader_exec_cpu_addr = LOADADDR(.LOADER_EXEC) + ADDR(.BOOT_EXEC); - _loader_exec_size = SIZEOF(.LOADER_EXEC); - - . = ALIGN(4); - .text 0x1000000: - AT (LOADADDR(.LOADER_EXEC) + SIZEOF(.LOADER_EXEC)) - { - _loader_exec_compres_start = .; - _internal_strg_param_start = .; - *(.text*) - _loader_exec_compres_end = .; - } - _loader_exec_compress_load_base = LOADADDR(.text); - _loader_exec_compress_load_cpu_addr = LOADADDR(.text) + ADDR(.BOOT_EXEC); - .ARM.exidx : - { - *(.ARM.exidx*) - *(.gnu.linkonce.armexidx.*) - } - . = ALIGN(4); - .rodata : - { - *(.rodata*) - . = ALIGN(8); /* This is MUST. Ensure ro size is 2 word aligned. */ - } - .dram_text : - AT (LOADADDR(.rodata) + SIZEOF(.rodata)) - { - _loader_dram_text_start_base = .; - * (.dram_text) - } - _loader_dram_text_cpu_addr = LOADADDR(.dram_text) + ADDR(.BOOT_EXEC); - _loader_dram_text_size = SIZEOF(.dram_text); - .data : - AT (LOADADDR(.dram_text) + SIZEOF(.dram_text)) - { - _loader_data_start_base = .; - _load_general_var_base = .; - _image_general_var_base = .; - *(.data*) - _image_general_var_limit = .; - } - _loader_data_cpu_addr = LOADADDR(.data) + ADDR(.BOOT_EXEC); - _loader_data_size = SIZEOF(.data); - .dummy : { LONG (0x00000000) } - . = ALIGN(4); - .got : { *(.got) } - . = ALIGN(4); - .bss : { /* locate bss at DRAM end */ - _image_general_zi_zi_base = .; - *(.bss) - . = ALIGN(0x4000); - _ttb = .; - . = . + 0x4000; - . = ALIGN(0x400); - _ttb_lv2 = .; - . = . + 0x400; - } - .common : - { - __common_base = ABSOLUTE(.); - /* collect "small" un-initialized global data (mark "C" in sym file) */ - *(.scommon*) - /* collect "large" un-initialized global data (mark "B" in sym file) */ - *(COMMON) - __common_limit = ABSOLUTE(.); - } - . = ALIGN(64); - _image_general_zi_zi_limit = ABSOLUTE(.); - _load_load_reset_base = .; - _image_load_reset_base = .; - _image_load_reset_length = .; - _image_load_reset_zi_base = .; - _image_load_reset_zi_limit = .; - . = ALIGN(64); - .loader_heap : - { - _loader_heap_base = .; - . += 0xA0000 + 0x20000 + 0x80000; - } - . = ALIGN(64); - _stack_start = .; - -} diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_ext.d b/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_ext.d deleted file mode 100644 index ad6db6c7a..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_ext.d +++ /dev/null @@ -1,98 +0,0 @@ -Loader565_Data/Release/ObjectLds/Reset_560/Reset_560.a:../../ARC/Lib/Release/Reset_560.a - @echo Copying ObjectLds: $(notdir $@) - @rm -rf $(dir $@) - @mkdir -p $(dir $@) - cp $< $@ - chmod 777 $@ - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/reset.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/reset.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/reset.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/reset.o) Loader565_Data/Release/ObjectLds/Reset_560/reset.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/configramFreqParam.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/configramFreqParam.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/configramFreqParam.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/configramFreqParam.o) Loader565_Data/Release/ObjectLds/Reset_560/configramFreqParam.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_tbl.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_tbl.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_tbl.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_tbl.o) Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_tbl.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_2_tbl.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_2_tbl.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_2_tbl.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_2_tbl.o) Loader565_Data/Release/ObjectLds/Reset_560/config_dram1_2_tbl.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o) Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/exp.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/exp.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/exp.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/exp.o) Loader565_Data/Release/ObjectLds/Reset_560/exp.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o) Loader565_Data/Release/ObjectLds/Reset_560/configDDR.o; - -Loader565_Data/Release/ObjectLds/Remap_LZ565/Remap_LZ565.a:../../ARC/Lib/Release/Remap_LZ565.a - @echo Copying ObjectLds: $(notdir $@) - @rm -rf $(dir $@) - @mkdir -p $(dir $@) - cp $< $@ - chmod 777 $@ - @echo Extracting: Loader565_Data/Release/ObjectLds/Remap_LZ565/configramLZ.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Remap_LZ565/configramLZ.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Remap_LZ565/configramLZ.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Remap_LZ565/configramLZ.o) Loader565_Data/Release/ObjectLds/Remap_LZ565/configramLZ.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o) Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o; - -Loader565_Data/Release/ObjectLds/Driver/Driver.a:../../ARC/Lib/Release/Driver.a - @echo Copying ObjectLds: $(notdir $@) - @rm -rf $(dir $@) - @mkdir -p $(dir $@) - cp $< $@ - chmod 777 $@ - @echo Extracting: Loader565_Data/Release/ObjectLds/Driver/fuart.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Driver/fuart.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Driver/fuart.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Driver/fuart.o) Loader565_Data/Release/ObjectLds/Driver/fuart.o; - @echo Extracting: Loader565_Data/Release/ObjectLds/Driver/rtc.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Driver/rtc.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Driver/rtc.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Driver/rtc.o) Loader565_Data/Release/ObjectLds/Driver/rtc.o; - -Loader565_Data/Release/ObjectLds/Debug/Debug.a:../../ARC/Lib/Release/Debug.a - @echo Copying ObjectLds: $(notdir $@) - @rm -rf $(dir $@) - @mkdir -p $(dir $@) - cp $< $@ - chmod 777 $@ - @echo Extracting: Loader565_Data/Release/ObjectLds/Debug/debug.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Debug/debug.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Debug/debug.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Debug/debug.o) Loader565_Data/Release/ObjectLds/Debug/debug.o; - -Loader565_Data/Release/ObjectLds/Common_exFAT/Common_exFAT.a:../../ARC/Lib/Release/Common_exFAT.a - @echo Copying ObjectLds: $(notdir $@) - @rm -rf $(dir $@) - @mkdir -p $(dir $@) - cp $< $@ - chmod 777 $@ - @echo Extracting: Loader565_Data/Release/ObjectLds/Common_exFAT/global.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Common_exFAT/global.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Common_exFAT/global.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Common_exFAT/global.o) Loader565_Data/Release/ObjectLds/Common_exFAT/global.o; - -Loader565_Data/Release/ObjectLds/Ctrl_Flow/Ctrl_Flow.a:../../ARC/Lib/Release/Ctrl_Flow.a - @echo Copying ObjectLds: $(notdir $@) - @rm -rf $(dir $@) - @mkdir -p $(dir $@) - cp $< $@ - chmod 777 $@ - @echo Extracting: Loader565_Data/Release/ObjectLds/Ctrl_Flow/main.o - $(AR) x $@ $(notdir Loader565_Data/Release/ObjectLds/Ctrl_Flow/main.o) - $(AR) d $@ $(notdir Loader565_Data/Release/ObjectLds/Ctrl_Flow/main.o) - mv $(notdir Loader565_Data/Release/ObjectLds/Ctrl_Flow/main.o) Loader565_Data/Release/ObjectLds/Ctrl_Flow/main.o; - diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib.txt b/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib.txt deleted file mode 100644 index cd1a6d1da..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib.txt +++ /dev/null @@ -1 +0,0 @@ -Loader565_Data/Release/ObjectLds/Reset_560/Reset_560.a Loader565_Data/Release/ObjectLds/Remap_LZ565/Remap_LZ565.a Loader565_Data/Release/ObjectLds/Driver/Driver.a Loader565_Data/Release/ObjectLds/Debug/Debug.a Loader565_Data/Release/ObjectLds/Common_exFAT/Common_exFAT.a Loader565_Data/Release/ObjectLds/Ctrl_Flow/Ctrl_Flow.a \ No newline at end of file diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib_ban.txt b/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib_ban.txt deleted file mode 100644 index 284bcdff6..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/ld_lib_ban.txt +++ /dev/null @@ -1 +0,0 @@ -../../ARC/Lib/Release/Reset_560.a ../../ARC/Lib/Release/Remap_LZ565.a ../../ARC/Lib/Release/Driver.a ../../ARC/Lib/Release/Debug.a ../../ARC/Lib/Release/Common_exFAT.a ../../ARC/Lib/Release/Ctrl_Flow.a \ No newline at end of file diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/libs.txt b/loader/Project/Model/Loader565_Data/Release/ObjectLds/libs.txt deleted file mode 100644 index 90a7eda57..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/libs.txt +++ /dev/null @@ -1 +0,0 @@ -../../ARC/Lib/Release/Ctrl_Flow.a ../../ARC/Lib/Release/nvtpack.a ../../ARC/Lib/Release/Compress.a ../../ARC/Lib/Release/STRGINT_EMMC.a ../../ARC/Lib/Release/Driver.a ../../ARC/Lib/Release/CA9.a ../../ARC/Lib/Release/fdt.a ../../ARC/Lib/Release/Debug.a ../../ARC/Lib/Release/STRGINT_NandSpi.a ../../ARC/Lib/Release/STRGINT_SpiFlash.a ../../ARC/Lib/Release/STRGEXT_Sdio1.a ../../ARC/Lib/Release/Remap_LZ565.a ../../ARC/Lib/Release/Reset_560.a ../../ARC/Lib/Release/Common_exFAT.a diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/objs.txt b/loader/Project/Model/Loader565_Data/Release/ObjectLds/objs.txt deleted file mode 100644 index 48f1cae48..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/objs.txt +++ /dev/null @@ -1 +0,0 @@ -Loader565_Data/Release/ObjectCode/prj_main.o Loader565_Data/Release/ObjectCode/usb_update.o Loader565_Data/Release/ObjectCode/uart_upgrade.o diff --git a/loader/Project/Model/Loader565_Data/Release/ObjectLds/replace.lds b/loader/Project/Model/Loader565_Data/Release/ObjectLds/replace.lds deleted file mode 100644 index 7f47599f2..000000000 --- a/loader/Project/Model/Loader565_Data/Release/ObjectLds/replace.lds +++ /dev/null @@ -1,172 +0,0 @@ -/* Linker script for malta - * - * Version: Sourcery G++ Lite 4.3-221 - * Support: https://support.codesourcery.com/GNUToolchain/ - * - * Copyright (c) 2007, 2008, 2009 CodeSourcery, Inc. - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - * */ - -/* Rule: - * 1. to use .o in project layer just type the .o name with file extension. (UiFlow.o) - * 2. to use .o in library layer have to add prefix module name. (DscSystem/SysTask.o) - * */ - -OUTPUT_ARCH(arm) -ENTRY(__start) -SEARCH_DIR(.) - -SECTIONS -{ - .BOOT_EXEC 0xF07C0000|0x00000000: - AT (0) - { - _load_BOOT_EXEC_start_base = .; - KEEP(Reset_560/reset.o(.data*)); - Reset_560/reset.o(.text*); - _load_BOOT_EXEC_end_base = .; - } - .LOADER_CONFIGRAM (0xF07C0000|0x00000000) + 0x30: - AT (0x30) - { - _load_LOADER_CONFIGRAM_start_base = .; - KEEP(Remap_LZ565/configramLZ.o(.data*)); - _load_LOADER_CONFIGRAM_end_base = .; - _load_LOADER_CONFIGRAM_FREQ_PARAM_start_base = .; - KEEP(Reset_560/configramFreqParam.o(.data*)); - _load_LOADER_CONFIGRAM_FREQ_PARAM_end_base = .; - } - .LOADER_CONFIGRAM2 (0xF07C0000|0x00000000) + 0x300: - AT (0x300) - { - KEEP(Reset_560/config_dram1_tbl.o(.rodata*)); - config_dram1_tbl_2_start_base = .; - KEEP(Reset_560/config_dram1_2_tbl.o(.rodata*)); - } - .LOADER_CORE2_ENTRY_PROGRAM (0xF07C0000|0x00000000) + 0x500: - AT (0x500) - { - _load_core2_entry_program_start_base = .; - KEEP(Reset_560/core2_entry.o(.text)); - _load_core2_entry_program_end_base = .; - } - .LOADER_REMAP (0xF07C0000|0x00000000) + 0x600: - AT (0x600) - { - _load_LOADER_REMAP_start_base = .; - Remap_LZ565/doremapLZ565.o(.text*); - _load_LOADER_REMAP_end_base = .; - _load_vector_exp_table_start_base = .; - KEEP(Reset_560/exp.o(.text*)); - _load_vector_exp_table_end_base = .; - KEEP(Reset_560/configDDR.o(.text*)); - KEEP(Reset_560/configDDR.o(.rodata*)); - KEEP(Driver/fuart.o(.text* .data* .rodata*)); - KEEP(Debug/debug.o (.text* .data* .bss*)); - KEEP(Common_exFAT/global.o (.text* .data* .bss* .rodata*)); - . = ALIGN(4); /* This is MUST. Ensure section size is word aligned. */ - } - - . = ALIGN(4); - .LOADER_EXEC ADDR(.LOADER_REMAP) + SIZEOF(.LOADER_REMAP) : - AT (LOADADDR(.LOADER_REMAP) + SIZEOF(.LOADER_REMAP)) - { - _loader_exec_start_base = .; - KEEP(Ctrl_Flow/main.o(.part1*)); - KEEP(Driver/rtc.o(.part1*)); - * (.part1) - _loader_exec_end_base = .; - } - _loader_exec_cpu_addr = LOADADDR(.LOADER_EXEC) + ADDR(.BOOT_EXEC); - _loader_exec_size = SIZEOF(.LOADER_EXEC); - - . = ALIGN(4); - .text 0x1000000: - AT (LOADADDR(.LOADER_EXEC) + SIZEOF(.LOADER_EXEC)) - { - _loader_exec_compres_start = .; - _internal_strg_param_start = .; - *(.text*) - _loader_exec_compres_end = .; - } - _loader_exec_compress_load_base = LOADADDR(.text); - _loader_exec_compress_load_cpu_addr = LOADADDR(.text) + ADDR(.BOOT_EXEC); - .ARM.exidx : - { - *(.ARM.exidx*) - *(.gnu.linkonce.armexidx.*) - } - . = ALIGN(4); - .rodata : - { - *(.rodata*) - . = ALIGN(8); /* This is MUST. Ensure ro size is 2 word aligned. */ - } - .dram_text : - AT (LOADADDR(.rodata) + SIZEOF(.rodata)) - { - _loader_dram_text_start_base = .; - * (.dram_text) - } - _loader_dram_text_cpu_addr = LOADADDR(.dram_text) + ADDR(.BOOT_EXEC); - _loader_dram_text_size = SIZEOF(.dram_text); - .data : - AT (LOADADDR(.dram_text) + SIZEOF(.dram_text)) - { - _loader_data_start_base = .; - _load_general_var_base = .; - _image_general_var_base = .; - *(.data*) - _image_general_var_limit = .; - } - _loader_data_cpu_addr = LOADADDR(.data) + ADDR(.BOOT_EXEC); - _loader_data_size = SIZEOF(.data); - .dummy : { LONG (0x00000000) } - . = ALIGN(4); - .got : { *(.got) } - . = ALIGN(4); - .bss : { /* locate bss at DRAM end */ - _image_general_zi_zi_base = .; - *(.bss) - . = ALIGN(0x4000); - _ttb = .; - . = . + 0x4000; - . = ALIGN(0x400); - _ttb_lv2 = .; - . = . + 0x400; - } - .common : - { - __common_base = ABSOLUTE(.); - /* collect "small" un-initialized global data (mark "C" in sym file) */ - *(.scommon*) - /* collect "large" un-initialized global data (mark "B" in sym file) */ - *(COMMON) - __common_limit = ABSOLUTE(.); - } - . = ALIGN(64); - _image_general_zi_zi_limit = ABSOLUTE(.); - _load_load_reset_base = .; - _image_load_reset_base = .; - _image_load_reset_length = .; - _image_load_reset_zi_base = .; - _image_load_reset_zi_limit = .; - . = ALIGN(64); - .loader_heap : - { - _loader_heap_base = .; - . += 0xA0000 + 0x20000 + 0x80000; - } - . = ALIGN(64); - _stack_start = .; - -} diff --git a/loader/Project/Model/tmp_awk1 b/loader/Project/Model/tmp_awk1 deleted file mode 100644 index e69de29bb..000000000 From 44e68dd7ef386a81df9f09bd44d6622018e3bb9e Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 10:26:27 +0800 Subject: [PATCH 3/7] =?UTF-8?q?1.=E5=88=A0=E9=99=A4loader=E7=9A=84?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/Loader565_Data/Release/LD98565A.bin | Bin 32768 -> 0 bytes .../Loader565_Data/Release/Loader565.axf | Bin 198712 -> 0 bytes .../Loader565_Data/Release/Loader565.sym | 383 ------------- .../Loader565_Data/Release/Loader565.txt | 517 ------------------ 4 files changed, 900 deletions(-) delete mode 100755 loader/Project/Model/Loader565_Data/Release/LD98565A.bin delete mode 100755 loader/Project/Model/Loader565_Data/Release/Loader565.axf delete mode 100644 loader/Project/Model/Loader565_Data/Release/Loader565.sym delete mode 100644 loader/Project/Model/Loader565_Data/Release/Loader565.txt diff --git a/loader/Project/Model/Loader565_Data/Release/LD98565A.bin b/loader/Project/Model/Loader565_Data/Release/LD98565A.bin deleted file mode 100755 index 30d3e9869531b30aaafd6c628126dd32ef47970a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 diff --git a/loader/Project/Model/Loader565_Data/Release/Loader565.sym b/loader/Project/Model/Loader565_Data/Release/Loader565.sym deleted file mode 100644 index 30aec962a..000000000 --- a/loader/Project/Model/Loader565_Data/Release/Loader565.sym +++ /dev/null @@ -1,383 +0,0 @@ -00000068 A _loader_dram_text_size -000000bc A _loader_data_size -00000388 A _loader_exec_size -000024d8 A _loader_exec_compress_load_base -01000000 T _internal_strg_param_start -01000000 T _loader_exec_compres_start -01000000 t prj_isFastbootKeyPressed -01000010 t prj_checkCardExist -01000024 t prj_issfSpecialKeyPressed -01000050 t prj_isSpecialKeyPressed -01000118 T debug_disable_msg -01000124 T prj_main -01000230 T gpio_getPin -01000258 T Dec2HexStr -01000290 T Dec2HexStr2Bytes -010002f0 T utl_memset -0100034a T utl_memcpy -010003c0 T strlen -010003d4 T strnlen -010003ee T strncpy -0100040a T strncmp -0100042e T strchr -0100044a T memcmp -0100046a T strcmp -01000484 T memchr -01000518 t bl_decompress_rtos -01000540 t bl_get_partition_fdt_offset.part.1 -0100059c t bl_load_rtos_from_non_nvtpack.isra.4.constprop.14 -01000688 t bl_get_fdt_nvt_memory_cfg_property.constprop.16 -010006f4 t bl_get_fdt_cfg -01000850 t bl_update_loader_flag -01000910 t bl_entry_boot -010009a4 t bl_boot_teeos -010009ec t bl_get_fdt_partition_property -01000a3c t bl_get_partition -01000b38 t bl_load_uboot_from_flash -01000cec T bl_flash_open -01000d74 T bl_chk_valid_all_in_one -01000d98 T bl_chk_fdt -01000e6c T bl_chk_uboot -01000e94 t bl_load_uboot_from_all_in_one -01000fb8 T bl_copy_fdt_to_fdt_addr -01001000 t bl_load_fdt_from_flash.constprop.10 -010010a0 T bl_boot_uboot -01001194 T bl_process_all_in_one -01001444 T bl_read_rtos_addr -01001464 T bl_mainFlow -01001f9c T loader_setUpdateFwName -01001fb0 T loader_setUpdateLdrName -01001fc4 T loader_setRunFwName -01001fd8 T loader_setVersion -01001fe8 T loader_installSpecialKeyCB -01001ff8 T loader_installsfSpecialKeyCB -01002008 T loader_installCardDetectCB -01002018 T loader_installFastbootKeyCB -01002028 T loader_setStorageIntType -0100203c t nvtpack_get_uitron_offset -010020b0 T nvtpack_calc_nvt_sum -010020d4 T nvtpack_getver -0100215c T nvtpack_verify -0100224c T nvtpack_get_partition -0100232c t cpu_l2_cache_wait_sync_done -01002340 T cpu_invalidateDCacheBlock -01002394 T cpu_cleanDCacheBlock -010023d8 T cpu_cleanInvalidateDCache -010023f8 T CPUflushReadCache -01002436 T CPUflushWriteCache -01002460 T fdt_check_header -010024b0 T fdt_offset_ptr -010024e0 T fdt_next_tag -0100258c T _fdt_check_node_offset -010025b4 T _fdt_check_prop_offset -010025dc T fdt_next_node -01002650 T fdt_first_subnode -0100267e T fdt_next_subnode -010026b4 t _fdt_offset_ptr -010026d0 t _fdt_mem_rsv -010026ec t _nextprop -01002724 T fdt_string -01002732 T fdt_num_mem_rsv -01002758 T fdt_subnode_offset_namelen -010027e0 T fdt_subnode_offset -010027fe T fdt_get_name -01002840 T fdt_first_property_offset -01002858 T fdt_next_property_offset -01002870 T fdt_get_property_by_offset -010028a0 T fdt_get_property_namelen -01002914 T fdt_get_property -01002940 T fdt_getprop_namelen -01002958 T fdt_getprop_by_offset -01002980 T fdt_getprop -010029ac T fdt_get_alias_namelen -010029dc T fdt_path_offset -01002a6c T fdt_check_full -01002b38 t SMHostSendCommand -01002b54 t flash_close -01002b8c t flash_getBlockSize -01002b96 t flash_setReservedAreaMaxBlockNumber -01002b9c t flash_getTotalSize -01002bac t flash_installAccessCB -01002bbc t flash_installIdentifyCB -01002bcc t flash_setConfig -01002be8 t flash_setFrequency -01002c68 t SMHostGetStatus.constprop.3 -01002c84 t spiflash_getStatus -01002cc8 t spiflash_waitReady -01002d0c t spi_nor_send_cmd -01002d38 t spiflash_enableWriteLatch -01002d44 t sm_card_host_setup_address_cycle.constprop.5 -01002d5c t spiFlash_eraseSector -01002dc0 t spiflash_setStatus -01002e04 t flash_setReservedBadBlockNumber -01002e0c t flash_open -01003164 t flash_readSectors -01003434 t spiFlash_write -0100366c t flash_writePartition -01003694 t flash_writeSectors -010036a8 T nor_get_storage_object -010036bc t SDHostGetStatus -010036e4 t SDHostDataCommand -0100378c t SDHostSimpleCommand -0100380c t CardReadSector -010038cc T card_open -01003b30 T card_close -01003b50 T card_get_type -01003b58 T dma_get_dram_capacity -01003b80 T quary_secure_boot -01003bbc t fat_getclusterstatus -01003ce0 t fat_getnextcluster -01003e18 t fat_getmaxclusternumber -01003e44 t fat_getnextdir_entry -01003e7c t fat_getfirstdir_entry -01003ea4 t fat_getdir_sectornumber -01003ed4 T fat_regfilesystem -01003ef8 T fat_internal_mount_partition -01004260 T fat_internal_initFAT -010042fc T fat_internal_open_rootfile -010045a0 T fat_internal_read_rootfile -0100463c T fat_internal_close_rootfile -0100465c T fat_initFAT -01004674 T fat_open_rootfile -0100468c T fat_read_rootfile -010046a4 T fat_close_rootfile -010046b8 T atoi -010046e4 T __aeabi_uidiv -010046e4 T __udivsi3 -010046e4 t .udivsi3_skip_div0_test -010048d0 T __aeabi_uidivmod -010048f0 T __aeabi_idiv -010048f0 T __divsi3 -010048f8 t .divsi3_skip_div0_test -01004b10 T __aeabi_idivmod -01004b30 W __aeabi_idiv0 -01004b30 W __aeabi_ldiv0 -01004b34 T __aeabi_uldivmod -01004b70 T __popcountsi2 -01004bb8 T __udivmoddi4 -01004ce0 t __debug_err_var_veneer -01004ce8 t __rom_efuse_read_from_thumb -01004cf0 t __cpu_cleanInvalidateDCacheAll_veneer -01004cf8 t __debug_msg_var_from_arm -01004d00 t __CPUInvalidateICacheAll_veneer -01004d08 t __debug_msg_veneer -01004d10 t __rom_LZ_Uncompress_from_thumb -01004d18 t __utl_is_sram_fw_from_thumb -01004d20 t __set_usb_suspend_veneer -01004d28 t __utl_get_bootsrc_veneer -01004d30 t __debug_err_veneer -01004d38 t __UTL_getDrvTmpBufferAddress_from_thumb -01004d40 t __timer_delay_veneer -01004d48 t __fLib_PutSerialStr_veneer -01004d50 t __UTL_setDrvTmpBufferAddress_from_thumb -01004d58 t __fLib_PutSerialChar_veneer -01004d60 T _loader_exec_compres_end -01005894 r GUID_FW2 -010058a4 r GUID_FW -010058b4 r GUID_RES -01005b40 T load_dram_scan -01005b40 T _loader_dram_text_start_base -01005ba0 t __debug_msg_veneer -01005ba8 D _image_general_var_base -01005ba8 D _loader_data_start_base -01005ba8 D _load_general_var_base -01005ba8 d ota_sts.4476 -01005bac d nodeoffset.5197 -01005bb0 d nodeoffset_nvt_memory_cfg.5120 -01005bb4 d RWErrorMsg -01005bc4 d g_uiStartBlkUpdateFW -01005bc8 d UPDATE_LOADER_NAME -01005bd5 d UPDATE_FW_NAME -01005be2 d RUN_FW_NAME -01005bef d LoaderErrorMsg -01005c05 d FWErrorMsg -01005c17 d RECOVERY_FW_NAME -01005c24 d guiSpiClkDiv -01005c28 D spi_nor -01005c60 d uiBufAddr -01005c64 D _image_general_var_limit -01005c80 B gStr -01005c80 B _image_general_zi_zi_base -01005c90 b gStorageIntType -01005c94 b g_dram_partition -01005d14 b g_uiVersion -01005d18 B int_strg_obj -01005d20 b g_emb_uboot -01005d40 B rom_lzma_inflate -01005d44 b g_is_flash_open -01005d48 b g_emb_teeos -01005d68 b g_rtos_load_addr -01005d6c b g_rtos_target_addr -01005d70 b g_rtos_size -01005d78 b g_emb_rtos -01005d98 b gsfSpecialKeyCallBack -01005da0 b g_emb_sys -01005dc0 b gRecoveryTriggerCallBack -01005dc4 b gSpecialKeyCallBack -01005dc8 b gCardDetectCallBack -01005dcc b gFastbootKeyCallBack -01005dd0 B BaseOfStack -01005dd4 B TopOfStack -01005dd8 B lzma_temp_buffer -01015dd8 b uiSpiFlashSize -01015ddc b gSpiProgramCallBack -01015de0 b gSpiIdentifyCallBack -01015de4 b bQuadConfigured -01015de8 b uiQuadReadType -01015dec b bSupportEWSR -01015ded b bDualRead -01015df0 b b_support_RDCR -01015df4 b bQuadEnabled -01015df8 b SDContext -01015e00 b FileSys -01015fc0 b vBitMapBuf -010167c0 b ui32FATPages -010167c4 b RootFileHandle -01016800 b TempBuf -01016a00 b uiBufSize -01016a04 b dbg_count -01016a08 b gFatAccessCallBack -01016a40 b vFatBuf -01036a40 B emuCommonBuf -01036a54 B currentPtr -01038000 B _ttb -0103c000 B _ttb_lv2 -0103c400 A __common_base -0103c400 A __common_limit -0103c400 A _image_general_zi_zi_limit -0103c400 B _image_load_reset_base -0103c400 B _image_load_reset_length -0103c400 B _image_load_reset_zi_base -0103c400 B _image_load_reset_zi_limit -0103c400 B _loader_heap_base -0103c400 B _load_load_reset_base -0117c400 B _stack_start -f07c0000 T _load_BOOT_EXEC_start_base -f07c0000 t PowerOnReset -f07c0004 t LDRAlign -f07c0008 t CompressBase -f07c000c t CalibrationDutyReg -f07c0010 t DDR_PARAM0 -f07c0014 t DDR_PARAM1 -f07c0018 t DDR_PARAM2 -f07c001c t DDR_PARAM3 -f07c0020 t DDR_PARAM4 -f07c0024 t LOADER_SIZE -f07c0028 T __start -f07c002c T _load_BOOT_EXEC_end_base -f07c0030 D ConfigRamTab -f07c0030 D _load_LOADER_CONFIGRAM_start_base -f07c0070 D LoaderInternalInfo -f07c0070 D _load_LOADER_CONFIGRAM_end_base -f07c0070 D _load_LOADER_CONFIGRAM_FREQ_PARAM_start_base -f07c0090 D _load_LOADER_CONFIGRAM_FREQ_PARAM_end_base -f07c0300 R g_dma_config_setting -f07c0368 R config_dram1_tbl_2_start_base -f07c0368 R g_dma_config_setting_2 -f07c0500 T _load_core2_entry_program_start_base -f07c051c t timer_init -f07c053c t wait_interrupt -f07c05e8 T _load_core2_entry_program_end_base -f07c0600 T _load_LOADER_REMAP_start_base -f07c0600 t _start -f07c0620 t _undefined_instruction -f07c0624 t _software_interrupt -f07c0628 t _prefetch_abort -f07c062c t _data_abort -f07c0630 t _irq -f07c0634 t _fiq -f07c0638 T start -f07c06fc t clearbss -f07c0710 t wait_hvy_load -f07c0730 t invTlb -f07c0768 t way_loop -f07c076c t set_loop -f07c07ec t way_loop_L2 -f07c0824 t init_ttb_dram_c1 -f07c0844 t init_ttb_so -f07c08a8 t enable_L1 -f07c0904 t INT_LOOP -f07c0908 T rom_efuse_read -f07c091c T rom_debug_msg -f07c0930 T rom_debug_msg_var -f07c0944 T rom_debug_msg_err -f07c0958 T rom_LZ_Uncompress -f07c096c T rom_Dec2HexStr -f07c0980 t false_reset -f07c09c0 t exp_halt -f07c09c4 t undefined_instruction -f07c0a08 t software_interrupt -f07c0a4c t prefetch_abort -f07c0a90 t data_abort -f07c0ad4 t irq -f07c0ad8 t fiq -f07c0b48 T EXP_Handler -f07c0b48 t EXP_LOOP -f07c0b48 T _load_LOADER_REMAP_end_base -f07c0b48 T _load_vector_exp_table_start_base -f07c0b50 t apply_driving_calibration -f07c0b50 T _load_vector_exp_table_end_base -f07c0b70 t duty_calibration.constprop.1 -f07c0d10 t issue_load_mode.constprop.2 -f07c0d2c T disable_rom_wdt -f07c0d70 T rom_memcpy -f07c0d8c T config_dma -f07c1b20 T set_usb_suspend -f07c1bec T uart0_obj -f07c1bf8 T uart1_obj -f07c1c04 T serial_putc -f07c1c20 T serial2_getc -f07c1c3c T serial2_putc -f07c1c58 T serial_getc -f07c1c74 T uart_openSystemUART -f07c1cd0 T serial_init -f07c1cdc T uart_openSystemUART2 -f07c1d3c T serial2_init -f07c1d48 T uart_getChar_polling -f07c1d78 T uart_chkChar -f07c1d98 T uart_getStr_polling -f07c1df4 T uart_getBinary -f07c1e0c T get_uart_object -f07c1e3c t m_console -f07c1e40 t debug_put_string -f07c1e68 T debug_set_console -f07c1e7c T debug_err -f07c1e94 T debug_err_var -f07c1ecc T debug_dump_addr -f07c1f38 T g_uiDrvTmpBuffer -f07c1f3c T bitCount -f07c1f4c T UTL_setDrvTmpBufferAddress -f07c1f64 T UTL_getDrvTmpBufferAddress -f07c1f7c T UTL_canUpdateSecKey -f07c1fa8 T utl_is_sram_fw -f07c1fc8 T utl_test_checksum -f07c2068 T utl_dram_protect_enable -f07c209c T utl_dram_protect_disable -f07c20b4 T utl_dram_protect_check -f07c20d8 T utl_get_bootsrc -f07c20ec T utl_get_chipversion -f07c2100 t ____popcountsi2_veneer -f07c2108 t __Dec2HexStr_veneer -f07c2150 t _loader_exec_start_base -f07c2150 T main -f07c2254 T rtc_chkS3boot_init -f07c22b0 T rtc_chkS3boot_wait_init -f07c22d0 T rtc_chkS3boot -f07c2308 T timer_delay -f07c2320 T CPUInvalidateICacheAll -f07c2338 T _cache_clean_d_cache_all -f07c2380 T _cache_invalidate_data_cache_all -f07c23c8 T cpu_invalidateDCacheAll -f07c23e2 T _cache_clean_invalidate_d_cache_All -f07c2430 T cpu_cleanInvalidateDCacheAll -f07c2450 T fLib_PutSerialChar -f07c246c T fLib_PutSerialStr -f07c2480 T debug_msg -f07c248a T debug_msg_var -f07c24b8 t __bl_mainFlow_veneer -f07c24c0 t __CPUflushReadCache_veneer -f07c24c8 t __bl_read_rtos_addr_veneer -f07c24d0 t __Dec2HexStr_veneer -f07c24d8 A _loader_exec_compress_load_cpu_addr -f07c24d8 T _loader_exec_end_base -f07c8018 A _loader_dram_text_cpu_addr diff --git a/loader/Project/Model/Loader565_Data/Release/Loader565.txt b/loader/Project/Model/Loader565_Data/Release/Loader565.txt deleted file mode 100644 index a9a825527..000000000 --- a/loader/Project/Model/Loader565_Data/Release/Loader565.txt +++ /dev/null @@ -1,517 +0,0 @@ - -Loader565_Data/Release/Loader565.axf: file format elf32-littlearm -Loader565_Data/Release/Loader565.axf -architecture: arm, flags 0x00000112: -EXEC_P, HAS_SYMS, D_PAGED -start address 0xf07c0028 - -Program Header: -0x70000001 off 0x00024d60 vaddr 0x01004d60 paddr 0x00007238 align 2**2 - filesz 0x00000008 memsz 0x00000008 flags r-- - LOAD off 0x00010000 vaddr 0xf07c0000 paddr 0x00000000 align 2**16 - filesz 0x000024d8 memsz 0x000024d8 flags rwx - LOAD off 0x00020000 vaddr 0x01000000 paddr 0x000024d8 align 2**16 - filesz 0x00005c68 memsz 0x00005c68 flags rwx - LOAD off 0x00025c80 vaddr 0x01005c80 paddr 0x00008180 align 2**16 - filesz 0x00000000 memsz 0x00176780 flags rw- -private flags = 5000200: [Version5 EABI] [soft-float ABI] - -Sections: -Idx Name Size VMA LMA File off Algn - 0 .BOOT_EXEC 0000002c f07c0000 00000000 00010000 2**2 - CONTENTS, ALLOC, LOAD, CODE - 1 .LOADER_CONFIGRAM 00000060 f07c0030 00000030 00010030 2**2 - CONTENTS, ALLOC, LOAD, DATA - 2 .LOADER_CONFIGRAM2 000000d0 f07c0300 00000300 00010300 2**2 - CONTENTS, ALLOC, LOAD, READONLY, DATA - 3 .LOADER_CORE2_ENTRY_PROGRAM 000000e8 f07c0500 00000500 00010500 2**2 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 4 .LOADER_REMAP 00001b50 f07c0600 00000600 00010600 2**3 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 5 .LOADER_EXEC 00000388 f07c2150 00002150 00012150 2**3 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 6 .text 00004d60 01000000 000024d8 00020000 2**3 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 7 .ARM.exidx 00000008 01004d60 00007238 00024d60 2**2 - CONTENTS, ALLOC, LOAD, READONLY, DATA - 8 .rodata 00000dd8 01004d68 00007240 00024d68 2**2 - CONTENTS, ALLOC, LOAD, READONLY, DATA - 9 .dram_text 00000068 01005b40 00008018 00025b40 2**3 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 10 .data 000000bc 01005ba8 00008080 00025ba8 2**2 - CONTENTS, ALLOC, LOAD, DATA - 11 .dummy 00000004 01005c64 0000813c 00025c64 2**0 - CONTENTS, ALLOC, LOAD, DATA - 12 .bss 00036780 01005c80 00008180 00025c80 2**6 - ALLOC - 13 .loader_heap 00140000 0103c400 0003e900 00025c80 2**0 - ALLOC - 14 .comment 00000074 00000000 00000000 00025c68 2**0 - CONTENTS, READONLY - 15 .ARM.attributes 00000037 00000000 00000000 00025cdc 2**0 - CONTENTS, READONLY - 16 .debug_frame 000000c0 00000000 00000000 00025d14 2**2 - CONTENTS, READONLY, DEBUGGING - 17 .debug_line 00000d87 00000000 00000000 00025dd4 2**0 - CONTENTS, READONLY, DEBUGGING - 18 .debug_info 000029b1 00000000 00000000 00026b5b 2**0 - CONTENTS, READONLY, DEBUGGING - 19 .debug_abbrev 00000475 00000000 00000000 0002950c 2**0 - CONTENTS, READONLY, DEBUGGING - 20 .debug_aranges 000000c0 00000000 00000000 00029988 2**3 - CONTENTS, READONLY, DEBUGGING - 21 .debug_loc 000001df 00000000 00000000 00029a48 2**0 - CONTENTS, READONLY, DEBUGGING - 22 .debug_str 0000120b 00000000 00000000 00029c27 2**0 - CONTENTS, READONLY, DEBUGGING -SYMBOL TABLE: -f07c0000 l d .BOOT_EXEC 00000000 .BOOT_EXEC -f07c0030 l d .LOADER_CONFIGRAM 00000000 .LOADER_CONFIGRAM -f07c0300 l d .LOADER_CONFIGRAM2 00000000 .LOADER_CONFIGRAM2 -f07c0500 l d .LOADER_CORE2_ENTRY_PROGRAM 00000000 .LOADER_CORE2_ENTRY_PROGRAM -f07c0600 l d .LOADER_REMAP 00000000 .LOADER_REMAP -f07c2150 l d .LOADER_EXEC 00000000 .LOADER_EXEC -01000000 l d .text 00000000 .text -01004d60 l d .ARM.exidx 00000000 .ARM.exidx -01004d68 l d .rodata 00000000 .rodata -01005b40 l d .dram_text 00000000 .dram_text -01005ba8 l d .data 00000000 .data -01005c64 l d .dummy 00000000 .dummy -01005c80 l d .bss 00000000 .bss -0103c400 l d .loader_heap 00000000 .loader_heap -00000000 l d .comment 00000000 .comment -00000000 l d .ARM.attributes 00000000 .ARM.attributes -00000000 l d .debug_frame 00000000 .debug_frame -00000000 l d .debug_line 00000000 .debug_line -00000000 l d .debug_info 00000000 .debug_info -00000000 l d .debug_abbrev 00000000 .debug_abbrev -00000000 l d .debug_aranges 00000000 .debug_aranges -00000000 l d .debug_loc 00000000 .debug_loc -00000000 l d .debug_str 00000000 .debug_str -00000000 l df *ABS* 00000000 Loader565_Data/Release/ObjectLds/Reset_560/reset.o -f07c0000 l .BOOT_EXEC 00000000 PowerOnReset -f07c0004 l .BOOT_EXEC 00000000 LDRAlign -f07c0008 l .BOOT_EXEC 00000000 CompressBase -f07c000c l .BOOT_EXEC 00000000 CalibrationDutyReg -f07c0010 l .BOOT_EXEC 00000000 DDR_PARAM0 -f07c0014 l .BOOT_EXEC 00000000 DDR_PARAM1 -f07c0018 l .BOOT_EXEC 00000000 DDR_PARAM2 -f07c001c l .BOOT_EXEC 00000000 DDR_PARAM3 -f07c0020 l .BOOT_EXEC 00000000 DDR_PARAM4 -f07c0024 l .BOOT_EXEC 00000000 LOADER_SIZE -00000000 l df *ABS* 00000000 configramLZ.c -00000000 l df *ABS* 00000000 configramFreqParam.c -00000000 l df *ABS* 00000000 config_dram1_tbl.c -00000000 l df *ABS* 00000000 config_dram1_2_tbl.c -00000000 l df *ABS* 00000000 Loader565_Data/Release/ObjectLds/Reset_560/core2_entry.o -f07c053c l .LOADER_CORE2_ENTRY_PROGRAM 00000000 wait_interrupt -f07c051c l .LOADER_CORE2_ENTRY_PROGRAM 00000000 timer_init -00000000 l df *ABS* 00000000 Loader565_Data/Release/ObjectLds/Remap_LZ565/doremapLZ565.o -f07c0600 l .LOADER_REMAP 00000000 _start -f07c0980 l .LOADER_REMAP 00000000 false_reset -f07c0620 l .LOADER_REMAP 00000000 _undefined_instruction -f07c0624 l .LOADER_REMAP 00000000 _software_interrupt -f07c0628 l .LOADER_REMAP 00000000 _prefetch_abort -f07c062c l .LOADER_REMAP 00000000 _data_abort -f07c0630 l .LOADER_REMAP 00000000 _irq -f07c0634 l .LOADER_REMAP 00000000 _fiq -f07c09c4 l .LOADER_REMAP 00000000 undefined_instruction -f07c0a08 l .LOADER_REMAP 00000000 software_interrupt -f07c0a4c l .LOADER_REMAP 00000000 prefetch_abort -f07c0a90 l .LOADER_REMAP 00000000 data_abort -f07c0ad4 l .LOADER_REMAP 00000000 irq -f07c0ad8 l .LOADER_REMAP 00000000 fiq -f07c06fc l .LOADER_REMAP 00000000 clearbss -f07c0710 l .LOADER_REMAP 00000000 wait_hvy_load -f07c0730 l .LOADER_REMAP 00000000 invTlb -f07c0768 l .LOADER_REMAP 00000000 way_loop -f07c076c l .LOADER_REMAP 00000000 set_loop -f07c07ec l .LOADER_REMAP 00000000 way_loop_L2 -f07c0824 l .LOADER_REMAP 00000000 init_ttb_dram_c1 -f07c0844 l .LOADER_REMAP 00000000 init_ttb_so -f07c08a8 l .LOADER_REMAP 00000000 enable_L1 -f07c0904 l .LOADER_REMAP 00000000 INT_LOOP -f07c09c0 l .LOADER_REMAP 00000000 exp_halt -00000000 l df *ABS* 00000000 Loader565_Data/Release/ObjectLds/Reset_560/exp.o -f07c0b48 l .LOADER_REMAP 00000000 EXP_LOOP -00000000 l df *ABS* 00000000 configDDR.c -f07c0b50 l F .LOADER_REMAP 00000020 apply_driving_calibration -f07c0b70 l F .LOADER_REMAP 000001a0 duty_calibration.constprop.1 -f07c0d10 l F .LOADER_REMAP 0000001c issue_load_mode.constprop.2 -00000000 l df *ABS* 00000000 fuart.c -00000000 l df *ABS* 00000000 debug.c -f07c1e40 l F .LOADER_REMAP 00000028 debug_put_string -f07c1e3c l O .LOADER_REMAP 00000004 m_console -00000000 l df *ABS* 00000000 global.c -00000000 l df *ABS* 00000000 main.c -00000000 l df *ABS* 00000000 rtc.c -00000000 l df *ABS* 00000000 Timer.c -00000000 l df *ABS* 00000000 Cache.c -0100232c l F .text 00000014 cpu_l2_cache_wait_sync_done -00000000 l df *ABS* 00000000 prj_main.c -01000000 l F .text 00000010 prj_isFastbootKeyPressed -01000010 l F .text 00000012 prj_checkCardExist -01000024 l F .text 0000002c prj_issfSpecialKeyPressed -01000050 l F .text 000000c8 prj_isSpecialKeyPressed -01005ba8 l O .data 00000004 ota_sts.4476 -00000000 l df *ABS* 00000000 gpio.c -00000000 l df *ABS* 00000000 utility.c -00000000 l df *ABS* 00000000 string.c -00000000 l df *ABS* 00000000 bl_func.c -01000518 l F .text 00000026 bl_decompress_rtos -01000540 l F .text 0000005c bl_get_partition_fdt_offset.part.1 -0100059c l F .text 000000ec bl_load_rtos_from_non_nvtpack.isra.4.constprop.14 -01000688 l F .text 0000006c bl_get_fdt_nvt_memory_cfg_property.constprop.16 -010006f4 l F .text 0000015c bl_get_fdt_cfg -01000850 l F .text 000000c0 bl_update_loader_flag -01000910 l F .text 00000094 bl_entry_boot -010009a4 l F .text 00000048 bl_boot_teeos -010009ec l F .text 00000050 bl_get_fdt_partition_property -01000a3c l F .text 000000fc bl_get_partition -01000b38 l F .text 000001b4 bl_load_uboot_from_flash -01000e94 l F .text 00000124 bl_load_uboot_from_all_in_one -01001000 l F .text 000000a0 bl_load_fdt_from_flash.constprop.10 -01005bac l O .data 00000004 nodeoffset.5197 -01005bb0 l O .data 00000004 nodeoffset_nvt_memory_cfg.5120 -01005bb4 l O .data 0000000e RWErrorMsg -01005bc4 l O .data 00000004 g_uiStartBlkUpdateFW -01005bc8 l O .data 0000000d UPDATE_LOADER_NAME -01005bd5 l O .data 0000000d UPDATE_FW_NAME -01005be2 l O .data 0000000d RUN_FW_NAME -01005bef l O .data 00000016 LoaderErrorMsg -01005c05 l O .data 00000012 FWErrorMsg -01005c17 l O .data 0000000d RECOVERY_FW_NAME -01005c90 l O .bss 00000001 gStorageIntType -01005c94 l O .bss 00000080 g_dram_partition -01005d14 l O .bss 00000004 g_uiVersion -01005d20 l O .bss 00000020 g_emb_uboot -01005d44 l O .bss 00000001 g_is_flash_open -01005d48 l O .bss 00000020 g_emb_teeos -01005d68 l O .bss 00000004 g_rtos_load_addr -01005d6c l O .bss 00000004 g_rtos_target_addr -01005d70 l O .bss 00000004 g_rtos_size -01005d78 l O .bss 00000020 g_emb_rtos -01005d98 l O .bss 00000004 gsfSpecialKeyCallBack -01005da0 l O .bss 00000020 g_emb_sys -01005dc0 l O .bss 00000004 gRecoveryTriggerCallBack -01005dc4 l O .bss 00000004 gSpecialKeyCallBack -01005dc8 l O .bss 00000004 gCardDetectCallBack -01005dcc l O .bss 00000004 gFastbootKeyCallBack -00000000 l df *ABS* 00000000 nvtpack.c -0100203c l F .text 00000074 nvtpack_get_uitron_offset -01005894 l O .rodata 00000010 GUID_FW2 -010058a4 l O .rodata 00000010 GUID_FW -010058b4 l O .rodata 00000010 GUID_RES -00000000 l df *ABS* 00000000 fdt.c -00000000 l df *ABS* 00000000 fdt_ro.c -010026b4 l F .text 0000001c _fdt_offset_ptr -010026d0 l F .text 0000001c _fdt_mem_rsv -010026ec l F .text 00000038 _nextprop -00000000 l df *ABS* 00000000 spi.c -01002b38 l F .text 0000001c SMHostSendCommand -01002b54 l F .text 00000038 flash_close -01002b8c l F .text 0000000a flash_getBlockSize -01002b96 l F .text 00000006 flash_setReservedAreaMaxBlockNumber -01002b9c l F .text 00000010 flash_getTotalSize -01002bac l F .text 00000010 flash_installAccessCB -01002bbc l F .text 00000010 flash_installIdentifyCB -01002bcc l F .text 0000001c flash_setConfig -01002be8 l F .text 00000080 flash_setFrequency -01002c68 l F .text 0000001c SMHostGetStatus.constprop.3 -01002c84 l F .text 00000044 spiflash_getStatus -01002cc8 l F .text 00000044 spiflash_waitReady -01002d0c l F .text 0000002c spi_nor_send_cmd -01002d38 l F .text 0000000c spiflash_enableWriteLatch -01002d44 l F .text 00000018 sm_card_host_setup_address_cycle.constprop.5 -01002d5c l F .text 00000064 spiFlash_eraseSector -01002dc0 l F .text 00000044 spiflash_setStatus -01002e04 l F .text 00000006 flash_setReservedBadBlockNumber -01002e0c l F .text 00000358 flash_open -01003164 l F .text 000002d0 flash_readSectors -01003434 l F .text 00000238 spiFlash_write -0100366c l F .text 00000028 flash_writePartition -01003694 l F .text 00000012 flash_writeSectors -01005c24 l O .data 00000004 guiSpiClkDiv -01015dd8 l O .bss 00000004 uiSpiFlashSize -01015ddc l O .bss 00000004 gSpiProgramCallBack -01015de0 l O .bss 00000004 gSpiIdentifyCallBack -01015de4 l O .bss 00000001 bQuadConfigured -01015de8 l O .bss 00000004 uiQuadReadType -01015dec l O .bss 00000001 bSupportEWSR -01015ded l O .bss 00000001 bDualRead -01015df0 l O .bss 00000004 b_support_RDCR -01015df4 l O .bss 00000001 bQuadEnabled -00000000 l df *ABS* 00000000 SDIO1.c -010036bc l F .text 00000028 SDHostGetStatus -010036e4 l F .text 000000a8 SDHostDataCommand -0100378c l F .text 00000080 SDHostSimpleCommand -0100380c l F .text 000000c0 CardReadSector -01015df8 l O .bss 00000008 SDContext -00000000 l df *ABS* 00000000 cc.c -00000000 l df *ABS* 00000000 efuse.c -00000000 l df *ABS* 00000000 fat.c -01003bbc l F .text 00000124 fat_getclusterstatus -01003ce0 l F .text 00000138 fat_getnextcluster -01003e18 l F .text 0000002c fat_getmaxclusternumber -01003e44 l F .text 00000038 fat_getnextdir_entry -01003e7c l F .text 00000028 fat_getfirstdir_entry -01003ea4 l F .text 00000030 fat_getdir_sectornumber -01016a40 l O .bss 00020000 vFatBuf -01005c60 l O .data 00000004 uiBufAddr -01015e00 l O .bss 00000198 FileSys -01015fc0 l O .bss 00000800 vBitMapBuf -010167c0 l O .bss 00000004 ui32FATPages -010167c4 l O .bss 00000014 RootFileHandle -01016800 l O .bss 00000200 TempBuf -01016a00 l O .bss 00000004 uiBufSize -01016a04 l O .bss 00000004 dbg_count -01016a08 l O .bss 00000004 gFatAccessCallBack -00000000 l df *ABS* 00000000 stdlib.c -00000000 l df *ABS* 00000000 _udivsi3.o -010046e4 l .text 00000000 .udivsi3_skip_div0_test -00000000 l *ABS* 00000000 shift -00000000 l df *ABS* 00000000 _divsi3.o -010048f8 l .text 00000000 .divsi3_skip_div0_test -00000000 l *ABS* 00000000 shift -00000000 l df *ABS* 00000000 _dvmd_tls.o -00000000 l df *ABS* 00000000 _aeabi_uldivmod.o -00000000 l df *ABS* 00000000 libgcc2.c -00000000 l df *ABS* 00000000 libgcc2.c -00000000 l df *ABS* 00000000 boot_load.c -00000000 l df *ABS* 00000000 -f07c8080 l *ABS* 00000000 _loader_data_cpu_addr -f07c2150 l *ABS* 00000000 _loader_exec_cpu_addr -f07c2150 l .LOADER_EXEC 00000000 _loader_exec_start_base -01004ce0 l F .text 00000008 __debug_err_var_veneer -01004ce8 l F .text 00000008 __rom_efuse_read_from_thumb -01004cf0 l F .text 00000008 __cpu_cleanInvalidateDCacheAll_veneer -01004cf8 l F .text 00000008 __debug_msg_var_from_arm -01004d00 l F .text 00000008 __CPUInvalidateICacheAll_veneer -01004d08 l F .text 00000008 __debug_msg_veneer -01004d10 l F .text 00000008 __rom_LZ_Uncompress_from_thumb -01004d18 l F .text 00000008 __utl_is_sram_fw_from_thumb -01004d20 l F .text 00000008 __set_usb_suspend_veneer -01004d28 l F .text 00000008 __utl_get_bootsrc_veneer -01004d30 l F .text 00000008 __debug_err_veneer -01004d38 l F .text 00000008 __UTL_getDrvTmpBufferAddress_from_thumb -01004d40 l F .text 00000008 __timer_delay_veneer -01004d48 l F .text 00000008 __fLib_PutSerialStr_veneer -01004d50 l F .text 00000008 __UTL_setDrvTmpBufferAddress_from_thumb -01004d58 l F .text 00000008 __fLib_PutSerialChar_veneer -01005ba0 l F .dram_text 00000008 __debug_msg_veneer -f07c24b8 l F .LOADER_EXEC 00000008 __bl_mainFlow_veneer -f07c24c0 l F .LOADER_EXEC 00000008 __CPUflushReadCache_veneer -f07c24c8 l F .LOADER_EXEC 00000008 __bl_read_rtos_addr_veneer -f07c24d0 l F .LOADER_EXEC 00000008 __Dec2HexStr_veneer -f07c2100 l F .LOADER_REMAP 00000008 ____popcountsi2_veneer -f07c2108 l F .LOADER_REMAP 00000008 __Dec2HexStr_veneer -f07c20ec g F .LOADER_REMAP 00000010 utl_get_chipversion -0100468c g F .text 00000018 fat_read_rootfile -f07c2068 g F .LOADER_REMAP 00000034 utl_dram_protect_enable -f07c2450 g F .LOADER_EXEC 0000001c fLib_PutSerialChar -010024b0 g F .text 0000002e fdt_offset_ptr -01000e6c g F .text 00000028 bl_chk_uboot -000000bc g *ABS* 00000000 _loader_data_size -f07c0d2c g F .LOADER_REMAP 00000044 disable_rom_wdt -f07c2308 g F .LOADER_EXEC 00000018 timer_delay -010036a8 g F .text 00000014 nor_get_storage_object -f07c1b20 g F .LOADER_REMAP 00000024 set_usb_suspend -01002008 g F .text 00000010 loader_installCardDetectCB -01000000 g .text 00000000 _loader_exec_compres_start -01002940 g F .text 00000018 fdt_getprop_namelen -01002840 g F .text 00000018 fdt_first_property_offset -f07c1fc8 g F .LOADER_REMAP 000000a0 utl_test_checksum -f07c0b50 g .LOADER_REMAP 00000000 _load_vector_exp_table_end_base -01002340 g F .text 00000054 cpu_invalidateDCacheBlock -0103c400 g *ABS* 00000000 __common_base -01002914 g F .text 0000002c fdt_get_property -010029dc g F .text 0000008e fdt_path_offset -01005dd8 g O .bss 00010000 lzma_temp_buffer -01001fd8 g F .text 00000010 loader_setVersion -f07c0944 g F .LOADER_REMAP 00000000 rom_debug_msg_err -f07c0030 g .LOADER_CONFIGRAM 00000000 _load_LOADER_CONFIGRAM_start_base -f07c0300 g O .LOADER_CONFIGRAM2 00000068 g_dma_config_setting -01001fb0 g F .text 00000014 loader_setUpdateLdrName -f07c1d48 g F .LOADER_REMAP 00000030 uart_getChar_polling -00000068 g *ABS* 00000000 _loader_dram_text_size -01003b50 g F .text 00000008 card_get_type -f07c0500 g .LOADER_CORE2_ENTRY_PROGRAM 00000000 _load_core2_entry_program_start_base -0103c400 g *ABS* 00000000 __common_limit -01036a54 g O .bss 00000004 currentPtr -f07c2320 g F .LOADER_EXEC 00000018 CPUInvalidateICacheAll -0100463c g F .text 00000020 fat_internal_close_rootfile -f07c2254 g F .LOADER_EXEC 0000005c rtc_chkS3boot_init -f07c1bf8 g O .LOADER_REMAP 0000000c uart1_obj -01003b80 g F .text 0000003c quary_secure_boot -f07c22b0 g F .LOADER_EXEC 00000020 rtc_chkS3boot_wait_init -f07c0070 g .LOADER_CONFIGRAM 00000000 _load_LOADER_CONFIGRAM_end_base -01004b34 g F .text 00000000 .hidden __aeabi_uldivmod -010046e4 g F .text 000001ec .hidden __udivsi3 -f07c2480 g F .LOADER_EXEC 0000000a debug_msg -f07c1e7c g F .LOADER_REMAP 00000018 debug_err -f07c248a g F .LOADER_EXEC 0000002a debug_msg_var -01000290 g F .text 00000060 Dec2HexStr2Bytes -01002394 g F .text 00000044 cpu_cleanDCacheBlock -01002758 g F .text 00000088 fdt_subnode_offset_namelen -01004bb8 g F .text 00000128 .hidden __udivmoddi4 -01000230 g F .text 00000026 gpio_getPin -010010a0 g F .text 000000f4 bl_boot_uboot -01002732 g F .text 00000026 fdt_num_mem_rsv -f07c0958 g F .LOADER_REMAP 00000000 rom_LZ_Uncompress -01002870 g F .text 00000030 fdt_get_property_by_offset -f07c1c3c g F .LOADER_REMAP 0000001c serial2_putc -01000d98 g F .text 000000d4 bl_chk_fdt -01002018 g F .text 00000010 loader_installFastbootKeyCB -01000fb8 g F .text 00000048 bl_copy_fdt_to_fdt_addr -f07c0070 g O .LOADER_CONFIGRAM 00000020 LoaderInternalInfo -f07c1f4c g F .LOADER_REMAP 00000018 UTL_setDrvTmpBufferAddress -f07c0600 g .LOADER_REMAP 00000000 _load_LOADER_REMAP_start_base -01005ba8 g .data 00000000 _load_general_var_base -f07c1e68 g F .LOADER_REMAP 00000014 debug_set_console -f07c1e94 g F .LOADER_REMAP 00000038 debug_err_var -010003d4 g F .text 0000001a strnlen -01000118 g F .text 0000000c debug_disable_msg -01002980 g F .text 0000002c fdt_getprop -f07c0b48 g .LOADER_REMAP 00000000 EXP_Handler -01036a40 g O .bss 00000014 emuCommonBuf -f07c1c74 g F .LOADER_REMAP 0000005c uart_openSystemUART -01002028 g F .text 00000014 loader_setStorageIntType -010038cc g F .text 00000264 card_open -0103c400 g .loader_heap 00000000 _image_load_reset_zi_base -01005dd4 g O .bss 00000004 TopOfStack -01004b70 g F .text 00000048 .hidden __popcountsi2 -010002f0 g F .text 0000005a utl_memset -01005b40 g .dram_text 00000000 _loader_dram_text_start_base -010048f0 g F .text 00000000 .hidden __aeabi_idiv -010025b4 g F .text 00000028 _fdt_check_prop_offset -01001194 g F .text 000002b0 bl_process_all_in_one -f07c0028 g .BOOT_EXEC 00000000 __start -010042fc g F .text 000002a4 fat_internal_open_rootfile -010027e0 g F .text 0000001e fdt_subnode_offset -01001fc4 g F .text 00000014 loader_setRunFwName -01000484 g F .text 00000094 memchr -01002a6c g F .text 000000cc fdt_check_full -f07c05e8 g .LOADER_CORE2_ENTRY_PROGRAM 00000000 _load_core2_entry_program_end_base -f07c0b48 g .LOADER_REMAP 00000000 _load_LOADER_REMAP_end_base -01001464 g F .text 00000b38 bl_mainFlow -0100267e g F .text 00000036 fdt_next_subnode -f07c002c g .BOOT_EXEC 00000000 _load_BOOT_EXEC_end_base -f07c1c04 g F .LOADER_REMAP 0000001c serial_putc -f07c0368 g O .LOADER_CONFIGRAM2 00000068 g_dma_config_setting_2 -01003ef8 g F .text 00000368 fat_internal_mount_partition -0100040a g F .text 00000024 strncmp -01001f9c g F .text 00000014 loader_setUpdateFwName -01005b40 g F .dram_text 0000005c load_dram_scan -010003ee g F .text 0000001c strncpy -f07c0090 g .LOADER_CONFIGRAM 00000000 _load_LOADER_CONFIGRAM_FREQ_PARAM_end_base -f07c091c g F .LOADER_REMAP 00000000 rom_debug_msg -01004260 g F .text 0000009c fat_internal_initFAT -0103c400 g .loader_heap 00000000 _loader_heap_base -f07c20d8 g F .LOADER_REMAP 00000014 utl_get_bootsrc -f07c0d70 g F .LOADER_REMAP 0000001c rom_memcpy -0100044a g F .text 00000020 memcmp -01002858 g F .text 00000018 fdt_next_property_offset -f07c24d8 g .LOADER_EXEC 00000000 _loader_exec_end_base -01004b30 w F .text 00000004 .hidden __aeabi_ldiv0 -01003ed4 g F .text 00000024 fat_regfilesystem -010028a0 g F .text 00000074 fdt_get_property_namelen -01003b30 g F .text 00000020 card_close -0103c400 g .loader_heap 00000000 _image_load_reset_length -f07c22d0 g F .LOADER_EXEC 00000038 rtc_chkS3boot -f07c2380 g F .LOADER_EXEC 00000048 _cache_invalidate_data_cache_all -f07c0000 g .BOOT_EXEC 00000000 _load_BOOT_EXEC_start_base -01001fe8 g F .text 00000010 loader_installSpecialKeyCB -f07c8018 g *ABS* 00000000 _loader_dram_text_cpu_addr -f07c0368 g .LOADER_CONFIGRAM2 00000000 config_dram1_tbl_2_start_base -f07c2150 g F .LOADER_EXEC 00000104 main -f07c096c g F .LOADER_REMAP 00000000 rom_Dec2HexStr -010020d4 g F .text 00000088 nvtpack_getver -0100258c g F .text 00000028 _fdt_check_node_offset -010020b0 g F .text 00000022 nvtpack_calc_nvt_sum -f07c1c20 g F .LOADER_REMAP 0000001c serial2_getc -010046e4 g F .text 00000000 .hidden __aeabi_uidiv -f07c1df4 g F .LOADER_REMAP 00000018 uart_getBinary -0100465c g F .text 00000018 fat_initFAT -010046a4 g F .text 00000014 fat_close_rootfile -f07c1f38 g O .LOADER_REMAP 00000004 g_uiDrvTmpBuffer -010023f8 g F .text 0000003e CPUflushReadCache -f07c1d3c g F .LOADER_REMAP 0000000a serial2_init -01005ba8 g .data 00000000 _loader_data_start_base -f07c23e2 g F .LOADER_EXEC 0000004e _cache_clean_invalidate_d_cache_All -010048f0 g F .text 00000220 .hidden __divsi3 -f07c0030 g O .LOADER_CONFIGRAM 00000040 ConfigRamTab -f07c0070 g .LOADER_CONFIGRAM 00000000 _load_LOADER_CONFIGRAM_FREQ_PARAM_start_base -01005c80 g .bss 00000000 _image_general_zi_zi_base -0100046a g F .text 0000001a strcmp -f07c0d8c g F .LOADER_REMAP 00000d94 config_dma -f07c1cd0 g F .LOADER_REMAP 0000000a serial_init -01001444 g F .text 00000020 bl_read_rtos_addr -f07c1ecc g F .LOADER_REMAP 0000006c debug_dump_addr -0117c400 g .loader_heap 00000000 _stack_start -010023d8 g F .text 00000020 cpu_cleanInvalidateDCache -f07c2338 g F .LOADER_EXEC 00000048 _cache_clean_d_cache_all -f07c24d8 g *ABS* 00000000 _loader_exec_compress_load_cpu_addr -f07c1bec g O .LOADER_REMAP 0000000c uart0_obj -01002460 g F .text 00000050 fdt_check_header -f07c1d98 g F .LOADER_REMAP 0000005c uart_getStr_polling -f07c246c g F .LOADER_EXEC 00000014 fLib_PutSerialStr -0100224c g F .text 000000e0 nvtpack_get_partition -010027fe g F .text 00000042 fdt_get_name -01002436 g F .text 0000002a CPUflushWriteCache -01038000 g .bss 00000000 _ttb -f07c1e0c g F .LOADER_REMAP 00000030 get_uart_object -01002650 g F .text 0000002e fdt_first_subnode -01005c64 g .data 00000000 _image_general_var_limit -f07c0908 g F .LOADER_REMAP 00000000 rom_efuse_read -f07c1cdc g F .LOADER_REMAP 00000060 uart_openSystemUART2 -0100034a g F .text 00000076 utl_memcpy -0103c400 g .loader_heap 00000000 _image_load_reset_base -f07c1fa8 g F .LOADER_REMAP 00000020 utl_is_sram_fw -010025dc g F .text 00000074 fdt_next_node -010048d0 g F .text 00000020 .hidden __aeabi_uidivmod -f07c23c8 g F .LOADER_EXEC 0000001a cpu_invalidateDCacheAll -000024d8 g *ABS* 00000000 _loader_exec_compress_load_base -01000000 g .text 00000000 _internal_strg_param_start -01005c28 g O .data 00000038 spi_nor -01000cec g F .text 00000088 bl_flash_open -01003b58 g F .text 00000028 dma_get_dram_capacity -f07c209c g F .LOADER_REMAP 00000018 utl_dram_protect_disable -01004674 g F .text 00000018 fat_open_rootfile -01005c80 g O .bss 00000009 gStr -01000124 g F .text 0000010c prj_main -f07c1c58 g F .LOADER_REMAP 0000001c serial_getc -01002724 g F .text 0000000e fdt_string -f07c1f3c g F .LOADER_REMAP 00000010 bitCount -f07c2430 g F .LOADER_EXEC 0000001e cpu_cleanInvalidateDCacheAll -0103c400 g .loader_heap 00000000 _load_load_reset_base -f07c0638 g .LOADER_REMAP 00000000 start -010024e0 g F .text 000000ac fdt_next_tag -010046b8 g F .text 0000002c atoi -01004b30 w F .text 00000004 .hidden __aeabi_idiv0 -010029ac g F .text 00000030 fdt_get_alias_namelen -0103c000 g .bss 00000000 _ttb_lv2 -f07c1d78 g F .LOADER_REMAP 00000020 uart_chkChar -f07c1f7c g F .LOADER_REMAP 0000002c UTL_canUpdateSecKey -00000388 g *ABS* 00000000 _loader_exec_size -f07c1f64 g F .LOADER_REMAP 00000018 UTL_getDrvTmpBufferAddress -010003c0 g F .text 00000014 strlen -01005d18 g O .bss 00000004 int_strg_obj -01000258 g F .text 00000038 Dec2HexStr -f07c0930 g F .LOADER_REMAP 00000000 rom_debug_msg_var -0100042e g F .text 0000001c strchr -01005d40 g O .bss 00000004 rom_lzma_inflate -010045a0 g F .text 0000009c fat_internal_read_rootfile -01004d60 g .text 00000000 _loader_exec_compres_end -f07c20b4 g F .LOADER_REMAP 00000024 utl_dram_protect_check -01004b10 g F .text 00000020 .hidden __aeabi_idivmod -01002958 g F .text 00000028 fdt_getprop_by_offset -0103c400 g .loader_heap 00000000 _image_load_reset_zi_limit -01000d74 g F .text 00000024 bl_chk_valid_all_in_one -01005ba8 g .data 00000000 _image_general_var_base -0103c400 g *ABS* 00000000 _image_general_zi_zi_limit -01005dd0 g O .bss 00000004 BaseOfStack -f07c0b48 g .LOADER_REMAP 00000000 _load_vector_exp_table_start_base -01001ff8 g F .text 00000010 loader_installsfSpecialKeyCB -0100215c g F .text 000000f0 nvtpack_verify - - From 47047f8b0545924907b108ca161b0c8278570120 Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 14:22:44 +0800 Subject: [PATCH 4/7] =?UTF-8?q?1.3=E5=90=AF=E5=8A=A8=E5=8F=AA=E5=81=9A?= =?UTF-8?q?=E9=97=AA=E7=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtos/code/driver/na51089/source/mcu/sf_led.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtos/code/driver/na51089/source/mcu/sf_led.c b/rtos/code/driver/na51089/source/mcu/sf_led.c index f6645341d..6a172e0f9 100755 --- a/rtos/code/driver/na51089/source/mcu/sf_led.c +++ b/rtos/code/driver/na51089/source/mcu/sf_led.c @@ -338,7 +338,7 @@ void sf_led_init(void) static UINT8 dofirst = 1; printf("[%s:%d] s\n", __FUNCTION__, __LINE__); UINT8 startup = sf_get_power_on_mode(); - if(((PWR_ON_SETUP != startup) && (PWR_ON_AUTO != startup) && (PWR_ON_USB != startup))) + if(((PWR_ON_SETUP != startup) && (PWR_ON_USB != startup))) return; if(!dofirst) From 7dd8eef49057f88ce1e3a49f1ee83bea32fb2c90 Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 14:30:01 +0800 Subject: [PATCH 5/7] =?UTF-8?q?1.=E4=BC=98=E5=8C=96rtos=E4=B8=8B=E7=82=B9?= =?UTF-8?q?=E7=81=AF=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BB=A5=E5=85=8D=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E8=B5=84=E6=BA=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S530/DxHunting.c | 8 ++++++-- .../SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S530/DxHunting.c b/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S530/DxHunting.c index f93c9a456..cb9338552 100755 --- a/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S530/DxHunting.c +++ b/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S530/DxHunting.c @@ -364,7 +364,9 @@ THREAD_RETTYPE IrCutCtrlThread(void *arg) THREAD_ENTRY(); Delay_DelayMs(80); - DrvGOIO_Turn_Onoff_IRCUT(2); //IR CUT power off + gpio_clearPin(GPIO_IRCUT_MEN1); + gpio_clearPin(GPIO_IRCUT_MEN2); + //DrvGOIO_Turn_Onoff_IRCUT(2); //IR CUT power off //DBG_DUMP("\r\n [%s:%d] s3 \r\n",__FUNCTION__,__LINE__); g_handle_ir_cut = 0; @@ -387,7 +389,9 @@ static void IrCutCtrlThreadInit(void) if(!g_handle_ir_cut){ DBG_ERR("[ERROR] IR CUT thread creat failed!\r\n"); Delay_DelayMs(80); - DrvGOIO_Turn_Onoff_IRCUT(2); + gpio_clearPin(GPIO_IRCUT_MEN1); + gpio_clearPin(GPIO_IRCUT_MEN2); + //DrvGOIO_Turn_Onoff_IRCUT(2); return ; } else diff --git a/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c b/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c index 96577e6b4..29a88aabd 100755 --- a/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c +++ b/rtos/code/application/source/cardv/SrcCode/Dx/565_HUNTING_EVB_LINUX_4G_S550/DxHunting.c @@ -372,7 +372,9 @@ THREAD_RETTYPE IrCutCtrlThread(void *arg) THREAD_ENTRY(); Delay_DelayMs(80); - DrvGOIO_Turn_Onoff_IRCUT(2); //IR CUT power off + //DrvGOIO_Turn_Onoff_IRCUT(2); //IR CUT power off + gpio_clearPin(GPIO_IRCUT_MEN1); + gpio_clearPin(GPIO_IRCUT_MEN2); //DBG_DUMP("\r\n [%s:%d] s3 \r\n",__FUNCTION__,__LINE__); g_handle_ir_cut = 0; @@ -395,7 +397,9 @@ static void IrCutCtrlThreadInit(void) if(!g_handle_ir_cut){ DBG_ERR("[ERROR] IR CUT thread creat failed!\r\n"); Delay_DelayMs(80); - DrvGOIO_Turn_Onoff_IRCUT(2); + //DrvGOIO_Turn_Onoff_IRCUT(2); + gpio_clearPin(GPIO_IRCUT_MEN1); + gpio_clearPin(GPIO_IRCUT_MEN2); return ; } else From 90f03df218846d278fa54a0e705fcc6ded5474c4 Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 14:30:23 +0800 Subject: [PATCH 6/7] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8Dloader=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c | 83 +++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c index dc1caff95..bcf7c3a6e 100755 --- a/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c +++ b/loader/LibExt/LIBExt_src/Ctrl_Flow/bl_func.c @@ -2065,46 +2065,48 @@ _THUMB2 static int bl_load_uboot_from_flash(unsigned char *p_fdt, unsigned char // debug_err_var("OtaFlag=", info->OtaFlag); return 0; } +/* assume ota_flag is read from partition_sys and in the first word */ +_THUMB2 static UINT32 bl_check_ota_flag(UINT32 buf_fdt, UINT32 buf_size) +{ + int er; + unsigned char *p_fdt = NULL; + DRAM_PARTITION *p_dram_partition = NULL; + unsigned char *p_tmp = (unsigned char *)SDRAM_Start_FW; - /* assume ota_flag is read from partition_sys and in the first word */ - _THUMB2 static UINT32 bl_check_ota_flag(void) - { - int er; - unsigned char *p_fdt = NULL; - DRAM_PARTITION *p_dram_partition = NULL; - unsigned char *p_tmp = (unsigned char *)SDRAM_Start_FW; + // open flash + if (bl_flash_open() != 0) { + debug_msg("flash open failed\r\n"); + return 0; + } - // open flash - if (bl_flash_open() != 0) { - debug_msg("flash open failed\r\n"); - return 0; - } +#if (FDT_SUPPORT) + // load fdt - #if (FDT_SUPPORT) - // load fdt - er = bl_load_fdt_from_flash(p_tmp, SDRAM_Start_FW, &p_fdt); // dtb size less than 32MB to be safer. - if (er != 0) { - debug_err("load fdt failed\r\n"); - return 0; - } - #endif + debug_msg_var("buf_fdt=", buf_fdt); + debug_msg_var("buf_size=", buf_size); + er = bl_load_fdt_from_flash((unsigned char *)buf_fdt, buf_size, &p_fdt); // dtb size less than 32MB to be safer. + if (er != 0) { + debug_err("load fdt failed\r\n"); + return 0; + } +#endif - p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); - if (p_dram_partition == NULL) { - debug_err("null p_dram_partition\r\n"); - return 0; - } + p_dram_partition = (DRAM_PARTITION *)bl_get_fdt_cfg(p_fdt, MODELEXT_TYPE_DRAM_PARTITION); + if (p_dram_partition == NULL) { + debug_err("null p_dram_partition\r\n"); + return 0; + } - if(bl_load_sys_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp)){ - debug_err("bl_load_sys_from_flash failed\r\n"); - return 0; - } + if(bl_load_sys_from_flash((unsigned char *)p_dram_partition->fdt_addr, p_tmp)){ + debug_err("bl_load_sys_from_flash failed\r\n"); + return 0; + } - UINT32* ota_flag = (UINT32*)p_tmp; - debug_msg_var("ota_flag=", *ota_flag); + UINT32* ota_flag = (UINT32*)p_tmp; + debug_msg_var("ota_flag=", *ota_flag); - return (*ota_flag); - } + return (*ota_flag); +} #endif /***********************************************************************************/ @@ -3129,7 +3131,8 @@ _THUMB2 UINT32 bl_mainFlow(void) UINT32 uiTmpBufferAddr = uiheapBufferAddr + FAT_HEAP_BUFFER_SIZE; UINT32 uiUpdateBootloaderBufAddr = uiTmpBufferAddr + 0x4000; UINT32 uiUpdateMainBinBufAddr = SDRAM_Start_FW; - + UINT32 uiOTABufferAddr = uiUpdateBootloaderBufAddr + 0xA000; + UINT32 uiOTABufferSize = 0x10000 * 2; /* 2 blks */ // UART initial sequence //uart_openSystemUART(); // rtc reset shutdown timer @@ -3215,7 +3218,7 @@ _THUMB2 UINT32 bl_mainFlow(void) UINT32 ota_flag = 0; if(gsfSpecialKeyCallBack(0)) { - ota_flag = bl_check_ota_flag(); + ota_flag = bl_check_ota_flag(uiOTABufferAddr, uiOTABufferSize); } #if !(USB_WRITELOADER || UART_UPDATE) @@ -3299,15 +3302,19 @@ _THUMB2 UINT32 bl_mainFlow(void) if (bl_load_rtos_from_non_nvtpack(uiUpdateMainBinBufAddr, uiUpdateFileLen, &adjusted_addr, &adjusted_size) == 0) { uiFwBaseAddr = adjusted_addr; //fix compressed fit bl_checkDramScanFW() after copy its to temp area, see commit log uiUpdateFileLen = adjusted_size; - } else { - bl_displayErrMsg("invalid firmware"); - } + #if UPDATE_EMU_CODE uiLoaderFunc |= FUNC_UPDATE_FW; #else uiLoaderFunc |= FUNC_RUN_CARD; #endif + } else { + debug_err("invalid firmware"); + uiLoaderFunc |= FUNC_RUN_FLASH; + } + + } fat_close_rootfile(); debug_msg("\r\n"); // for line end RRRRRRR.... From 6c774f7b63a13cd60ce5bb0efff7aac5e82ac5ee Mon Sep 17 00:00:00 2001 From: payton Date: Wed, 20 Dec 2023 15:38:06 +0800 Subject: [PATCH 7/7] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E6=9D=A1=EF=BC=8C=E6=9C=89=E5=B7=AE2=E4=B8=AA=E5=83=8F?= =?UTF-8?q?=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../novatek/common/nvt_logo/nvt_display_for_fwupdate.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BSP/u-boot/board/novatek/common/nvt_logo/nvt_display_for_fwupdate.c b/BSP/u-boot/board/novatek/common/nvt_logo/nvt_display_for_fwupdate.c index c00654e27..bce0904a0 100755 --- a/BSP/u-boot/board/novatek/common/nvt_logo/nvt_display_for_fwupdate.c +++ b/BSP/u-boot/board/novatek/common/nvt_logo/nvt_display_for_fwupdate.c @@ -78,7 +78,7 @@ #define LEFTFRAME_ROTATE270 3 #define RIGHTFRAME_ROTATE270 3 #define BAR_X_ROTATE270 36 -#define BAR_Y_ROTATE270 46 +#define BAR_Y_ROTATE270 45 #define BAR_W_ROTATE270 10 //Progressive bar and drawing by CPU. The x-offset is movable #define BAR_H_ROTATE270 8 #define STRING1_X_ROTATE270 36 @@ -951,7 +951,7 @@ void nvt_display_draw(UINT32 u32Id) //printf("g_uiPinPongIdx:%lu g_uiXBarStep:%lu g_uiBarWtmp:%lu tmp:%lu\r\n", g_uiPinPongIdx,g_uiXBarStep,g_uiBarWtmp, (g_uiStr6_h - g_uiBarW)); g_uiXBarStep++; g_uiBarWtmp = g_uiXBarStep*g_uiBarW; - if(g_uiBarWtmp > g_uiStr6_h) + if((g_uiBarWtmp > g_uiStr6_h) || (g_uiXBarStep >= g_uiTotalBarNum)) { g_uiBarWtmp = g_uiStr6_h; } @@ -1312,7 +1312,7 @@ void nvt_display_config(UINT32 config_id, UINT32 vlaue) g_uiTotalBarNum = vlaue*2; //wrtie partition + read back partition g_uiBarW = g_uiStr6_h/(vlaue*2); g_uiBarH = g_uiStr6_w; - //printf("g_uiBarW:%lu\r\n", g_uiBarW); + //printf("g_uiBarW:%lu g_uiBarH:%lu\r\n", g_uiBarW, g_uiBarH); break; } }