📄 cf_infor.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 + -