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

📄 cf_tureide.c

📁 arm9 嵌入式系统开发与实践光盘
💻 C
📖 第 1 页 / 共 3 页
字号:
** 全局变量: 无
** 调用模块: 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(),写命令设置
********************************************************************************************************/
void ATA_ReadSetting(U32 Sectors , U8 Count)
{
   	ATA_CommandSet( 									/*ATA指令设置*/
 		CF_NULL,											/*Feature,特征寄存器*/
		(U8)Count, 									/*SecCnt,扇区计数寄存器*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -