📄 ide.c
字号:
#include "def.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
#elif defined __AT91RM9200__
#define IDE_DAT 0x50000000
#define IDE_ERR 0x50000002
#define IDE_SEC_CNT 0x50000004
#define IDE_LBA0 0x50000006
#define IDE_LBA1 0x50000008
#define IDE_LBA2 0x5000000a
#define IDE_LBA_SEL 0x5000000c
#define IDE_CMD 0x5000000e
#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" ) ;
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);
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -