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

📄 cf_infor.c

📁 LPC2292 bios测试程序 说明:YL_LPC229X_BIOS_Data的目录说明
💻 C
字号:
/**************************************************
*File :CF_Infor.c
*Autor:GongJun
*Date :2002-9-30 10:21
*Modifier:GongJun
*Date:2005-2-19 19:35
*Description:Get CF Card information,True IDE mode;
*Version:2.0
***************************************************/
#include "board.h"
#include "utils.h"
#include "option.h"

#define	TRUE_IDE_DAT		0x83000500
#define	TRUE_IDE_ERR		0x83000502
#define	TRUE_IDE_SEC_CNT	0x83000504
#define	TRUE_IDE_LBA0		0x83000506
#define	TRUE_IDE_LBA1		0x83000508
#define	TRUE_IDE_LBA2		0x8300050a
#define	TRUE_IDE_LBA_SEL	0x8300050c
#define	TRUE_IDE_CMD		0x8300050e


#define	TRUE_IDE_FEATURE	TRUE_IDE_ERR

#define	GetIdeStatus()	( *(volatile U16 *)TRUE_IDE_CMD )
#define	SetIdeCmd(cmd)	( (*(volatile U16 *)TRUE_IDE_CMD) = cmd )
#define	GetIdeErr()		( *(volatile U16 *)TRUE_IDE_ERR )
#define	ReadIdeData()	( *(volatile U16 *)TRUE_IDE_DAT )

#define	IdeIsBusy()		( (*(volatile U16 *)TRUE_IDE_CMD) & 0x80 )
#define	WaitIdeBusy()	while( IdeIsBusy() )

#define	TRUE_IDE_RST_LOW()
#define	TRUE_IDE_RST_HIGH()

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()
{
	TRUE_IDE_RST_LOW();
	Delay( 10 );
	TRUE_IDE_RST_HIGH();
}

int Get_TRUE_IDE_Infor( int argc , char* argv[] )
{
	int i;
	U16 tmp;

	printf( "Get CF Card Informatin! [Ture IDE Mode] \n" ) ;

	ResetIde();
	for ( i = 0; i < 10; i++ )
	{
		Delay( 100 );
		if ( IdeIsBusy() == 0 )
			break;
	}
	
	if ( i >= 10 )
	{
		return FALSE ;
		printf( "CF Card is BUSY! Reset time out!\n" ) ;
	}

	SetIdeCmd( 0xec );
	for ( i = 0; i < 50; i++ )
	{
		Delay( 100 );
		if ( IdeIsBusy() == 0 )
			break;
	}

	if ( i >= 100 )
	{
		printf( "CF Card is BUSY! \n" ) ;
		printf( "Get CF Card Informatin is failed! \n" ) ;
		printf( "Please make sure the CF Card is insert and Power on! \n" ) ;
		return FALSE ;
	}
	{
		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" , HDPara.TotalSectorsLBA );
	}
	
	return TRUE ;
}

⌨️ 快捷键说明

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