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

📄 ata_driver.c

📁 文件包含了开发motorola mc9s12uf32单片机一些源码。  1、USB device 实现  2、CF卡读取  3、SD卡读取  4、ATA硬盘读取
💻 C
📖 第 1 页 / 共 3 页
字号:
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
  ATA_LBAL_B = *(pLBA+3);
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
  ATA_LBAM_B = *(pLBA+2);
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			

  ATA_LBAH_B = *(pLBA+1);
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			


  if (*pLBA & 0xf0)				// if memory > 128G
  {
   	ATA_DDHR_B = 0x40;
		error = ATA_WaitRegBusy();
		if (error)
			return(error);		

 
 		if (ATACmd == kATACmdReadDMA)
		{
	    ATA_DCR = (muint16) kATACmdReadDMAExt << kOneByte;

//			error = ATA_WaitATABusyDRQ();
				error = ATA_WaitATABusy();

			if (error)
			return(error);
			ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
			return (kATAPass);
		}
		else
		{
			if (ATACmd == kATACmdWriteDMA)
			{
				ATA_DCR = kATACmdWriteDMAExt << kOneByte;
				error = ATA_WaitRegBusy();
				if (error)
					return(error);

				while (mCheckBit(ATAINTRQ,PORTS));
//				error = ATA_WaitATABusyDRQ();	
				error = ATA_WaitATABusy();

				if (error)
					return(error);
					
				ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
				return (kATAPass);
			}
		}	
				
	}    		
	else
	{
   	ATA_DDHR_B =*pLBA | 0x40;
		error = ATA_WaitRegBusy();
		if (error)
			return(error);		

    
    ATA_DCR = (muint16) ATACmd << kOneByte;
		error = ATA_WaitRegBusy();
		if (error)
			return(error);

		if (ATACmd == kATACmdReadDMA) 
		{
			while (mCheckBit(ATAINTRQ,PORTS));
//			error = ATA_WaitATABusyDRQ();	
				error = ATA_WaitATABusy();
			if (error)
				return(error);

			ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
			return (kATAPass);
		}
		else
		{
			if (ATACmd == kATACmdWriteDMA)
			{
				while (mCheckBit(ATAINTRQ,PORTS));
//				error = ATA_WaitATABusyDRQ();	
				error = ATA_WaitATABusy();
				if (error)
					return(error);

				ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
	
				return (kATAPass);
			}
		}	
		return (ATA_WaitATABusy());
	}
}


// ==================================================================
//   ATA_LBAATACommand1() -
//
//     To set command to ATA device
//
//	Input -		=	7 command parameters
//				
//	Output - 	=	
//
//	Function returns error code
//
// ==================================================================
ATAErrorCode ATA_LBAATACommand1(muint8 Block, muint8 *pLBA, muint8 ATACmd)
{
	ATAErrorCode error;
	
	error = ATA_WaitRegBusy();
	if (error)
		return(error);


    if (*pLBA & 0xf0)					// if memory > 128G
    {
	    ATA_DSCR_B = 0;					// high byte of sector count
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			

	    ATA_LBAL_B = (muint8) *pLBA;	// LBA 31:24
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			

    	ATA_LBAM_B = 0;					// LBA 39:32
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			

    	ATA_LBAH_B = 0;
		error = ATA_WaitRegBusy();		// LBA 47:40
		if (error)
			return(error);
	}	

    ATA_DSCR_B = Block;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
    ATA_LBAL_B = *(pLBA+3);
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
    ATA_LBAM_B = *(pLBA+2);
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			

    ATA_LBAH_B = *(pLBA+1);
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			


    if (*pLBA & 0xf0)				// if memory > 128G
    {
    	ATA_DDHR_B = 0x40;
		error = ATA_WaitRegBusy();
		if (error)
			return(error);		

 
   		if (ATACmd == kATACmdReadDMA)
		{
		    ATA_DCR = (muint16) kATACmdReadDMAExt << kOneByte;
			error = ATA_WaitATABusyDRQ();
			if (error)
				return(error);
			ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
			return (kATAPass);
		}
		else
		{
			if (ATACmd == kATACmdWriteDMA)
			{
				ATA_DCR = kATACmdWriteDMAExt << kOneByte;
				error = ATA_WaitRegBusy();
				if (error)
					return(error);

//				error = ATA_WaitATABusyDRQ();	
				error = ATA_WaitATABusy();	

				if (error)
					return(error);
					
				ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
				return (kATAPass);
			}
		}	
				
	}    		
	else
	{
	   	ATA_DDHR_B = (muint8) *pLBA | (0x40);
		error = ATA_WaitRegBusy();
		if (error)
			return(error);		

    
	    ATA_DCR = (muint16) ATACmd << kOneByte;
		error = ATA_WaitRegBusy();
		if (error)
			return(error);

		if (ATACmd == kATACmdReadDMA) 
		{
//			while (mCheckBit(ATAINTRQ,PORTS));
			error = ATA_WaitATABusy();	
			if (error)
				return(error);

			ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
			return (kATAPass);
		}
		else
		{
			if (ATACmd == kATACmdWriteDMA)
			{
//				while (mCheckBit(ATAINTRQ,PORTS));
				error = ATA_WaitATABusy();	
				if (error)
					return(error);

				ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
	
				return (kATAPass);
			}
		}	
		return (ATA_WaitATABusy());
	}
}



// ==================================================================
//   ATA_PIORead() -
//
//     PIO Read data from ATA device
//
//	Input -		= Buffer pointer, Lenght of Transfer
//				
//	Output - 	= Data return in buffer pointer	
//
//	Function returns error code
//
// ==================================================================
ATAErrorCode ATA_PIORead(muint16 *pBuffer, muint16 XferWordLen)
{
	int i, dummy;
	ATAErrorCode error;
	
	for (i=0; i<XferWordLen; i++)			// get data
	{
		dummy = ATA_DDR;
		
//		error = ATA_WaitRegBusy();
//		if (error)
//			return(error);		// PIO
		mATAWaitRegBusy;
		
		*pBuffer++ = ATA_DDR;
	}	

	error = ATA_WaitATABusy();
	if (error)
		return(error);
	
	return (kATAPass);	
}




// ==================================================================
//   ATA_DummyPIORead() -
//
//     PIO Read data from ATA device
//
//	Input -		= Buffer pointer, Lenght of Transfer
//				
//	Output - 	= Data return in buffer pointer	
//
//	Function returns error code
//
// ==================================================================
ATAErrorCode ATA_DummyPIORead(muint16 XferWordLen)
{
	int i, dummy;
	ATAErrorCode error;
	
	for (i=0; i<XferWordLen; i++)			// get data
	{
		dummy = ATA_DDR;
		error = ATA_WaitRegBusy();
		if (error)
			return(error);								// PIO
		dummy = ATA_DDR;	
	}

	return (kATAPass);	
}


// ==================================================================
//   ATA_PIOWrite() -
//
//     PIO Read data from ATA device
//
//	Input -		= Buffer pointer, Lenght of Transfer
//				
//	Output - 	
//
//	Function returns error code
//
// ==================================================================
ATAErrorCode ATA_PIOWrite(muint16 *pBuffer, muint16 XferWordLen)
{
	int i;
	ATAErrorCode error;
	
	for (i=0; i<XferWordLen; i++)			// get data
	{
		ATA_DDR = *pBuffer++;

//		error = ATA_WaitRegBusy();
//		if (error)
//			return(error);			// PIO
		mATAWaitRegBusy;
	}

	error = ATA_WaitATABusy();
	if (error)
		return(error);
	
		
	return (kATAPass);	
}

ATAErrorCode ATA_PIOWriteTwoBlock(muint16 *pBuffer)
{
	int i;
	ATAErrorCode error;
	
	for (i=0; i<0x100; i++)			// get data
	{
		ATA_DDR = *pBuffer++;
		mATAWaitRegBusy;
	}

	error = ATA_WaitATABusy();
	if (error)
		return(error);
	
	for (i=0; i<0x100; i++)			// get data
	{
		ATA_DDR = *pBuffer++;
		mATAWaitRegBusy;
	}

	error = ATA_WaitATABusy();
	if (error)
		return(error);

	
		
	return (kATAPass);	
}

// ==================================================================
//   ATA_WaitATABusy() -
//
//     To wait until device not busy
//
//	Input -		=	nil
//				
//	Output - 	=	nil
//
//	Function returns error code
//
// ==================================================================

ATAErrorCode ATA_WaitATABusy()
{
    muint16 BegTime, CurTime;
    muint8	Status;
    ATAErrorCode	error;

   
	BegTime = MK_GetCurrentTime();		// begin time
	do
	{
		error = ATA_WaitRegBusy();
		ATA_DCR_L = 0;
		mSet2Bit(ATASMR,ATAFR,ATA_HCFG_H);
		mClear2Bit(ATASMR,ATAFR,ATA_HCFG_H);

		if (error)
			return(error);
		
		Status = ATA_DSR_B;								// get Status register
		error = ATA_WaitRegBusy();
		if (error)
			return(error);
		Status = ATA_DSR_B;
		
		if (!mCheckBit(ATABSY,Status))
			break;
	    	
		CurTime = MK_GetCurrentTime();	// current time
	}
	while ( ((CurTime-BegTime) < kATATimeout) || ((BegTime - CurTime) < kATATimeout));

	if (mCheckBit(ATABSY,Status))		// ATA still busy, timeout
	{
		gATAError = kSCSISKHardwareError;	// timeout => hardware error
		return(kCSWPhaseError);
	}

	if (mCheckBit(ATADF,Status))		// ATA Device Fault
	{
		gATAError = kSCSISKHardwareError;	// device fault => hardware error

⌨️ 快捷键说明

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