?? ide.h
字號(hào):
#ifndef __IDE_H
#define __IDE_H
typedef unsigned char uint8; /* 無(wú)符號(hào)8位整型變量 */
typedef signed char int8; /* 有符號(hào)8位整型變量 */
typedef unsigned short uint16; /* 無(wú)符號(hào)16位整型變量 */
typedef signed short int16; /* 有符號(hào)16位整型變量 */
typedef unsigned int uint32; /* 無(wú)符號(hào)32位整型變量 */
typedef signed int int32; /* 有符號(hào)32位整型變量 */
#define NULL 0
/***************************************************************************************/
/** 驅(qū)動(dòng)參數(shù)配置 */
/***************************************************************************************/
#define MAX_DEVICE 2 /*定義設(shè)備數(shù),由于只有主和從設(shè)備,所以最大值為2*/
#define TIMEOUTSET 0x0005ffff /*超時(shí)響應(yīng)設(shè)備(與CPU的速度有關(guān),沒(méi)有準(zhǔn)確的時(shí)間)*/
/****************************************************************************************/
/** 以下為本驅(qū)動(dòng)定義部份,用戶(hù)不需改動(dòng) */
/****************************************************************************************/
/*ATA 指令代碼*/
#define IDE_CMD_ATAPI_RESET 0x08
#define IDE_CMD_RECALIBRATE 0x10
#define IDE_CMD_READ 0x20 // 讀扇區(qū)命令
#define IDE_CMD_WRITE 0x30 // 寫(xiě)扇區(qū)命令
#define IDE_CMD_VERIFY 0x40
#define IDE_CMD_SEEK 0x70
#define IDE_CMD_EXEC_DIAGNOSE 0x90
#define IDE_CMD_SET_DRIVE_PARAMETERS 0x91
#define IDE_CMD_READ_MULTIPLE 0xC4 // 多扇區(qū)讀
#define IDE_CMD_WRITE_MULTIPLE 0xC5 // 多扇區(qū)寫(xiě)
#define IDE_CMD_SET_MULTIPLE 0xC6
#define IDE_CMD_READ_DMA 0xC8
#define IDE_CMD_WRITE_DMA 0xCA
#define IDE_CMD_GET_MEDIA_STATUS 0xDA
#define IDE_CMD_STANDBY_IMMEDIATE 0xE0 // Standby Immediate
#define IDE_CMD_IDLE_IMMEDIATE 0xE1 // Idle Immediate
#define IDE_CMD_SETFEATURES 0xEF
#define IDE_CMD_IDENTIFY 0xEC
#define IDE_CMD_MEDIA_EJECT 0xED
/*狀態(tài)寄存器相關(guān)位*/
#define ATA_STAT_REG_ERR 0x01 /*設(shè)備發(fā)生了錯(cuò)誤*/
#define ATA_STAT_REG_IDX 0x02 /**/
#define ATA_STAT_REG_CORR 0x04 /**/
#define ATA_STAT_REG_DRQ 0x08 /*有數(shù)據(jù)傳輸請(qǐng)求*/
#define ATA_STAT_REG_DSC 0x10 /**/
#define ATA_STAT_REG_DF 0x20 /**/
#define ATA_STAT_REG_DRDY 0x40 /*設(shè)備準(zhǔn)備好*/
#define ATA_STAT_REG_BSY 0x80 /*設(shè)備忙*/
#define ATA_STAT_BSY_DRDY (ATA_STAT_REG_BSY+ATA_STAT_REG_DRDY)
#define ATA_STAT_BSY_DRQ (ATA_STAT_REG_BSY+ATA_STAT_REG_DRQ)
/*設(shè)備磁頭寄存器*/
#define ATA_DevReg_DEV0 0x00 /*設(shè)備為主盤(pán)*/
#define ATA_DevReg_DEV1 0x10 /*設(shè)備為從盤(pán)*/
#define ATA_DevReg_b5 0x20 /*保留位,為1*/
#define ATA_DevReg_LBA 0x40 /*模式選擇位*/
#define ATA_DevReg_b7 0x80 /*保留位,為1*/
/*控制寄存器*/
#define CF_SOFT_RESET 0x04 /*軟件復(fù)位有效*/
#define CF_DISABLE_INT 0x00 /*禁能中斷*/
#define CF_ENABLE_INT 0x02 /*使能中斷*/
/*錯(cuò)誤代碼由16位二進(jìn)制數(shù)組成,低8位與ATA錯(cuò)誤寄存器一致,高8位自定義*/
#define ATA_EER_REG_AMNF 0x01 /*一般錯(cuò)誤*/
#define ATA_EER_REG_ABRT 0x04 /*指令無(wú)效出錯(cuò)*/
#define ATA_EER_REG_IDNF 0x10 /*尋扇區(qū)地址出錯(cuò)*/
#define ATA_EER_REG_UNC 0x40 /*發(fā)生了不可糾正的錯(cuò)誤*/
#define ATA_EER_REG_BBK 0x80 /*發(fā)現(xiàn)錯(cuò)誤塊*/
/*自定義*/
#define CARD_IS_FALSE 0x00ff /*CF卡不存在或無(wú)效*/
#define CARD_IS_TRUE 0x0000 /*CF卡有效*/
#define CARD_TIMEOUT 0x0100 /*對(duì)CF卡操作超時(shí)出錯(cuò)*/
#define THIS_DEVICE ((ATA_DevReg&0x10)>>4) /*當(dāng)前操作的設(shè)備,ATA_SelectDevice函數(shù)選擇了主或從設(shè)備,通過(guò)該操作可以確定剛才選定的設(shè)備*/
/*設(shè)備識(shí)別信息*/
/*全部設(shè)備信息*/
typedef struct _IDENTIFY_DATA {
uint16 GeneralConfiguration; // 00 普通設(shè)置-CF卡標(biāo)志0x848A
uint16 NumberOfCylinders; // 1 默認(rèn)柱面數(shù)
uint16 Reserved1; // 2
uint16 NumberOfHeads; // 3 默認(rèn)磁頭數(shù)
uint16 UnformattedBytesPerTrack; // 4 在2.0規(guī)范已不使用
uint16 UnformattedBytesPerSector; // 5 在2.0規(guī)范已不使用
uint16 SectorsPerTrack; // 6 每磁道默認(rèn)扇區(qū)數(shù)
uint32 SectorsPerCard; // 7-8 每卡扇區(qū)數(shù)(Word 7=MSW,Word 8=LSW)
uint16 VendorUnique; // 9 在2.0規(guī)范已不使用
uint16 SerialNumber[10]; // 10-19 ASCII序列號(hào)(靠右填寫(xiě))
uint16 BufferType; // 20 在2.0規(guī)范已不使用
uint16 BufferSectorSize; // 21 在2.0規(guī)范已不使用
uint16 NumberOfEccBytes; // 22 讀/寫(xiě)長(zhǎng)指令時(shí)的ECC字節(jié)數(shù)
uint16 FirmwareRevision[4]; // 23-26 ASCII固件版本。大端格式
uint16 ModelNumber[20]; // 27-46 ASCII模式號(hào)(靠左填寫(xiě)),大端格式
uint16 MaximumBlockTransfer; //*47 多重 讀/寫(xiě)指令最大扇區(qū)號(hào)。
uint16 Reserved2; // 48
uint16 Capabilities; // 49
uint16 Reserved3; // 50
uint16 PioCycleTimingMode; //*51 PIO數(shù)據(jù)傳輸周期時(shí)序模式
uint16 DmaCycleTimingMode; // 52 在2.0規(guī)范已不使用
uint16 TranslationFieldsValid; // 53 0位為1,Word54 to 58 有效;1位為1,Word64 to 70 有效
uint16 NumberOfCurrentCylinders; // 54 當(dāng)前柱面數(shù)
uint16 NumberOfCurrentHeads; // 55 當(dāng)前磁頭數(shù)
uint16 CurrentSectorsPerTrack; // 56 當(dāng)前每磁道扇區(qū)數(shù)
uint32 CurrentSectorCapacity; // 57-58 當(dāng)前扇區(qū)容量(LBAs)(Word 58=MSW,Word 57=LSW)
uint16 CurrentMultiSectorSetting; //*59 位8為1,則位0-7,指出可多扇區(qū)讀寫(xiě)的扇區(qū)數(shù)
uint32 UserAddressableSectors; // 60-61 LAB模式下可被尋址的扇區(qū)數(shù)
uint16 Reserved4[2] ; // 62-63
uint16 AdvancedPIOModes ; // 64 在2.0規(guī)范使用
uint16 Reserved6[2] ; // 65-66
uint16 MinimumPIOCycleTime; // 67 非流控制下最小PIO傳輸周期時(shí)間
uint16 MinimumPIOCycleTimeIORDY; // 68 IORDY流控制小最小PIO傳輸周期時(shí)間
uint16 Reserved7[10]; // 69-79
uint32 AtaVersion; // 80-81 CF卡返回0
uint16 FeaturesCommandSupported[3]; // 82-84 特征/命令集技持
uint16 FeaturesCommandEnabled[3]; // 85-87 特征/命令集使能
uint16 Reserved8; // 88
uint16 MajorRevision; // 89 安全單位完全擦除的時(shí)間要求
uint16 MinorRevision; // 90 增強(qiáng)型安全單位完全擦除的時(shí)間要求
uint16 PowerManagementValue; // 91 當(dāng)前高級(jí)電源管理值 // 91
uint16 Reserved9[36]; // 92-127
uint16 SecurityStatus; // 128 安全狀態(tài)
uint16 VendorUniqueBytes[32]; // 129-159
uint16 PowerRequirementDescription; // 160 電源要求描述
uint16 Reserved10; // 161
uint16 KeyManagementSupported; // 162 按鍵管理表
uint16 Reserved11[83]; // 163-255
} CF_IDENTIFY_DATA, *PCF_IDENTIFY_DATA;
/*設(shè)備基本信息*/
typedef struct _ATA_IDENTIFY_DATA {
uint16 NumberOfCylinders; // 1 默認(rèn)柱面數(shù)
uint16 NumberOfHeads; // 3 默認(rèn)磁頭數(shù)
uint16 SectorsPerTrack; // 6 每磁道默認(rèn)扇區(qū)數(shù)
uint32 CurrentSectorCapacity; // 57-58 當(dāng)前扇區(qū)容量(LBAs)(Word 58=MSW,Word 57=LSW)
} ATA_IDENTIFY_DATA, *PATA_IDENTIFY_DATA;
/*設(shè)備信息結(jié)構(gòu)*/
typedef struct {
uint8 ATAIsOK; /*設(shè)備正常為1,無(wú)效或有錯(cuò)為0*/
uint16 ERRCODE; /*設(shè)備出錯(cuò)代碼*/
uint32 ERRSECTOR; /*讀寫(xiě)扇區(qū)是出錯(cuò)的扇區(qū)號(hào)*/
ATA_IDENTIFY_DATA INFODATA; /*設(shè)備的基本信息*/
}ATADEVICE,*PATADEVICE;
extern ATADEVICE ATA[MAX_DEVICE]; /*設(shè)備識(shí)別信息識(shí)別結(jié)構(gòu)*/
/******************************************************************************************/
/*相關(guān)函數(shù)原型*/
/******************************************************************************************/
//****************************************************************************************
/*用戶(hù)使用函數(shù)*/
void ATA_INI(void); /*總線(xiàn)設(shè)置與初始化,ATA設(shè)備初始化*/
void ATA_FindIDEDevice(void); /*硬件復(fù)位,查找IDE設(shè)備,并初始化*/
uint8 ATA_IdleImmediate(uint8 Device); /*立即進(jìn)入空閑狀態(tài)(硬盤(pán)轉(zhuǎn)動(dòng))*/
uint8 ATA_StandbyImmediate(uint8 Device); /*立即進(jìn)入待機(jī)狀態(tài)(硬盤(pán)停轉(zhuǎn))*/
uint8 ATA_ReadSector(uint8 Device,uint16 *Buffer,uint32 Sector,uint8 count); /*讀出扇區(qū)數(shù)據(jù)函數(shù)*/
uint8 ATA_WriteSector(uint8 Device,uint16 * Buffer, uint32 Sector ,uint8 count); /*寫(xiě)入設(shè)備扇區(qū)數(shù)據(jù)函數(shù)*/
uint8 ATA_IdentifyDrive(uint8 Device,void *PTR); /*獲取設(shè)備信息*/
//****************************************************************************************
/*驅(qū)動(dòng)內(nèi)部使用函數(shù)*/
uint8 ATA_IssueIDEIdentify(uint8 Device); /*設(shè)備識(shí)別,獲取設(shè)備基本信息*/
uint8 ATA_SetFeature(uint8 Device); /*設(shè)備總線(xiàn)特性設(shè)置*/
void ATA_WriteSetting(uint32 Sectors , uint8 Count); /*寫(xiě)IDE多數(shù)扇區(qū)數(shù)據(jù)*/
void ATA_ReadSetting(uint32 Sectors , uint8 Count); /*寫(xiě)IDE多數(shù)扇區(qū)數(shù)據(jù)*/
void ATA_WriteData512B(uint16 * Buffer); /*連續(xù)寫(xiě)512字節(jié)數(shù)據(jù)*/
void ATA_ReadData512B(uint16 * Buffer); /*連續(xù)讀512字節(jié)數(shù)據(jù)*/
#endif
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -