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