📄 hsi_test.c
字号:
INTC_Disable(NUM_HSItx);
Disp("TX COUNT : %d\n",g_uHsiTxCount);
//wait until all data have received or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiRxDone)
{
if(GetKey()=='x')
{
break;
}
}
HSI_DisableRxDma();
DMACH_Stop(&oHsiDmaRx);
INTC_Disable(NUM_DMA0);
DMAC_Close(DMA0 , DMA_ALL, &oHsiDmaTx);
DMAC_Close(DMA0 , DMA_ALL, &oHsiDmaRx);
//rx-interupt disable
INTC_Disable(NUM_HSIrx);
INTC_ClearVectAddr();
Disp("RX COUNT : %d\n",g_uHsiRxCount);
//compare rxData with txData
if(!CompareTxRxData())
{
Disp("\n HSI TX/RX LOOPBACK TEST O.K.\n");
}
return;
}
//////////
// Function Name : TestBd2BdTxByInt
// Function Description : mipi hsi b'd to b'd tx test using interrupt mode
// Input : NONE
// Output : NONE
// Version :
static void TestBd2BdTxByInt(void)
{
bHsiLoopback = false;
g_eHsiOpMode=HSI_INT_MODE;
bIsBreakTest = false;
bBreakResult = false;
g_uHsiDmaTxCnt = 0;
g_uHsiPreTxCount = 0;
g_uHsiTxCount = 0;
bHsiTxDone = false;
g_uHsiDmaRxCnt = 0;
g_uHsiRxCount = 0;
bHsiRxDone = false;
Disp("If you want to test a break frame, press 'b' key...\n");
if(Getc()=='b')
{
bIsBreakTest = true;
g_eHsiFrMode = HSI_FRAME_MODE;
}
else
{
bIsBreakTest = false;
Disp("Select TX Physical Mode...\n");
Disp(" 0 : Stream mode, 1 : Frame mode \n");
g_eHsiFrMode = (HSI_FR_MODE)GetIntNum();
if(g_eHsiFrMode>HSI_FRAME_MODE)
{
Disp("You entered wrong number!!!\n");
return;
}
}
if (bIsBreakTest == false)
{
//prepare data
PrepareTxData();
}
//ISR mapping and interrupt enabling
INTC_SetVectAddr(NUM_HSItx, HSI_Tx_ISR);
INTC_Enable(NUM_HSItx);
//register setting
if(bIsBreakTest == true)
{
HSI_SetForTx(g_eHsiOpMode, HSI_FRAME_MODE, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
}
else
{
HSI_SetForTx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
}
HSI_UnmaskTxInt(0x1f); // unmask all interrupts
if(bIsBreakTest == true)
{
HSI_SetBreakFrameTx();
}
if(bIsBreakTest == true)
{
//wait until all data have received or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiTxDone)
{
if(GetKey()=='x')
{
break;
}
}
HSI_ClearBreakFrameTx();
//tx-interupt disable
INTC_Disable(NUM_HSItx);
}
else
{
//wait until all data have transmitted or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiTxDone)
{
if(GetKey()=='x')
{
break;
}
}
//tx-interupt disable
INTC_Disable(NUM_HSItx);
Disp("TX COUNT : %d\n",g_uHsiTxCount);
}
return;
}
//////////
// Function Name : TestBd2BdTxByDma
// Function Description : mipi hsi b'd to b'd tx test using dma mode
// Input : NONE
// Output : NONE
// Version :
static void TestBd2BdTxByDma(void)
{
bHsiLoopback = false;
bIsBreakTest = false;
bBreakResult = false;
g_eHsiOpMode = HSI_DMA_MODE;
g_uHsiDmaTxCnt = 0;
g_uHsiPreTxCount = 0;
g_uHsiTxCount = 0;
bHsiTxDone = false;
g_uHsiDmaRxCnt = 0;
g_uHsiRxCount = 0;
bHsiRxDone = false;
Disp("Select TX Physical Mode...\n");
Disp(" 0 : Stream mode, 1 : Frame mode \n");
g_eHsiFrMode = (HSI_FR_MODE)GetIntNum();
if(g_eHsiFrMode>HSI_FRAME_MODE)
{
Disp("You entered wrong number!!!\n");
return;
}
//prepare data
PrepareTxData();
//ISR mapping and interrupt enabling
INTC_SetVectAddr(NUM_HSItx, HSI_Tx_ISR);
INTC_Enable(NUM_HSItx);
//register setting
HSI_SetForTx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
//////////
// DMA0 Initailization
SYSC_SelectDMA(eSEL_HSI_TX, 1);
DMAC_InitCh(DMA0 , DMA_ALL, &oHsiDmaTx);
INTC_SetVectAddr(NUM_DMA0 ,HSI_Dma_ISR);
INTC_Enable(NUM_DMA0);
// Interrupt Clear
DMACH_ClearIntPending(&oHsiDmaTx);
DMACH_ClearErrIntPending(&oHsiDmaTx);
HSI_SetDmaForTx(HSI_TEST_COUNT);
// Enable DMA
DMACH_Start(&oHsiDmaTx);
//////////
HSI_UnmaskTxInt(0x1e); // unmask all interrupts except tx-fifo empty
//wait until all data have transmitted or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiTxDone)
{
if(GetKey()=='x')
{
break;
}
}
HSI_DisableTxDma();
DMACH_Stop(&oHsiDmaTx);
INTC_Disable(NUM_DMA0);
DMAC_Close(DMA0 , DMA_ALL, &oHsiDmaTx);
//tx-interupt disable
INTC_Disable(NUM_HSItx);
Disp("TX COUNT : %d\n",g_uHsiTxCount);
return;
}
//////////
// Function Name : TestBd2BdRxByInt
// Function Description : mipi hsi b'd to b'd rx test using interrupt mode
// Input : NONE
// Output : NONE
// Version :
static void TestBd2BdRxByInt(void)
{
bHsiLoopback = false;
bIsBreakTest = false;
bBreakResult = false;
g_eHsiOpMode = HSI_INT_MODE;
g_uHsiDmaTxCnt = 0;
g_uHsiPreTxCount = 0;
g_uHsiTxCount = 0;
bHsiTxDone = false;
g_uHsiDmaRxCnt = 0;
g_uHsiRxCount = 0;
bHsiRxDone = false;
Disp("If you want to test a break frame, press 'b' key...\n");
if(Getc()=='b')
{
bIsBreakTest = true;
g_eHsiFrMode = HSI_FRAME_MODE;
}
else
{
bIsBreakTest = false;
Disp("Select TX Physical Mode...\n");
Disp(" 0 : Stream mode, 1 : Frame mode \n");
g_eHsiFrMode = (HSI_FR_MODE)GetIntNum();
if(g_eHsiFrMode>HSI_FRAME_MODE)
{
Disp("You entered wrong number!!!\n");
return;
}
}
if (bIsBreakTest == false)
{
//prepare data
PrepareTxData();
PrepareRxData();
}
//ISR mapping and interrupt enabling
INTC_SetVectAddr(NUM_HSIrx, HSI_Rx_ISR);
INTC_Enable(NUM_HSIrx);
//register setting
if(bIsBreakTest == true)
{
HSI_SetForRx(g_eHsiOpMode, HSI_FRAME_MODE, g_eHsiChidMode, g_eHsiChidBits);
}
else
{
HSI_SetForRx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits);
}
HSI_UnmaskRxInt(0xfb); // unmask all interrupts except rx-done
if(bIsBreakTest == true)
{
//wait until all data have received or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiRxDone)
{
if(GetKey()=='x')
{
break;
}
}
//rx-interupt disable
INTC_Disable(NUM_HSIrx);
INTC_ClearVectAddr();
}
else
{
//wait until all data have received or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiRxDone)
{
if(GetKey()=='x')
{
break;
}
}
//rx-interupt disable
INTC_Disable(NUM_HSIrx);
INTC_ClearVectAddr();
Disp("RX COUNT : %d\n",g_uHsiRxCount);
}
//compare rxData with txData
if(!CompareTxRxData())
{
Disp("\n HSI TX/RX TEST(b'd to b'd) O.K.\n");
}
return;
}
//////////
// Function Name : TestBd2BdRxByDma
// Function Description : mipi hsi b'd to b'd rx test using Dma mode
// Input : NONE
// Output : NONE
// Version :
static void TestBd2BdRxByDma(void)
{
bHsiLoopback = false;
bIsBreakTest = false;
bBreakResult = false;
g_eHsiOpMode = HSI_DMA_MODE;
g_uHsiDmaTxCnt = 0;
g_uHsiPreTxCount = 0;
g_uHsiTxCount = 0;
bHsiTxDone = false;
g_uHsiDmaRxCnt = 0;
g_uHsiRxCount = 0;
bHsiRxDone = false;
Disp("Select TX Physical Mode...\n");
Disp(" 0 : Stream mode, 1 : Frame mode \n");
g_eHsiFrMode = (HSI_FR_MODE)GetIntNum();
if(g_eHsiFrMode>HSI_FRAME_MODE)
{
Disp("You entered wrong number!!!\n");
return;
}
switch(g_eHsiDmaThresVal)
{
case HSI_DREQ_FULL:
g_ucHsiDmaRxOnLevel = HSI_RXFIFO_DEPTH;
break;
case HSI_DREQ_16WORDS:
g_ucHsiDmaRxOnLevel = 16;
break;
case HSI_DREQ_8WORDS:
g_ucHsiDmaRxOnLevel = 8;
break;
case HSI_DREQ_4WORDS:
default:
g_ucHsiDmaRxOnLevel = 4;
break;
}
//prepare data
PrepareTxData();
PrepareRxData();
//ISR mapping and interrupt enabling
INTC_SetVectAddr(NUM_HSIrx, HSI_Rx_ISR);
INTC_Enable(NUM_HSIrx);
//register setting
HSI_SetForRx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits);
//////////
// DMA0 Initailization
SYSC_SelectDMA(eSEL_HSI_RX, 1);
DMAC_InitCh(DMA0 , DMA_ALL, &oHsiDmaRx);
INTC_SetVectAddr(NUM_DMA0 ,HSI_Dma_ISR);
INTC_Enable(NUM_DMA0);
// Interrupt Clear
DMACH_ClearIntPending(&oHsiDmaRx);
DMACH_ClearErrIntPending(&oHsiDmaRx);
HSI_SetDmaForRx(HSI_TEST_COUNT);
// Enable DMA
DMACH_Start(&oHsiDmaRx);
//////////
HSI_UnmaskRxInt(0xfb); // unmask all interrupts except rx-done
//wait until all data have received or test stops
Disp("If you want to stop, press 'x' key...\n");
while(!bHsiRxDone)
{
if(GetKey()=='x')
{
break;
}
}
HSI_DisableRxDma();
DMACH_Stop(&oHsiDmaRx);
INTC_Disable(NUM_DMA0);
DMAC_Close(DMA0 , DMA_ALL, &oHsiDmaRx);
//rx-interupt disable
INTC_Disable(NUM_HSIrx);
INTC_ClearVectAddr();
Disp("RX COUNT : %d\n",g_uHsiRxCount);
//compare rxData with txData
if(!CompareTxRxData())
{
Disp("\n HSI TX/RX LOOPBACK TEST O.K.\n");
}
return;
}
//////////
// Function Name : Test_MipiHsi
// Function Description : mipi hsi main test function
// Input : NONE
// Output : NONE
// Version :
void HSI_Test(void)
{
int i, sel;
const testFuncMenu menu[]=
{
TestLoopbackByRxDone, "Loopback Mode Test(Using only Rx-Done)\n",
TestLoopbackByInt, "Loopback Mode Test(Interrupt Mode)",
TestBd2BdTxByInt, "B'd to B'd Tx Test(Interrupt Mode)",
TestBd2BdRxByInt, "B'd to B'd Rx Test(Interrupt Mode)\n",
TestLoopbackByDma, "Loopback Mode Test(DMA Mode)",
TestBd2BdTxByDma, "B'd to B'd Tx Test(DMA Mode)",
TestBd2BdRxByDma, "B'd to B'd Rx Test(DMA Mode)",
0,0
};
HSI_SetPort();
while(1)
{
Disp("\n");
for (i=0; (int)(menu[i].desc)!=0; i++)
Disp("%2d: %s\n", i, menu[i].desc);
Disp("\nSelect the function to test : ");
sel = GetIntNum();
Disp("\n");
if (sel == -1)
break;
else if (sel>=0 && sel<(sizeof(menu)/8-1))
(menu[sel].func)();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -