www.pudn.com > USBdiskRW.rar > ide.c


#include "def.h" 
#include "option.h" 
#include "44b.h" 
#include "utils.h" 
 
#define	IDE_DISK_SUPPORT 
#ifdef	IDE_DISK_SUPPORT 
 
#define	__S3C44B0X__ 
 
#ifdef	__S3C44B0X__ 
 
#define	IDE_DAT		0x4000020 
#define	IDE_ERR		0x4000022 
#define	IDE_SEC_CNT	0x4000024 
#define	IDE_LBA0	0x4000026 
#define	IDE_LBA1	0x4000028 
#define	IDE_LBA2	0x400002a 
#define	IDE_LBA_SEL	0x400002c 
#define	IDE_CMD		0x400002e 
 
#endif 
 
#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()) 
 
#define	IdeRstLow()		//rPDATB &= 0x3ff 
#define	IdeRstHigh()	//rPDATB |= 0x400 
 
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; 
 
/*****************************************************/ 
static void ResetIde() 
{ 
	IdeRstLow(); 
	Delay(100); 
	IdeRstHigh(); 
	 
} 
 
void GetIdeInfo(void) 
{ 
	int i; 
	U16 tmp; 
 
	printf( "\nGet IDE Informatin! \n" ) ; 
	rNCACHBE0 = ((unsigned int)(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12); 
	CacheDisable(); 
	 
	ResetIde(); 
	//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);		 
			 
	}	 
 
	CacheFlush(); 
	CacheEnable(); 
		 
} 
 
#endif