?? ide.c
字號:
ATA_GetStatus(&Status); /*獲取設備狀態寄存器*/
if(Status==CARD_IS_FALSE) /*如果設備失敗返回*/
return (FALSE); /*返回FALSE*/
for(c = 0;Status&ATA_STAT_REG_DRQ;c++) /*如果設備還有數據需要傳輸,有些設備需傳輸多于256字,那并不是協議所規范的*/
{
GetData(); /*讀取一個字數據并丟棄*/
ATA_GetStatus(&Status); /*獲取設備狀態寄存器*/
if(Status==CARD_IS_FALSE) /*如果設備失敗返回*/
return (FALSE); /*返回FALSE*/
}
if( ATA[Device].INFODATA.CurrentSectorCapacity == 0) /*如果CurrentSectorCapacity值為,即無效,可以通過以下值計算出*/
{
ATA[Device].INFODATA.CurrentSectorCapacity =
(uint32)ATA[Device].INFODATA.NumberOfCylinders * /*柱面數*/
(uint32)ATA[Device].INFODATA.NumberOfHeads * /*磁頭數*/
ATA[Device].INFODATA.SectorsPerTrack; /*磁道數*/
}
return(TRUE);
}
else
return(FALSE);
}
/*********************************************************************************************************
** 函數名稱: ATA_DriveAllInfo 所在文件:IDE.C
** 功能描述: 該函數獲取IDE設備的特征信息,
** 輸 入: 結構體保存起始指針
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: 無
** 調用模塊: GetData(),讀ATA一個字的數據
** ATA_GetStatus(),獲取狀態
** ATA_WaitOnBusyNDrq(),等設備請求數據傳輸
********************************************************************************************************/
uint8 ATA_DriveAllInfo(void * PTR)
{
uint8 c,Status;
if(ATA_WaitOnBusyNDrq()) /*設備準備好傳輸數據*/
{
#define DEVICEINFO ((PCF_IDENTIFY_DATA)PTR) /*宏定義結構指針*/
DEVICEINFO->GeneralConfiguration = GetData(); //*Word 00
DEVICEINFO->NumberOfCylinders = GetData(); //*Word 01
DEVICEINFO->Reserved1 = GetData(); // Word 02
DEVICEINFO->NumberOfHeads = GetData(); //*Word 03
DEVICEINFO->UnformattedBytesPerTrack = GetData(); // Word 04
DEVICEINFO->UnformattedBytesPerSector = GetData(); // Word 05
DEVICEINFO->SectorsPerTrack = GetData(); //*Word 06
DEVICEINFO->SectorsPerCard = (uint32) GetData()<<16; // Word 07
DEVICEINFO->SectorsPerCard |=(uint32) GetData(); // Word 08
DEVICEINFO->VendorUnique = GetData(); //Word 09
for(c = 0 ; c <10 ; c++)
DEVICEINFO->SerialNumber[c] = GetData(); // Word 10-19
DEVICEINFO->BufferType = GetData(); // Word 20
DEVICEINFO->BufferSectorSize = GetData(); // Word 21
DEVICEINFO->NumberOfEccBytes = GetData(); // Word 22
for(c = 0 ; c <4 ; c++)
DEVICEINFO->FirmwareRevision[c] = GetData(); // Word 23-26
for(c = 0 ; c <20 ; c++)
DEVICEINFO->ModelNumber[c] = GetData(); // Word 27-46
DEVICEINFO->MaximumBlockTransfer = GetData(); //*Word 47
DEVICEINFO->Reserved2 = GetData(); // Word 48
DEVICEINFO->Capabilities = GetData(); //*Word 49
DEVICEINFO->Reserved3 = GetData(); // Word 50
DEVICEINFO->PioCycleTimingMode = GetData(); //*Word 51
DEVICEINFO->DmaCycleTimingMode = GetData(); // Word 52
DEVICEINFO->TranslationFieldsValid = GetData(); //*Word 53
DEVICEINFO->NumberOfCurrentCylinders = GetData(); //*Word 54
DEVICEINFO->NumberOfCurrentHeads = GetData(); //*Word 55
DEVICEINFO->CurrentSectorsPerTrack = GetData(); //*Word 56
DEVICEINFO->CurrentSectorCapacity =(uint32)GetData(); //*Word 57
DEVICEINFO->CurrentSectorCapacity |=(uint32)GetData()<<16; //*Word 58
DEVICEINFO->CurrentMultiSectorSetting = GetData(); //*Word 59
DEVICEINFO->UserAddressableSectors =(uint32)GetData(); //Word 60
DEVICEINFO->UserAddressableSectors|=(uint32)GetData()<<16; //Word 61
DEVICEINFO->Reserved4[0] = GetData(); // Word 62
DEVICEINFO->Reserved4[1] = GetData(); // Word 63
DEVICEINFO->AdvancedPIOModes = GetData(); //*Word 64
DEVICEINFO->Reserved6[0] = GetData(); // Word 65
DEVICEINFO->Reserved6[1] = GetData(); // Word 66
DEVICEINFO->MinimumPIOCycleTime = GetData(); //*Word 67
DEVICEINFO->MinimumPIOCycleTimeIORDY = GetData(); //*Word 68
for(c = 0 ; c <10 ; c++)
DEVICEINFO->Reserved7[c] = GetData(); // Word 69-79
DEVICEINFO->AtaVersion = (uint32)GetData(); // Word 80
DEVICEINFO->AtaVersion |= (uint32)GetData(); // Word 81
DEVICEINFO->FeaturesCommandSupported[0] = GetData(); // Word 82
DEVICEINFO->FeaturesCommandSupported[1] = GetData(); // Word 83
DEVICEINFO->FeaturesCommandSupported[2] = GetData(); // Word 84
DEVICEINFO->FeaturesCommandEnabled[0] = GetData(); // Word 85
DEVICEINFO->FeaturesCommandEnabled[1] = GetData(); // Word 86
DEVICEINFO->FeaturesCommandEnabled[2] = GetData(); // Word 87
DEVICEINFO->Reserved8 = GetData(); // Word 88
DEVICEINFO->MajorRevision = GetData(); // Word 89
DEVICEINFO->MinorRevision = GetData(); // Word 90
DEVICEINFO->PowerManagementValue = GetData(); // Word 91
for(c = 0 ; c <36 ; c++)
DEVICEINFO->Reserved9[c] = GetData(); // Word 92-127
DEVICEINFO->SecurityStatus = GetData(); //*Word 128
for(c = 0 ; c <32 ; c++)
DEVICEINFO->VendorUniqueBytes[c] = GetData(); // Word 129-159
DEVICEINFO->PowerRequirementDescription = GetData(); //*Word 160
DEVICEINFO->Reserved10 = GetData(); // Word 161
DEVICEINFO->KeyManagementSupported = GetData(); // Word 162
for(c = 0 ; c <83 ; c++)
DEVICEINFO->Reserved11[c] = GetData(); // Word 163-255
ATA_GetStatus(&Status); /*獲取設備狀態寄存器*/
if(Status==CARD_IS_FALSE) /*如果設備失敗返回*/
return (FALSE); /*返回FALSE*/
for(c = 0;Status&ATA_STAT_REG_DRQ;c++) /*如果設備還有數據需要傳輸,有些設備需傳輸多于256字,那并不是協議所規范的*/
{
GetData(); /*讀取一個字數據并拋棄*/
ATA_GetStatus(&Status); /*獲取設備狀態寄存器*/
if(Status==CARD_IS_FALSE) /*如果設備失敗返回*/
return (FALSE); /*返回FALSE*/
}
return TRUE;
}
else
return FALSE;
#undef DEVICEINFO
}
/*********************************************************************************************************
** 函數名稱: ATA_IssueIDEIdentify 所在文件:IDE.C
** 功能描述: 確認IDE設備,獲取IDE設備信息
** 輸 入: Device,設備號
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA_DevReg,選擇設備
** 調用模塊: ATA_CommandSet(),指令設置
** ATA_SelectDevice(),選擇設備
** ATA_WaitOnBusyNDrdy(),等設備準備好
** ATA_DriveBasicInfo(),初始化設備信息
********************************************************************************************************/
uint8 ATA_IssueIDEIdentify(uint8 Device)
{
uint8 retStatus = FALSE;
if(ATA_SelectDevice(Device)) /*選擇設備*/
{
ATA_CommandSet( /*ATA指令設置*/
NULL, /*Feature,特征寄存器*/
NULL, /*SecCnt,扇區計數寄存器*/
NULL, /*SecNum,扇區號寄存器*/
NULL, /*CylLow,柱面低寄存器*/
NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_IDENTIFY /*Command,指令寄存器*/
);
if(ATA_DriveBasicInfo(Device)) /*初始化設備信息*/
if(ATA_WaitOnBusyNDrdy()) /*等待設備準備好,檢測指令執行結果*/
retStatus = TRUE;
}
return retStatus;
}
/*********************************************************************************************************
** 函數名稱: ATA_IdentifyDrive 所在文件:IDE.C
** 功能描述: 確認IDE設備,獲取IDE設備信息
** 輸 入: Device:設備號,0為主設備,1為從設備
** PTR:保存設備信息的指針
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: CFIDESem,信號量指針
** ATA_DevReg,選擇設備
** ATA[Device].ATAIsOK,設備狀態
** 調用模塊: OSSemPend(),等待信號量
** ATA_SelectDevice(),選擇設備
** ATA_CommandSet(),指令設置
** ATA_WaitOnBusyNDrdy(),等設備準備好
** ATA_DriveAllInfo(),初始化設備信息
** OSSemPost(),發送信號量
********************************************************************************************************/
uint8 ATA_IdentifyDrive(uint8 Device,void *PTR)
{
uint8 retStatus = FALSE;
#ifdef UCOSII
uint8 err;
#endif
if(ATA[Device].ATAIsOK==FALSE)
return FALSE;
#ifdef UCOSII
OSSemPend(CFIDESem, 0, &err); /*等待信號量*/
#endif
if(ATA_SelectDevice(Device)) /*選擇設備*/
{
ATA_CommandSet( /*ATA指令設置*/
NULL, /*Feature,特征寄存器*/
NULL, /*SecCnt,扇區計數寄存器*/
NULL, /*SecNum,扇區號寄存器*/
NULL, /*CylLow,柱面低寄存器*/
NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_IDENTIFY /*Command,指令寄存器*/
);
if(ATA_DriveAllInfo(PTR)) /*初始化設備信息*/
if( ATA_WaitOnBusyNDrdy()) /*等待設備準備好*/
retStatus = TRUE;
}
#ifdef UCOSII
OSSemPost(CFIDESem); /*發送信號量*/
#endif
return retStatus;
}
/*********************************************************************************************************
** 函數名稱: ATA_SetFeature 所在文件:IDE.C
** 功能描述: 設置CF卡功能特性命令(如使用CF卡特有的8位數據總線)
** 輸 入: 無
** 輸 出: 指令正常完成返回TURE,出錯返回FALSE
** 全局變量: ATA_DevReg,選擇的設備
** 調用模塊: ATA_CommandSet(),ATA指令設置
** ATA_SelectDevice(),選擇設備
********************************************************************************************************/
uint8 ATA_SetFeature(uint8 Device)
{
uint8 retStatus = FALSE;
if(ATA_SelectDevice(Device)) /*等待設備準備好*/
{
#ifdef ATA_BUS_AT_8bit /*使用8位總線*/
ATA_CommandSet( /*ATA指令設置*/
0x01, /*Feature,特征寄存器*/
NULL, /*SecCnt,扇區計數寄存器*/
NULL, /*SecNum,扇區號寄存器*/
NULL, /*CylLow,柱面低寄存器*/
NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_SETFEATURES /*Command,指令寄存器*/
);
#else /*使用16位*/
ATA_CommandSet( /*ATA指令設置*/
0x81, /*Feature,特征寄存器*/
NULL, /*SecCnt,扇區計數寄存器*/
NULL, /*SecNum,扇區號寄存器*/
NULL, /*CylLow,柱面低寄存器*/
NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_SETFEATURES /*Command,指令寄存器*/
);
#endif
retStatus = ATA_WaitOnBusyNDrdy(); /*等待設備準備好*/
}
return retStatus;
}
/*********************************************************************************************************
** 函數名稱: ATA_INI 所在文件:IDE.C
** 功能描述: ATA設備初始化
** 輸 入: 無
** 輸 出: 無
** 全局變量: ATA,設備狀態信息結構體
** CFIDESem,信號量
** 調用模塊: OSSemCreate(),建立信號量
** ATA_FindIDEDevice(),查找ATA設備
********************************************************************************************************/
void ATA_INI(void)
{
uint8 Device;
for(Device=0;Device<MAX_DEVICE;Device++)
{
ATA[Device].ATAIsOK = FALSE; /*初始化設備不存在*/
ATA[Device].ERRCODE = CARD_IS_FALSE; /*設備無效*/
ATA[Device].ERRSECTOR = -1; /*無效扇區號*/
}
#ifdef UCOSII
CFIDESem = OSSemCreate(1); /*建立信號量*/
if(CFIDESem != NULL) /*信號量成功建立*/
#endif
{
ATA_FindIDEDevice(); /*查找ATA接口上的ATA設備*/
}
}
/*********************************************************************************************************
** 函數名稱: ATA_FindIDEDevice 所在文件:IDE.C
** 功能描述: 查找ATA設備,硬件復位
** 輸 入: 無
** 輸 出: 無
** 全局變量: ATA,設備狀態信息結構體
** 調用模塊: SYS_HaveCard(),ATA設備探測
** SYS_IdeHardReset() ATA設備硬件復位
** SetDeviceHead(),寫設備磁頭寄存器
** GetDeviceHead(),讀設備磁頭寄存器
** ATA_SetFeature() 功能設置函數
** ATA_IssueIDEIdentify(),ATA設備識別
********************************************************************************************************/
void ATA_FindIDEDevice(void)
{
uint32 temp32;
uint8 Device; /*為0選擇主設備,為1選擇從設備*/
if(SYS_HaveCard()) /*如果ATA接口上沒有設備*/
{
SYS_IdeHardReset(); /*ATA設備硬件復位*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -