?? cf_tureide.c
字號:
** 輸 入: 結構體保存起始指針
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: 無
** 調用模塊: GetData(),讀ATA一個字的數據
** ATA_GetStatus(),獲取狀態
** ATA_WaitOnBusyNDrq(),等設備請求數據傳輸
********************************************************************************************************/
U8 ATA_DriveAllInfo(void * PTR)
{
U8 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 = (U32) GetData()<<16; // Word 07
DEVICEINFO->SectorsPerCard |=(U32) 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 =(U32)GetData(); //*Word 57
DEVICEINFO->CurrentSectorCapacity |=(U32)GetData()<<16; //*Word 58
DEVICEINFO->CurrentMultiSectorSetting = GetData(); //*Word 59
DEVICEINFO->UserAddressableSectors =(U32)GetData(); //Word 60
DEVICEINFO->UserAddressableSectors|=(U32)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 = (U32)GetData(); // Word 80
DEVICEINFO->AtaVersion |= (U32)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(),初始化設備信息
********************************************************************************************************/
U8 ATA_IssueIDEIdentify(U8 Device)
{
U8 retStatus = FALSE;
if(ATA_SelectDevice(Device)) /*選擇設備*/
{
ATA_CommandSet( /*ATA指令設置*/
CF_NULL, /*Feature,特征寄存器*/
CF_NULL, /*SecCnt,扇區計數寄存器*/
CF_NULL, /*SecNum,扇區號寄存器*/
CF_NULL, /*CylLow,柱面低寄存器*/
CF_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(),發送信號量
********************************************************************************************************/
U8 ATA_IdentifyDrive(U8 Device,void *PTR)
{
U8 retStatus = FALSE;
if(ATA[Device].ATAIsOK==FALSE)
return FALSE;
if(ATA_SelectDevice(Device)) /*選擇設備*/
{
ATA_CommandSet( /*ATA指令設置*/
CF_NULL, /*Feature,特征寄存器*/
CF_NULL, /*SecCnt,扇區計數寄存器*/
CF_NULL, /*SecNum,扇區號寄存器*/
CF_NULL, /*CylLow,柱面低寄存器*/
CF_NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_IDENTIFY /*Command,指令寄存器*/
);
if(ATA_DriveAllInfo(PTR)) /*初始化設備信息*/
if( ATA_WaitOnBusyNDrdy()) /*等待設備準備好*/
retStatus = TRUE;
}
return retStatus;
}
/*********************************************************************************************************
** 函數名稱: ATA_SetFeature 所在文件:IDE.C
** 功能描述: 設置CF卡功能特性命令(如使用CF卡特有的8位數據總線)
** 輸 入: 無
** 輸 出: 指令正常完成返回TURE,出錯返回FALSE
** 全局變量: ATA_DevReg,選擇的設備
** 調用模塊: ATA_CommandSet(),ATA指令設置
** ATA_SelectDevice(),選擇設備
********************************************************************************************************/
U8 ATA_SetFeature(U8 Device)
{
U8 retStatus = FALSE;
if(ATA_SelectDevice(Device)) /*等待設備準備好*/
{
#ifdef ATA_BUS_AT_8bit /*使用8位總線*/
ATA_CommandSet( /*ATA指令設置*/
0x01, /*Feature,特征寄存器*/
CF_NULL, /*SecCnt,扇區計數寄存器*/
CF_NULL, /*SecNum,扇區號寄存器*/
CF_NULL, /*CylLow,柱面低寄存器*/
CF_NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_SETFEATURES /*Command,指令寄存器*/
);
#else /*使用16位*/
ATA_CommandSet( /*ATA指令設置*/
0x81, /*Feature,特征寄存器*/
CF_NULL, /*SecCnt,扇區計數寄存器*/
CF_NULL, /*SecNum,扇區號寄存器*/
CF_NULL, /*CylLow,柱面低寄存器*/
CF_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)
{
U8 Device;
for(Device=0;Device<MAX_DEVICE;Device++)
{
ATA[Device].ATAIsOK = FALSE; /*初始化設備不存在*/
ATA[Device].ERRCODE = CARD_IS_FALSE; /*設備無效*/
ATA[Device].ERRSECTOR = -1; /*無效扇區號*/
}
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)
{
U32 temp32;
U8 Device; /*為0選擇主設備,為1選擇從設備*/
if(SYS_HaveCard()) /*如果ATA接口上沒有設備*/
{
SYS_IdeHardReset(); /*ATA設備硬件復位*/
for(temp32=0;temp32<TIMEOUTSET;temp32++) /*等待設備準備好*/
{
SetDeviceHead(0xfa); /*寫設備磁頭寄存器*/
if( 0xfa == (U8)GetDeviceHead()) /*讀出剛才寫進設備磁頭寄存器值*/
break; /*設備OK,完成復位*/
}
if(temp32<TIMEOUTSET) /*如果設備不超時,則ATA接口上有設備*/
{
for(Device=0;MAX_DEVICE>Device;Device++) /*初始化各設備,MAX_DEVICE最大值為1,即只能有主和從兩個設備*/
{
ATA_SetFeature(Device); /*特性設備,(總線設置)*/
if(ATA_IssueIDEIdentify(Device)) /*ATA設備識別,獲取CF卡內部信息*/
{
ATA[Device].ATAIsOK = TRUE; /*ATA設備可用,置位其標志位*/
printf( "Device[%d] is OK\n", Device ) ; //
}
else
{
ATA[Device].ATAIsOK = FALSE; /**ATA設備不可用,清ATA設備準備好標志*/
printf( "Device[%d] is NOT OK!!!\n", Device ) ; //
}
}
}
else
printf( "查找CF卡超時無響應!\n" ) ; //
}
}
/*********************************************************************************************************
** 函數名稱: ATA_ReadSetting 所在文件:IDE.C
** 功能描述: 讀扇區指令設置相關的寄存器。
** 輸 入: Sectors ,讀設備的起始扇區號
** Count ,扇區數
** 輸 出: 無
** 全局變量: ATA_DevReg,確定選擇的是主設備或是從設備和地址模式(本驅動使用LBA模式)
** 調用模塊: ATA_CommandSet(),寫命令設置
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -