#include "../ROM/ROM_Print.h"
#include "../ROM/main.h"
#include "../ROM/ROM_UFS.h"
#include "../ROM/ROM_ISR.h"
#include "../ROM/ROM_CMDHandler.h"
#include "../ROM/ROM_CTL.h"
#include "../ROM/ROM_ISR.h"
#include "../ROM/ROM_Uart.h"
#include "../Global/Type.h"
#include "../Global/Reg_Unipro.h"
#include "../Global/Reg_UFC.h"
//#include "../Global/Layout.h"
#include "../Global/Reg_Nfi.h"
#include "../Global/UPIU.h"
#include "../Global/Register.h"
#include "../Global/UFS_SCSI_Cmd_Set.h"
#include "../Global/Reg_PMU.h"
#include "../Global/Reg_Peripheral.h"
#include "../Global/Reg_UFC.h"
#include "../Global/Reg_LdpcUcc.h"
#include "../Global/Reg_CmdQueue.h"
#include "../Global/Reg_Bm.h"
#include "../UFS/UFS_CMDQ.h"
#include "../UFS/UFS_SystemBlock_Tab.h"
#include "../UFS/UFS_Systick.h"
#include "../UnitTest/UT_UTEntry.h"
#include "../UnitTest/UT_DMAC_Acc_UnitTest.h"
//#define LOG_SAVE
//#include "../UnitTest/UT_Debug.h"
#include "../UnitTest/UT_Memory_Bist.h"
#define DATAIN_BUF_ADDR (UFS_FE_BUF_START_ADDR)
//================================================================
void UFS_UTEntry(void) __attribute__((section("Section_UFS_UTEntry")));
extern LWORD UFS_Entry_SCSI_Random_CDB_Test(LWORD au32_args[4]);
extern LWORD DMAC_ACC_UT_Entry(LWORD au32_args[4]);
extern void DelayMs(LWORD u32_DelayMs);
extern LWORD UFS_Entry_Query_Unit_Test(LWORD au32_args[4]);
extern LWORD Memory_Bist_Entry(LWORD au32_args[4]);
extern LWORD HMAC_Verify_Entry(LWORD au32_args[4]);
extern void ROM_Query_API_Verify(void);
extern void ROM_srand(unsigned int seed);
extern LWORD UFS_Entry_FE_Test(LWORD *);
extern LWORD g32_ROM_MPparam;
extern enum LINK_STATE g32_LinkState;
void ISP_UFS_PostLink_Initial(void);
extern void ROM_memcpy(void *p_dst, void *p_src, LWORD u32_Size);
extern void Get_Random_Data(BYTE * u08_Buf, LWORD u32_Len);
extern void ROM_UFS_Send_Rsp_UPIU(LWORD u32_Response, LWORD u32_RsdlCnt, LWORD u32_DeviceInfo, BYTE u08_RspFlag, LWORD u32_Slot);
extern void ROM_UFS_Polling_LinkStartUp(void);
extern void Print_Hex(void *pv_String, void *pv_BufAddr, LWORD u32_Len);
extern void UFS_Entry(void);
extern void SysBlkMmt_RW_Test(void);
extern LWORD UFS_UT_NFI_Entry(LWORD au32_args[4]);
extern LWORD UFS_Entry_FE_Unit_Test(LWORD u32_args[4]);
extern LWORD ISP_UFS_MP_UpdateValInMP(void);
LWORD FE_Debug_Entry(LWORD au32_args[4]);
extern LWORD UFS_UT_NFI_DBG_Entry(LWORD u32_args[4]);
extern LWORD Systick_Verify_Entry(LWORD au32_args[4]);
extern LWORD UT_Systick_SwitchToPLL(void);
LWORD UT_SYS_CLK_Init();
//================================================================
#define GPIO_8 (0x00000100)
BYTE ga08_UFS_UT_CMD_Prompt[] = ">>> UT, Waiting Host Cmd... <<<\r\n";
BYTE ga08_UFS_UTHelloStr[] = "Hello UFS_UTEntry\n\r";
static LWORD gu32_Systicks = 0;
const t_UT_STRU ast_UT_Module_Func_Reg[UT_MODULE_ID_MAX]=
{
{UT_MODULE_ID_FE, UFS_Entry_FE_Unit_Test, (BYTE *)"FE UT", UT_NO_WAIT_CMD_RETURN,},
{UT_MODULE_ID_QUERY, UFS_Entry_Query_Unit_Test, (BYTE *)"Query_UT", UT_NO_WAIT_CMD_RETURN,},
{UT_MODULE_ID_SCSI_CDB, UFS_Entry_SCSI_Random_CDB_Test, (BYTE *)"SCSI_Random_CDB", UT_NO_WAIT_CMD_RETURN,},
{UT_MODULE_ID_FE_CMD, UFS_Entry_FE_Test, (BYTE *)"FE CMD UT", UT_NO_WAIT_CMD_RETURN,},
{UT_MODULE_ID_HMAC, HMAC_Verify_Entry, (BYTE *)"HMAC_UT", UT_WAIT_CMD_RETURN,},
{UT_MODULE_ID_DMAC_ACC, DMAC_ACC_UT_Entry, (BYTE *)"DMAC_ACC_UT", UT_WAIT_CMD_RETURN,},
{UT_MODULE_ID_MEMBIST, Memory_Bist_Entry, (BYTE *)"Mem Bist", UT_WAIT_CMD_RETURN,},
{UT_MODULE_ID_NFI, UFS_UT_NFI_Entry, (BYTE *)"NFI UT Test", UT_NO_WAIT_CMD_RETURN,},
// {UT_MODULE_ID_FE_ISP_Test, FE_Debug_Entry, (BYTE *)"FE_ISP_Test", UT_NO_WAIT_CMD_RETURN,},
{UT_MODULE_ID_CTL_DBG, UFS_UT_NFI_DBG_Entry, (BYTE *)"CTL DBG", UT_NO_WAIT_CMD_RETURN,},
{UT_MODULE_ID_SYSTICK, Systick_Verify_Entry, (BYTE *)"Systick Test", UT_NO_WAIT_CMD_RETURN,},
};
static LWORD gu32_UT_NFI_MicroCodeBaseAddr = 0;// Store base address of NFI_NORMAL.BIN for NFI UT Test
void FPGA_Systick_IRQ(void)
{
gu32_Systicks++;
}
void ASIC_Systick_IRQ(void)
{
// DBG_Printf("****ASIC Tick:%d *****\r\n", gu32_Systicks);
LWORD u32_Tmp;
gu32_Systicks++;
u32_Tmp = GET_REG_32(REG_GPIO_LEVEL_CFG_ADDR);
if (gu32_Systicks & 0x01)
{
SET_REG_32(REG_GPIO_LEVEL_CFG_ADDR, u32_Tmp | GPIO_8);
}
else
{
SET_REG_32(REG_GPIO_LEVEL_CFG_ADDR, u32_Tmp & (~GPIO_8));
}
}
LWORD Get_Systicks(void)
{
return gu32_Systicks;
}
extern LWORD g32_ROM_SP;
#define INTERRUPT_MAX_NUM (16+16)// reference scatter file
#define ROM_INT_VECTOR_BASE_ADDR (0)
static void Config_VectorTable_BaseAddr(LWORD u32_VTBaseAdr)
{
LWORD u32_Cnt = 0;
__asm volatile ("CPSID I\n");// Disable global interrupt
ROM_memcpy4((void*)u32_VTBaseAdr, (void*)ROM_INT_VECTOR_BASE_ADDR, INTERRUPT_MAX_NUM * 4);// copy default int adr to new area
__asm volatile ("DSB\n");//
SET_REG_32(0xE000ED08, u32_VTBaseAdr);// set VTOR
__asm volatile ("CPSIE I\n");// enable global interrupt
}
static void ISP_CFG_ISREntry(LWORD u32_Entry, ISR_FCT_PTR p_fct)
{
LWORD *pu32_Ptr = (LWORD *)VECTOR_TABLE_BASE_ADDR;
if (u32_Entry < INT_ID_MAX)
{
pu32_Ptr[u32_Entry] = (LWORD)p_fct;
}
return;
}
void UT_Hardfault_Handler_Print(LWORD u32_SP_Val)
{
LWORD *pu32_Ptr = (LWORD *)u32_SP_Val;
DBG_Printf("==>> Hardfault << ==\r\n\tSP:0x%08x\r\n", u32_SP_Val);
DBG_Printf(" >> PC:0x%08x <<\r\n", pu32_Ptr[6]);
// DBG_Printf("#################################################\r\n");
// DBG_Printf("#### Don't Reset, save current environment #####\r\n");
// DBG_Printf("#### If you don't know how to handle #####\r\n");
// DBG_Printf("#################################################\r\n");
// DBG_Printf("[R0]:0x%08x\r\n", pu32_Ptr[0]);
// DBG_Printf("[R1]:0x%08x\r\n", pu32_Ptr[1]);
// DBG_Printf("[R2]:0x%08x\r\n", pu32_Ptr[2]);
// DBG_Printf("[R3]:0x%08x\r\n", pu32_Ptr[3]);
// DBG_Printf("[R12]:0x%08x\r\n", pu32_Ptr[4]);
// DBG_Printf("[LR]:0x%08x\r\n", pu32_Ptr[5]);
// DBG_Printf("[PC]:0x%08x\r\n", pu32_Ptr[6]);
// DBG_Printf("[xPSR]:0x%08x\r\n", pu32_Ptr[7]);
while(1);
}
void UT_Hardfault_Handler(void) __attribute__((naked));
void UT_Hardfault_Handler(void)
{
__asm("movs r0, #4\n"
"mov r1, lr\n"
"tst r0, r1\n"
"beq Using_MSP\n"
"mrs r0,psp\n"
"ldr r1, =UT_Hardfault_Handler_Print \n"
"bx r1\n"
"Using_MSP: \n"
"mrs r0, msp\n"
"ldr r1, =UT_Hardfault_Handler_Print \n"
"bx r1\n"
);
}
//****************************************************************
//Function name:
// UFS_UT_Function_Call
//
//Description:
// Calling Unit test function
//
//Arguments:
// pst_FunsStructPtr: UT Functions base addr
// u32_TestCasesNums: UT Numbers
// pu08_UTName: UT Name string addr
//
//Return Values:
//
// Author Date Version Action
//****************************************************************
#if 0
void UFS_UT_Function_Call(const t_UFS_UT_Func *pst_FunsStructPtr, LWORD u32_TestCasesNums, char * pu08_UTName)
{
LWORD u32_Cnt = 0;
LWORD u32_Ret = 0;
LWORD u32_SuccCnt =0, u32_FailCnt = 0;
LWORD u32_StartTick = 0;
LWORD u32_EndTick = 0;
LWORD u32_TotalTimeConsume = 0;
LWORD u32_Day = 0, Hours = 0, Minutes = 0, Seconds = 0, MilliSeconds = 0;
LWORD u32_Temp= 0;
DBG_Printf("======= %s Has %d Test cases=======\r\n", pu08_UTN