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

📄 pccard_test.c

📁 s3c6400 ADS下官方测试程序
💻 C
字号:
/**************************************************************************************
* 
*	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 : pccard_test.c
*  
*	File Description : This file implements PCCard mode test functions of CF Controller.
*
*	Author : Sunil,Roe
*	Dept. : AP Development Team
*	Created Date : 2007/1/17
*	Version : 0.1 
* 
*	History
*	- Created(Sunil,Roe 2007/1/17)
*   
**************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "def.h"
#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "gpio.h"
#include "intc.h"
#include "dma.h"

#include "pccard.h"
#include "cf.h"

// global variables
u8 g_ucPCCardConNum;
volatile PCCARD_oInform	g_oaPCCARDInform[PCCARD_CONNUM];

// function declaration
void PCCARD_PrintCIS(void);
void PCCARD_OpenMedia(u8, ePCCARD_MODE);
void PCCARD_CloseMedia(void);
void PCCARD_TestClear(void);
void PCCARD_TestRead(void);
u32 PCCARD_SelectMode(void);
void PCCARD_TestWriteRead(void);

const testFuncMenu g_aPCCARDTestFunc[]=
{
	PCCARD_PrintCIS,			"PC Card CIS(Card Information Structure)",
	PCCARD_TestWriteRead,		"PC Card Common memory Write/Read test", 
	PCCARD_TestRead,			"PC Card Common memory Read test",
	PCCARD_TestClear,			"PC Card memory clear data",
	0,0 
};

//////////
// Function Name : PCCARD_Test
// Function Description : This function prints out PCCARD test functions through UART.
// Input : 	NONE
// Output : 	NONE
// Version : v0.1
void PCCARD_Test(void)
{
	u32 uCountFunc = 0;
	s32	iSel = 0;
	

	Disp("\n\n================== PCCARD Function Test =====================\n\n");
	g_ucPCCardConNum = PCCARD_CON0; 
	
	if (!PCCARD_Init(g_ucPCCardConNum))
	{
		Disp("Fail to initialize PCCARD Mode...\n");
		return;
	}

	while(1)
	{
		for (uCountFunc=0; (u32)(g_aPCCARDTestFunc[uCountFunc].desc)!=0; uCountFunc++)
			Disp("%2d: %s\n", uCountFunc, g_aPCCARDTestFunc[uCountFunc].desc);

		Disp("\nSelect the function to test : ");
		iSel =GetIntNum();
		Disp("\n");
		if(iSel == -1) 
			break;

		if (iSel>=0 && iSel<(sizeof(g_aPCCARDTestFunc)/8-1))
			(g_aPCCARDTestFunc[iSel].func) ();
	}

	PCCARD_ReturnPort(g_ucPCCardConNum);
}

/*---------------------------------- Test Functions -------------------------------*/
//////////
// Function Name : PCCARD_PrintCIS
// Function Description : 
//   This function prints out the information of CF Card.
// Input : NONE
// Output : NONE
// Version : v0.1 
void PCCARD_PrintCIS(void)
{
	u16	ucLoopCnt 	= 0;
	u8	ucSubLoopCnt 	= 0;
	u8	aucStr[16] 	= {0};
	u8	ucChar		= 0;
	u32	uCisEnd		= 0;
	
//	PCCARD_OpenMedia(g_ucPCCardConNum,ePCCARD_COMMON_MEMORY);

	Disp("[Card Information Structure.]\n");

	// just test for attribute region
	for (ucLoopCnt=0;ucLoopCnt<6;ucLoopCnt++) //0x01, 04, DF, 4A, 01, FF
	{
   		ucChar = PCCARD_GetAttribData( g_ucPCCardConNum, ucLoopCnt);
   		Disp(" at_addr : 0x%x, at_data : 0x%x\n", ucLoopCnt*2, ucChar);
	}
	while(1)
	{
		ucChar = PCCARD_GetAttribData( g_ucPCCardConNum, (uCisEnd));		// id
//		Disp("addr:0x%x, ucChar:0x%x\n", uCisEnd*2, ucChar);
		if (ucChar == 0xff)	//0xff= termination tuple	
			break;
		uCisEnd++;
		ucChar = PCCARD_GetAttribData( g_ucPCCardConNum, (uCisEnd));		// next tuple pointer
		uCisEnd += ucChar+1;
	}
	Disp("cisEnd=0~%x\n",uCisEnd);

	for (ucLoopCnt=0; ucLoopCnt<=uCisEnd; ucLoopCnt+=1)
	{
		ucChar = PCCARD_GetAttribData( g_ucPCCardConNum, ucLoopCnt);
		aucStr[(ucLoopCnt%0x10)]=ucChar;
		Disp("%2x,",ucChar);
		if ((ucLoopCnt%0x10)>=0xf)
		{
			Disp("//");
			for (ucSubLoopCnt=0; ucSubLoopCnt<0x10; ucSubLoopCnt++)
			{
				if (aucStr[ucSubLoopCnt]>=' ' && aucStr[ucSubLoopCnt]<=127)
					Disp("%c",aucStr[ucSubLoopCnt]);
				else 
					Disp(".");
			}
			Disp("\n");
		}
	}
	Disp("\n");	

//	PCCARD_CloseMedia();	
}

//////////
// Function Name : PCCARD_OpenMedia
// Function Description : 
//   This function initializes PCCard media.
// Input : ucCon - PCCARD Controller Number 
//			ePccardMode - MEM/PrimaryIO/SecondaryIO/ContiguousIO
// Output : NONE
// Version : v0.1 
void PCCARD_OpenMedia(u8 ucCon, ePCCARD_MODE ePccardMode)
{
	PCCARD_SetConfig(ucCon, ePCCARD_WIDTH_16BIT);	// attr mem 16bit, com mem 16bit, IO 16bit
	PCCARD_SetINTMask(ucCon, MASK);				// mask ERR, IREQ, CD
	PCCARD_SetCardAccessTiming(ucCon, 3, 0x19, 9);	// Hold, Command, Setup Timing to access attr/IO/comm area

	PCCARD_ResetCard(ucCon, RESET);					// CF Card Reset

	PCCARD_ChangePCCARDMode(ucCon, ePccardMode);
}

//////////
// Function Name : PCCARD_CloseMedia
// Function Description : 
//   This function closes PCCard media.
// Input : NONE
// Output : NONE
// Version : v0.1 
void PCCARD_CloseMedia(void)
{
	
}

//////////
// Function Name : PCCARD_TestWriteRead
// Function Description : 
//   This function tests memory Write & Read of CF blocks.
// Input : NONE
// Output : NONE
// Version : v0.1 
void PCCARD_TestWriteRead(void)
{
	u32	uMode		= 0;
	u32 uDeviceLba	= 0;
	u32 uBlockCount	= 0;
	u32	uLoopCnt 	= 0;

	uMode = PCCARD_SelectMode();	
	PCCARD_OpenMedia(g_ucPCCardConNum,(ePCCARD_MODE)uMode);

	Disp("\nInput device sector address\n");
	uDeviceLba = (u32)GetIntNum();

	Disp("Input sector count\n");
	uBlockCount = (u32)GetIntNum();

	Disp("Clear buffer!!\n");
	for (uLoopCnt=0; uLoopCnt<uBlockCount*512; uLoopCnt++){
		CF_SetMem(eBYTE, (u32)((u8*)g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf + uLoopCnt), 0);
		CF_SetMem(eBYTE, (u32)((u8*)g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDWriteBuf + uLoopCnt), (uLoopCnt+3)%256);
	}

	Disp("Press Enter \n");	
	getchar();

	PCCARD_WriteBlocks(g_ucPCCardConNum, uDeviceLba, uBlockCount, (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDWriteBuf));
	PCCARD_ReadBlocks(g_ucPCCardConNum, uDeviceLba, uBlockCount, (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf));

	if ( Compare((u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDWriteBuf), (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf), uBlockCount*128) == FALSE )
	{
		Disp("Error detected.. W:0x%x, R:0x%x\n", *(u32 *)((u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDWriteBuf)+512), *(u32 *)((u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf)+512));
		Dump32((u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf), uBlockCount*128);
	}
	else
	{
		Disp("Write/Read in PC Card mode is OK\n");
	}

	PCCARD_CloseMedia();	
}

//////////
// Function Name : PCCARD_TestRead
// Function Description : 
//   This function tests memory clear of CF blocks.
// Input : NONE
// Output : NONE
// Version : v0.1 
void PCCARD_TestRead(void)
{
	u32	uMode		= 0;
	u32 uDeviceLba	= 0;
	u32 uBlockCount	= 0;
	u32	uLoopCnt 	= 0;

	uMode = PCCARD_SelectMode();	
	PCCARD_OpenMedia(g_ucPCCardConNum,(ePCCARD_MODE)uMode);

	Disp("\nInput device sector address\n");
	uDeviceLba = (u32)GetIntNum();

	Disp("Input sector count\n");
	uBlockCount = (u32)GetIntNum();

	Disp("Clear buffer!!\n");
	for (uLoopCnt=0; uLoopCnt<uBlockCount*512/4; uLoopCnt++){
		CF_SetMem(eWORD, (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf + uLoopCnt), 0);
	}

	Disp("Press Enter \n");	
	getchar();

	PCCARD_ReadBlocks(g_ucPCCardConNum, uDeviceLba, uBlockCount, (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf));

	Disp("Dump.....!!\n");
	Dump32((u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDReadBuf), uBlockCount*128);

	PCCARD_CloseMedia();	
}


//////////
// Function Name : PCCARD_TestClear
// Function Description : 
//   This function tests memory clear of CF blocks.
// Input : NONE
// Output : NONE
// Version : v0.1 
void PCCARD_TestClear(void)
{
	u32	uMode		= 0;
	u32 uDeviceLba	= 0;
	u32 uBlockCount	= 0;
	u32	uLoopCnt 	= 0;

	uMode = PCCARD_SelectMode();	
	PCCARD_OpenMedia(g_ucPCCardConNum,(ePCCARD_MODE)uMode);

	Disp("\nInput device sector address\n");
	uDeviceLba = (u32)GetIntNum();

	Disp("Input sector count\n");
	uBlockCount = (u32)GetIntNum();

	Disp("Clear buffer!!\n");
	for (uLoopCnt=0; uLoopCnt<uBlockCount*512/4; uLoopCnt++){
		CF_SetMem(eWORD, (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDWriteBuf + uLoopCnt), 0);
	}

	Disp("Press Enter \n");	
	getchar();

	PCCARD_WriteBlocks(g_ucPCCardConNum, uDeviceLba, uBlockCount, (u32)(g_oaPCCARDInform[g_ucPCCardConNum].puPCCARDWriteBuf));

	Disp("Clear sectors as zero in PC Card mode.\n");

	PCCARD_CloseMedia();	
}

u32 PCCARD_SelectMode(void)
{
	Disp("\nWhich mode do you want test? \n");
	Disp(" 0:Memory mode[D], 1:IO mode1(Contiguous), 2 :IO mode2(Primary), 3 :IO mode3(Secondary)\n");
	return (u32)GetIntNum();
}

⌨️ 快捷键说明

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