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

📄 test_ide.c

📁 arm9.rar
💻 C
字号:
/****************************************************************************
【文  件  名  称】Test_IDE.C
【功  能  描  述】三星S3C2410A板demo程序代码
【程  序  版  本】4.0
【创建人及创建日期】icesoar//2002年11月19日19:26
【修改人及修改日期】icesoar//2005-2-18 13:55
****************************************************************************/

//***************************************************************************
#include "def.h"
#include "2410addr.h"
#include "config.h"
#include "board.h"
#include "utils.h"

//	assign IDE_DIOR = ! ( (!nOE) && (!nGCS4) ) ;
//	assign IDE_DIOW = ! ( (!nWE) && (!nGCS4) ) ;

#define	IDE_DAT		( 0x20000020 )
#define	IDE_ERR		( 0x20000022 )
#define	IDE_SEC_CNT	( 0x20000024 )
#define	IDE_LBA0	( 0x20000026 )
#define	IDE_LBA1	( 0x20000028 )
#define	IDE_LBA2	( 0x2000002a )
#define	IDE_LBA_SEL	( 0x2000002c )
#define	IDE_CMD		( 0x2000002e )

#define	IDE_FEATURE	IDE_ERR

#define	GetIdeStatus()	inportw(IDE_CMD)
#define	SetIdeCmd(cmd)	outportw((cmd), IDE_CMD)
#define	GetIdeErr()		inportw(IDE_ERR)
#define	ReadIdeData()	inportw(IDE_DAT)
#define	IdeIsBusy()		(inportw(IDE_CMD)&0x80)
#define	WaitIdeBusy()	while(IdeIsBusy())

static struct{
	U16 InstallWord;
	U16 Cylinders;
	U16 Heads;
	U16 nFmtBytesPerTrack;
	U16 nFmtBytesPerSector;
	U16 SectorsPerTrack;
	U16 PID[3];
	char SerString[21];
	U16 SectorBufferType;
	U16 SectorBufferPages;
	U16 LongRdWrECCBytes;
	char FirmwareVersion[9];
	char ProductName[41];
	U16 IntSecCntInMltSecRW;
	U16 DwordIoEn;
	U16 LBA_DMA;
	U16 PIOTimer;
	U16 DMATimer;
	U16 CurCylinder;
	U16 CurHead;
	U16 CurSectorsPerTrack;
	U32 TotalSectors;
	U16 IntTransSectors;
	U32 TotalSectorsLBA;
	U16 SWDMA;
	U16 MWDMA;
}HDPara;

void GetIdeInfo(void)
{
	int i;
	U16 tmp;

	printf( "\nGet IDE Informatin! \n" ) ;
	
	//WaitIdeBusy();
	for(i=0; i<4; i++) {
		Delay(500);
		if(!IdeIsBusy())
			break;
	}
	if(i>=4)
		return;
	
	SetIdeCmd(0xec);
	//WaitIdeBusy();
	for(i=0; i<4; i++) 
	{
		Delay(500);
		if(!IdeIsBusy())		break;
	}
	
	if(i>=4)
	{
		printf( "\nGet IDE Informatin is failed! \n" ) ;
		printf( "Please make sure the hard disk is connected to the IDE and Power on! \n\n" ) ;
		return;
	}
	
	{
		HDPara.InstallWord = ReadIdeData();		
		HDPara.Cylinders = ReadIdeData();
		tmp = ReadIdeData();
		HDPara.Heads = ReadIdeData();
		HDPara.nFmtBytesPerTrack = ReadIdeData();
		HDPara.nFmtBytesPerSector = ReadIdeData();
		HDPara.SectorsPerTrack = ReadIdeData();
		HDPara.PID[0] = ReadIdeData();
		HDPara.PID[1] = ReadIdeData();
		HDPara.PID[2] = ReadIdeData();
		for(i=0; i<10; i++)
		{
			tmp = ReadIdeData();			
			HDPara.SerString[2*i]   = tmp>>8;
			HDPara.SerString[2*i+1] = tmp;
		}
		HDPara.SectorBufferType = ReadIdeData();
		HDPara.SectorBufferPages = ReadIdeData();
		HDPara.LongRdWrECCBytes = ReadIdeData();
		for(i=0; i<4; i++)
		{
			tmp = ReadIdeData();
			HDPara.FirmwareVersion[2*i]   = tmp>>8;
			HDPara.FirmwareVersion[2*i+1] = tmp;
		}
		for(i=0; i<20; i++)	
		{
			tmp = ReadIdeData();
			HDPara.ProductName[2*i]   = tmp>>8;
			HDPara.ProductName[2*i+1] = tmp;			
		}
		HDPara.IntSecCntInMltSecRW = ReadIdeData();
		HDPara.DwordIoEn = ReadIdeData();
		HDPara.LBA_DMA = ReadIdeData();
		tmp = ReadIdeData();
		HDPara.PIOTimer = ReadIdeData();
		HDPara.DMATimer = ReadIdeData();
		tmp = ReadIdeData();
		HDPara.CurCylinder = ReadIdeData();
		HDPara.CurHead = ReadIdeData();
		HDPara.CurSectorsPerTrack = ReadIdeData();
		HDPara.CurSectorsPerTrack |= ReadIdeData()<<16;
		HDPara.TotalSectors = ReadIdeData();
		HDPara.IntTransSectors = ReadIdeData();
		HDPara.TotalSectorsLBA = ReadIdeData();
		HDPara.TotalSectorsLBA |= ReadIdeData()<<16;
		HDPara.SWDMA = ReadIdeData();
		HDPara.MWDMA = ReadIdeData();				
		
		for(i=192; i; i--)
			tmp = ReadIdeData();

		HDPara.SerString[20] = 0;
		HDPara.ProductName[40] = 0;
		HDPara.FirmwareVersion[8] = 0;			
		printf("Product name : %s\n", HDPara.ProductName);
		printf("Firmware version : %s\n", HDPara.FirmwareVersion);				
		printf("Serial string : %s\n", HDPara.SerString);
		printf("Total sectors : %d\n\n", HDPara.TotalSectorsLBA);		
			
	}	

}

static char title[] = "IDE硬盘实验";
static char tip[]   = "实验IDE硬盘并输出相同信息";

//Test_StepMotorItem在prog_entry.c里被引用
TEST_PROGRAM_ITEM Test_IDEItem = {
				(TEST_PROGRAM)GetIdeInfo, 	//入口地址
				title, 					//显示名称
				tip, 					//帮助或提示信息,可为NULL
				1};						//使用printf,puts,putch等函数时在LCD上也显示输出字符(串)

⌨️ 快捷键说明

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