📄 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 + -