nt9856x/loader/LibExt/LIBExt_src/Ctrl_Flow/main.c

169 lines
4.9 KiB
C
Executable File

/*
Main control function
This file is implement by user mode
@file main.c
Copyright Novatek Microelectronics Corp. 2014. All rights reserved.
*/
#include "main.h"
#include "bl_func.h"
#include "Cache.h"
#include "global.h"
#include "fuart.h"
#include "debug.h"
extern char _loader_exec_compres_start[];
extern char _loader_exec_compress_load_cpu_addr[];
extern char _load_LOADER_CONFIGRAM_FREQ_PARAM_start_base[];
extern char _load_BOOT_EXEC_start_base[];
extern char _loader_data_start_base[];
#define _THUMB2 __attribute__((target("thumb2")))
//---------------------------------------------------------------------------
// Static function
//---------------------------------------------------------------------------
/*
BL_RunPartOne
Expend loader if use compress
@return void
*/
_THUMB2 static void BL_RunPartOne(void)
{
#if (_LOADER_COMPRESSED_ == ENABLE)
#if (_PROCESS_2ND_CHECKSUM_ == 1)
NVTPACK_MEM mem = {0};
UINT16 sum;
UINT16 src_sum;
#endif
UINT8 *in_addr = (UINT8 *)(_loader_exec_compress_load_cpu_addr);
UINT8 *out_addr = (UINT8 *)(_loader_exec_compres_start);
UINT32 uiCompressedOutSize;
// Get decompress size within specific header
uiCompressedOutSize = (((UINT32)*(in_addr + 12)) << 24) +
(((UINT32)*(in_addr + 13)) << 16) +
(((UINT32)*(in_addr + 14)) << 8) +
((UINT32)*(in_addr + 15));
// Decompress loader image
#if (_PROCESS_2ND_CHECKSUM_ == 1)
*(UINT32 *)0xF0290000 = 'L';
#endif
LZ_Un_compress((unsigned char *)(in_addr + LDC_HEADER_SIZE), (unsigned char *)(out_addr), uiCompressedOutSize);
#if (_PROCESS_2ND_CHECKSUM_ == 1)
*(UINT32 *)0xF0290000 = 'Z';
#endif
// Need to clean data cache
CPUInvalidateICacheAll();
#if (_PROCESS_2ND_CHECKSUM_ == 1)
*(UINT32 *)0xF0290000 = 'I';
#endif
CPUCleanInvalidateDCacheAll();
#if (_PROCESS_2ND_CHECKSUM_ == 1)
*(UINT32 *)0xF0290000 = 'D';
#endif
#if (_PROCESS_2ND_CHECKSUM_ == 1)
// debug_msg_var("addr", (UINT32)(_load_BOOT_EXEC_start_base));
mem.p_data = (void *)out_addr;
mem.len = *(UINT16 *)(_load_BOOT_EXEC_start_base + 0x14 + 0x2);
src_sum = *(UINT16 *)(_load_BOOT_EXEC_start_base + 0x14);
sum = nvtpack_calc_nvt_sum(&mem);
if(src_sum == sum) {
debug_msg("\r\nCHKSUM UNZOK!");
} else {
debug_msg_var("\r\nCHKSUM UNZNG!", sum);
debug_msg_var("calc_sum=",sum);
debug_msg_var(" bin_sum=",src_sum);
}
#else
debug_msg("\r\nUNZOK!");
#endif
#else
#endif
}
/*
void BL_PostHandle(void)
{
UINT32 uiParamCnt;
UINT32 *pParamOffset;
UINT32 *pDramParam;
pParamOffset = (UINT32*)(&_load_LOADER_CONFIGRAM_FREQ_PARAM_start_base[5*4]);
pDramParam = (UINT32*)(*pParamOffset);
for (uiParamCnt=0; uiParamCnt < 7*2; uiParamCnt++)
{
OUTREG32(DDR_PARAM_LEVEL_0_ADDR + uiParamCnt*4, pDramParam[uiParamCnt]);
}
// Disable IDE2 clock
CLRREG32(0xC0020070, 1<<17);
//invalid Instruciton and data cache
CPUCleanInvalidateDCacheAll();
CPUInvalidateICacheAll();
}
*/
_THUMB2 UINT32 main(void)
{
UINT32 uiReturn;
UINT32 load_addr, target_addr, uitron_size;
UINT32 i;
UINT32 *pSrc, *pDst;
// Run part one loader
// If using compressed loader, just decompress the loader image at first!
BL_RunPartOne();
utl_dram_protect_enable((UINT32)_loader_exec_compres_start, (UINT32)(_loader_data_start_base - _loader_exec_compres_start));
uiReturn = bl_mainFlow();
utl_dram_protect_check();
utl_dram_protect_disable();
bl_read_rtos_addr(&load_addr, &target_addr, &uitron_size);
if (load_addr != target_addr) {
uart_putSystemUARTStr("uitron target_addr= ");
PrintDec2Hex(target_addr);
uart_putSystemUARTStr("\r\n");
uart_putSystemUARTStr("uitron load_addr= ");
PrintDec2Hex(load_addr);
uart_putSystemUARTStr("\r\n");
uart_putSystemUARTStr("Copy from load to target by loader, this may has longer boot time\r\n");
CPUflushReadCache(0, 128*1024);
CPUInvalidateICacheAll();
#if 1
// disable MMU
{ \
__asm__ __volatile__( \
"mrc p15, 0, r0, c1, c0, 0\n\t" \
"bic r0, r0, #0x5\n\t" \
"bic r0, r0, #0x1000\n\t" \
"mcr p15, 0, r0, c1, c0, 0\n\t" \
: \
: \
: "r0" \
); \
}
asm volatile("dsb");
asm volatile("isb");
uart_putSystemUARTStr("disable MMU done\r\n");
#endif
pSrc = (UINT32*)load_addr;
pDst = (UINT32*)target_addr;
for (i=0; i<uitron_size; i+=4) {
*pDst++ = *pSrc++;
}
// Don't invoke uart_putSystemUARTStr() hereafter.
// Because ZI/RW may be corrupted after code copy
// uart_putSystemUARTStr("copy done\r\n");
}
//BL_PostHandle();
return uiReturn;
}