⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide.c

📁 ARM嵌入式系统软件开发实例(一) 里面含有很多UCOS教程和源码
💻 C
📖 第 1 页 / 共 3 页
字号:

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