?? cf_tureide.c
字號:
/****************************************************************************
【文 件 名 稱】CF_TrueIDE.C
【功 能 描 述】三星S3C2410A板demo程序代碼
【程 序 版 本】4.0
【創(chuàng)建人及創(chuàng)建日期】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"
#include "SysATA.h"
#include "CF_TureIDE.h"
U8 ATA_DevReg ; /*設備磁頭寄存器值,通過該寄存器可以確定*/
ATADEVICE ATA[MAX_DEVICE]; /*設備識別信息識別結(jié)構(gòu),及設備的狀態(tài)*/
/*********************************************************************************************************
** 函數(shù)名稱: ATA_GetStatus 所在文件:IDE.C
** 功能描述: 讀取ATA狀態(tài)寄程器
** 輸 入: Status,存放狀態(tài)值的變量指針
** 輸 出: 無
** 全局變量: THIS_DEVICE,當前選中的設備
** ATA,設備信息數(shù)據(jù)結(jié)構(gòu)
** 調(diào)用模塊: GetAStatus(),讀輔助狀態(tài)寄存器
** GetStatus(),讀狀態(tài)寄存器
** GetERR(),讀錯誤寄存器
********************************************************************************************************/
void ATA_GetStatus(U8 *Status)
{
if(SYS_HaveCard())
{
GetAStatus(); /*讀助狀態(tài)寄存器不作處理,以保證讀狀態(tài)寄存器返回有效的值*/
*Status = (U8)GetStatus(); /*讀取ATA設備狀態(tài)*/
if((*Status)&ATA_STAT_REG_BSY) /*設備狀態(tài)寄存器BSY位為1,其它位無效*/
{
*Status = ATA_STAT_REG_BSY; /*BSY位為1其它位無效,屏蔽其它位*/
ATA[THIS_DEVICE].ERRCODE = CARD_IS_TRUE; /*清錯誤碼率代碼*/
}
else /*設備不忙*/
{
if((*Status) & ATA_STAT_REG_ERR) /*設備是否出錯*/
{ /*設備出錯*/
ATA[THIS_DEVICE].ERRCODE
= (U8)GetERR(); /*讀取出錯代碼,保存出錯代碼,以便查詢*/
if(ATA[THIS_DEVICE].ERRCODE & ATA_EER_REG_IDNF) /*如果是尋址出錯,即記錄出錯的扇區(qū)號*/
{
ATA[THIS_DEVICE].ERRSECTOR
= (U8)GetSector(); /*讀出首次錯誤的扇區(qū)號LBA7~0*/
ATA[THIS_DEVICE].ERRSECTOR
|= ((U8)GetCylinderLow())*0x100; /*讀出首次錯誤的扇區(qū)號LBA15~8*/
ATA[THIS_DEVICE].ERRSECTOR
|= ((U8)GetCylinderHigh())*0x10000; /*讀出首次錯誤的扇區(qū)號LBA23~16*/
ATA[THIS_DEVICE].ERRSECTOR
|= ((U8)GetDeviceHead()&0x0f)*0x1000000; /*讀出首次錯誤的扇區(qū)號LBA27~4*/
}
}
else
if(*Status==0) /*如果狀態(tài)全為0,該設備是無效的*/
{
ATA[THIS_DEVICE].ERRCODE = CARD_IS_FALSE; /*設備無效*/
*Status = CARD_IS_FALSE; /*返回函數(shù)結(jié)果*/
}
else
{
ATA[THIS_DEVICE].ERRCODE = CARD_IS_TRUE; /*清錯誤碼率代碼*/
}
}
}
else
{
*Status = CARD_IS_FALSE; /*設備不可用*/
ATA[THIS_DEVICE].ERRCODE = CARD_IS_FALSE; /*設備不可用*/
ATA[THIS_DEVICE].ATAIsOK = FALSE; /*設備不可用*/
}
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_WaitOnBusyNDrdy 所在文件:IDE.C
** 功能描述: 設備忙等待直到設備不忙并設備準備好.
** 輸 入: 無
** 輸 出: 設備出錯返回0
** 全局變量: ATA,數(shù)據(jù)結(jié)構(gòu)體
** 調(diào)用模塊: ATA_GetStatus(),讀取狀態(tài)函數(shù)
********************************************************************************************************/
U8 ATA_WaitOnBusyNDrdy(void)
{
U8 ATAStatus;
U32 timeout;
for(timeout=0;timeout<TIMEOUTSET;timeout++) /*超時返回,即多次讀取,在讀取一定的次數(shù)還沒得到需要的狀態(tài)就認為超時*/
{
ATA_GetStatus(&ATAStatus); /*獲取設備狀態(tài)*/
if( ATAStatus==CARD_IS_FALSE) /*該設備有錯誤或無效*/
return FALSE; /*返回失敗*/
if(ATAStatus&ATA_STAT_REG_ERR) /*如果設備出錯*/
return FALSE;
if(ATA_STAT_REG_DRDY==(ATAStatus&ATA_STAT_BSY_DRDY)) /*如果設備準備好返回*/
return TRUE;
}
ATA[THIS_DEVICE].ERRCODE = CARD_TIMEOUT; /*標志超時出錯*/
ATA[THIS_DEVICE].ERRSECTOR = -1; /*清錯誤扇區(qū)號*/
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_WaitOnBusyNDrq 所在文件:IDE.C
** 功能描述: 設備忙等待直到設備不忙并有數(shù)據(jù)傳輸請求時.
** 輸 入: 無
** 輸 出: 設備出錯返回0
** 全局變量: ATA[THIS_DEVICE].ERRCODE,出錯代碼
** ATA[THIS_DEVICE].ERRSECTOR,出錯扇區(qū)號
** 調(diào)用模塊: ATA_GetStatus(),讀取狀態(tài)函數(shù)
********************************************************************************************************/
U8 ATA_WaitOnBusyNDrq(void)
{
U8 ATAStatus;
U32 timeout;
for(timeout=0;timeout<TIMEOUTSET;timeout++) /*超時返回,即多次讀取,在讀取一定的次數(shù)還沒得到需要的狀態(tài)就認為超時*/
{
ATA_GetStatus(&ATAStatus); /*獲取設備狀態(tài)*/
if(ATAStatus==CARD_IS_FALSE) /*卡有錯誤*/
return FALSE;
if(ATAStatus&ATA_STAT_REG_ERR) /*如果設備出錯*/
return FALSE;
if(ATA_STAT_REG_DRQ==(ATAStatus&ATA_STAT_BSY_DRQ)) /*有數(shù)據(jù)傳輸請求*/
return TRUE;
}
ATA[THIS_DEVICE].ERRCODE = CARD_TIMEOUT; /*標志超時出錯*/
ATA[THIS_DEVICE].ERRSECTOR = -1; /*清錯誤扇區(qū)號*/
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_WaitOnBusy 所在文件:IDE.C
** 功能描述: 設備忙等待
** 輸 入: 無
** 輸 出: 出錯返回0
** 全局變量: ATA[THIS_DEVICE].ERRCODE,出錯代碼
** ATA[THIS_DEVICE].ERRSECTOR,出錯扇區(qū)號
** 調(diào)用模塊: ATA_GetStatus(),讀取狀態(tài)函數(shù)
********************************************************************************************************/
U8 ATA_WaitOnBusy(void)
{
U8 ATAStatus;
U32 timeout;
for(timeout=0;timeout<TIMEOUTSET;timeout++) /*超時返回,即多次讀取,在讀取一定的次數(shù)還沒得到需要的狀態(tài)就認為超時*/
{
ATA_GetStatus(&ATAStatus); /*讀取狀態(tài)寄存器*/
if(ATAStatus==CARD_IS_FALSE) /*卡有錯誤*/
return FALSE; /*返回設備發(fā)生了錯誤*/
if((ATAStatus & ATA_STAT_BSY_DRQ)==0) /*設備不忙,*/
return TRUE; /*正常返回*/
}
ATA[THIS_DEVICE].ERRCODE = CARD_TIMEOUT; /*標志超時出錯*/
ATA[THIS_DEVICE].ERRSECTOR = -1; /*清錯誤扇區(qū)號*/
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_SelectDevice 所在文件:IDE.C
** 功能描述: 選擇主從設備
** 輸 入: Device,0為主設備,1為從設備
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA_DevReg
** 調(diào)用模塊: SetDeviceHead(),寫設備寄存器
** ATA_WaitOnBusy(),等待設備不忙
********************************************************************************************************/
U8 ATA_SelectDevice(U8 Device)
{
ATA_WaitOnBusy(); /*等待設備不忙*/
if(Device>0) /*選擇的為從設備*/
ATA_DevReg = ATA_DevReg_DEV1 + /*選擇設備0*/
ATA_DevReg_b5 +
ATA_DevReg_LBA+ /*工作在LAB模式*/
ATA_DevReg_b7;
else /*選擇的為主設備*/
ATA_DevReg = ATA_DevReg_DEV0 + /*選擇設備0*/
ATA_DevReg_b5 +
ATA_DevReg_LBA + /*工作在LAB模式*/
ATA_DevReg_b7;
SetDeviceHead(ATA_DevReg); /*寫設備磁頭寄存器*/
return ATA_WaitOnBusy(); /*等待設備不忙,返回狀態(tài)*/
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_CommandSet
** 功能描述: 指令設置相關的寄存器。
** 輸 入: Feature,特征寄存器
** SecCnt,扇區(qū)計數(shù)寄存器
** SecNum,扇區(qū)號寄存器
** CylLow,柱面低寄存器
** CylHigh,柱面高寄存器
** C_D_H,設備磁頭寄存器
** Command,指令寄存器
** 輸 出: 無
** 全局變量: 無
** 調(diào)用模塊: SetFeature(),寫Feature,特征寄存器
** SetSECCNT(),寫SecCnt,扇區(qū)計數(shù)寄存器
** SetSector(),寫扇區(qū)號寄存器
** SetCylinderLow(),寫柱面低寄存器
** SetCylinderHigh(),寫柱面高寄存器
** SetDeviceHead(),寫設備磁頭寄存器
** SetCommand(),寫指令寄存器
********************************************************************************************************/
void ATA_CommandSet(U8 Feature,
U8 SecCnt,
U8 SecNum,
U8 CylLow,
U8 CylHigh,
U8 C_D_H,
U8 Command
)
{
SetFeature(Feature); /*Feature,特征寄存器*/
SetSECCNT(SecCnt); /*SecCnt,扇區(qū)計數(shù)寄存器*/
SetSector(SecNum); /*SecNum,扇區(qū)號寄存器*/
SetCylinderLow(CylLow); /*CylLow,柱面低寄存器*/
SetCylinderHigh(CylHigh); /*CylHigh,柱面高寄存器*/
SetDeviceHead(C_D_H ); /*C_D_H,設備磁頭寄存器*/
SetCommand(Command); /*Command,指令寄存器 */
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_DriveBasicInfo 所在文件:IDE.C
** 功能描述: 獲取設備基本信息
** 輸 入: 無
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA[Device].INFODATA,設備信息結(jié)構(gòu)體
** 調(diào)用模塊: GetData(),讀ATA一個字的數(shù)據(jù)
** ATA_GetStatus(),獲取狀態(tài)
** ATA_WaitOnBusyNDrq(),等設備請求數(shù)據(jù)傳輸
********************************************************************************************************/
U8 ATA_DriveBasicInfo(U8 Device)
{
U8 c,Status;
if(ATA_WaitOnBusyNDrq())
{
GetData(); //*Word 00
ATA[Device].INFODATA.NumberOfCylinders = GetData(); //*Word 01
GetData(); // Word 02
ATA[Device].INFODATA.NumberOfHeads = GetData(); //*Word 03
GetData(); // Word 04
GetData(); // Word 05
ATA[Device].INFODATA.SectorsPerTrack = GetData(); //*Word 06
for(c=7;c< 57;c++) GetData();
ATA[Device].INFODATA.CurrentSectorCapacity =(U32)GetData(); //*Word 57
ATA[Device].INFODATA.CurrentSectorCapacity|=(U32)GetData()<<16; //*Word 58
for(c=59;c< 255;c++) GetData();
ATA_GetStatus(&Status); /*獲取設備狀態(tài)寄存器*/
if(Status==CARD_IS_FALSE) /*如果設備失敗返回*/
return (FALSE); /*返回FALSE*/
for(c = 0;Status&ATA_STAT_REG_DRQ;c++) /*如果設備還有數(shù)據(jù)需要傳輸,有些設備需傳輸多于256字,那并不是協(xié)議所規(guī)范的*/
{
GetData(); /*讀取一個字數(shù)據(jù)并丟棄*/
ATA_GetStatus(&Status); /*獲取設備狀態(tài)寄存器*/
if(Status==CARD_IS_FALSE) /*如果設備失敗返回*/
return (FALSE); /*返回FALSE*/
}
if( ATA[Device].INFODATA.CurrentSectorCapacity == 0) /*如果CurrentSectorCapacity值為,即無效,可以通過以下值計算出*/
{
ATA[Device].INFODATA.CurrentSectorCapacity =
(U32)ATA[Device].INFODATA.NumberOfCylinders * /*柱面數(shù)*/
(U32)ATA[Device].INFODATA.NumberOfHeads * /*磁頭數(shù)*/
ATA[Device].INFODATA.SectorsPerTrack; /*磁道數(shù)*/
}
return(TRUE);
}
else
return(FALSE);
}
/*********************************************************************************************************
** 函數(shù)名稱: ATA_DriveAllInfo 所在文件:IDE.C
** 功能描述: 該函數(shù)獲取IDE設備的特征信息,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -