⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hsi_test.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6400 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6400.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : hsi_test.c
*  
*	File Description : This file implements mipi hsi test functions.
*
*	Author : Haksoo,Kim
*	Dept. : AP Development Team
*	Created Date : 2007/03/03
*	Version : 0.1 
* 
*	History
*	- Created(Haksoo,Kim 2007/03/03)
*  
**************************************************************************************/

#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "intc.h"
#include "hsi.h"
#include "dma.h"
#include "sysc.h"
#include "timer.h"

#define MIPI_TX_MEM_BASE		(_DRAM_BaseAddress+0x01000000)
#define MIPI_RX_MEM_BASE		(_DRAM_BaseAddress+0x01800000)

volatile u32 *g_uHsiTxData=(volatile u32 *)MIPI_TX_MEM_BASE;
volatile u32 *g_uHsiRxData=(volatile u32 *)MIPI_RX_MEM_BASE;

volatile bool bHsiTxDone = false;
volatile bool bHsiRxDone = false;

u32 g_uHsiPreTxCount=0, g_uHsiTxCount = 0;
u32 g_uHsiRxCount = 0;
u32 g_uHsiDmaTxCnt, g_uHsiDmaRxCnt;

bool bIsBreakTest = FALSE;
bool bBreakResult = FALSE;
bool bHsiLoopback = FALSE;

HSI_OP_MODE g_eHsiOpMode=HSI_INT_MODE;
HSI_FR_MODE g_eHsiFrMode=HSI_FRAME_MODE;
HSI_CHID_MODE g_eHsiChidMode=HSI_SINGLE_CHID_MODE;
HSI_CHID_BITS g_eHsiChidBits=HSI_CHID_3BIT;
HSI_CHID_VALUE g_eHsiChidValue=HSI_CHID_7;
HSI_DMA_RX_TRESH_VAL g_eHsiDmaThresVal=HSI_DREQ_4WORDS;
u8 g_ucHsiDmaRxOnLevel;

DMAC 	oHsiDmaTx, oHsiDmaRx;

//////////
// Function Name : PrepareTxData
// Function Description : This function prepares tx data before starting test
// Input : NONE
// Output : NONE
// Version :
void PrepareTxData(void)
{
	u32 i;

	for(i=1;i<(HSI_TEST_COUNT+1);i++)
	{
		//g_uHsiTxData[i]= (((i+0)%8)<<28)|(((i+1)%8)<<24)|(((i+2)%8)<<20)|(((i+3)%8)<<16)|
		//			(((i+4)%8)<<12)|(((i+5)%8)<<8)|(((i+6)%8)<<4)|(((i+7)%8)<<0);
		g_uHsiTxData[i-1] = ((u16)i<<16)|((u16)i<<0);
	}
	g_uHsiTxData[HSI_TEST_COUNT]=0;
}


//////////
// Function Name : PrepareRxData
// Function Description : This function initializes rx data before starting test
// Input : NONE
// Output : NONE
// Version :
void PrepareRxData(void)
{
	u32 i;

	for(i=0;i<HSI_TEST_COUNT;i++)
	{
		//g_uHsiRxData[i]= 0;
		g_uHsiRxData[i]= 0xffffffff;
	}
}

//////////
// Function Name : CompareTxRxData
// Function Description : This function compares received rx data with expected rx data
// Input : NONE
// Output : NONE
// Version :
u32 CompareTxRxData(void)
{
	u32 i, error_count=0;

	if(bIsBreakTest == TRUE)
	{
		return (!bBreakResult);
	}
	else
	{	
		if(g_uHsiRxCount!=HSI_TEST_COUNT)
		{
			Disp("ERROR:rx data count(%d) is not same as tx count(%d)\n",g_uHsiRxCount,HSI_TEST_COUNT);
						
			for(i=0;i<((g_uHsiRxCount>HSI_TEST_COUNT)?g_uHsiRxCount:HSI_TEST_COUNT);i++)
			{
				if(g_uHsiRxData[i]!=g_uHsiTxData[i])
				{
					error_count++;
					Disp(" %3dth => txData : 0x%08x, rxData : 0x%08x, ",(i+1),g_uHsiTxData[i],g_uHsiRxData[i]);
					if(error_count%2==0)
						Disp("\n");
				}
				if(GetKey()=='x')
				{
					break;
				}
			}
			return (error_count==0?1:error_count);
		}
		else
		{
			for(i=0;i<HSI_TEST_COUNT;i++)
			{
				if(g_uHsiRxData[i]!=g_uHsiTxData[i])
				{
					error_count++;
					Disp(" %3dth => txData : 0x%08x, rxData : 0x%08x, ",(i+1),g_uHsiTxData[i],g_uHsiRxData[i]);
					if(error_count%2==0)
						Disp("\n");
				}
				if(GetKey()=='x')
				{
					break;
				}
			}
			return error_count;
		}
	}
}

//////////
// Function Name : TestLoopbackByInt
// Function Description : mipi hsi loopbak test using interrupt mode
// Input : NONE
// Output : NONE
// Version :
static void TestLoopbackByInt(void)
{	
	bHsiLoopback = true;
	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();
		PrepareRxData();
	}

	//ISR mapping and interrupt enabling
	INTC_SetVectAddr(NUM_HSItx, HSI_Tx_ISR);
	INTC_Enable(NUM_HSItx);
	
	INTC_SetVectAddr(NUM_HSIrx, HSI_Rx_ISR);
	INTC_Enable(NUM_HSIrx);
	
	//register setting
	if(bIsBreakTest == true)
	{
		HSI_SetForTx(g_eHsiOpMode, HSI_FRAME_MODE, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
		HSI_SetForRx(g_eHsiOpMode, HSI_FRAME_MODE, g_eHsiChidMode, g_eHsiChidBits);
	}
	else
	{
		HSI_SetForTx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
		HSI_SetForRx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits);
	}

	HSI_UnmaskTxInt(0x1f);	// unmask all interrupts
	HSI_UnmaskRxInt(0xfb);	// unmask all interrupts except rx-done

	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(!bHsiRxDone)
		{
			if(GetKey()=='x')
			{
				break;
			}
		}
		
		HSI_ClearBreakFrameTx();
		
		//tx-interupt disable
		INTC_Disable(NUM_HSItx);
		
		//rx-interupt disable
		INTC_Disable(NUM_HSIrx);
		INTC_ClearVectAddr();
	}
	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;
			}
		}
		HSI_UnmaskTxInt(0x00);		
		//tx-interupt disable
		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_UnmaskRxInt(0x00);	
		//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 : TestLoopbackByRxDone
// Function Description : mipi hsi loopbak test using only rx-done interrupt
// Input : NONE
// Output : NONE
// Version :
static void TestLoopbackByRxDone(void)
{
	bHsiLoopback = true;
	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("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();
	PrepareRxData();

	//ISR mapping and interrupt enabling
	INTC_SetVectAddr(NUM_HSItx, HSI_Tx_ISR);
	INTC_Enable(NUM_HSItx);
	
	INTC_SetVectAddr(NUM_HSIrx, HSI_Rx_ISR);
	INTC_Enable(NUM_HSIrx);
	
	//register setting
	HSI_SetForTx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
	HSI_SetForRx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits);
	
	HSI_UnmaskTxInt(0x1f);	// unmask all interrupts
	HSI_UnmaskRxInt(0xf4);	// unmask all interrupts except rx-fifo & full rx-fifo timeout

	//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_UnmaskTxInt(0x00);		
	//tx-interupt disable
	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_UnmaskRxInt(0x00);	
	//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 : TestLoopbackByDma
// Function Description : mipi hsi loopbak test using dma mode
// Input : NONE
// Output : NONE
// Version :
static void TestLoopbackByDma(void)
{
	bHsiLoopback = true;
	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_HSItx, HSI_Tx_ISR);
	INTC_Enable(NUM_HSItx);
	
	INTC_SetVectAddr(NUM_HSIrx, HSI_Rx_ISR);
	INTC_Enable(NUM_HSIrx);
	
	//register setting
	HSI_SetForRx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits);
	HSI_SetForTx(g_eHsiOpMode, g_eHsiFrMode, g_eHsiChidMode, g_eHsiChidBits, g_eHsiChidValue);
	
	//////////
	// DMA0 Initailization
	SYSC_SelectDMA(eSEL_HSI_RX, 1);
	SYSC_SelectDMA(eSEL_HSI_TX, 1);
	DMAC_InitCh(DMA0 , DMA_ALL, &oHsiDmaRx);
	DMAC_InitCh(DMA0 , DMA_ALL, &oHsiDmaTx);

	INTC_SetVectAddr(NUM_DMA0 ,HSI_Dma_ISR);
	INTC_Enable(NUM_DMA0);
	
	// Interrupt Clear
	DMACH_ClearIntPending(&oHsiDmaRx);
	DMACH_ClearErrIntPending(&oHsiDmaRx);
	DMACH_ClearIntPending(&oHsiDmaTx);
	DMACH_ClearErrIntPending(&oHsiDmaTx);
	
	HSI_SetDmaForRx(HSI_TEST_COUNT);
	HSI_SetDmaForTx(HSI_TEST_COUNT);
	
	// Enable DMA
	DMACH_Start(&oHsiDmaRx);
	DMACH_Start(&oHsiDmaTx);
	//////////
	
	HSI_UnmaskRxInt(0xfb);	// unmask all interrupts except rx-done
	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);
	
	//tx-interupt disable

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -