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

📄 atams_processor.c

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

				if (!gUSBMSCSWResult)					// no error
				{
					while (mCheckBit(DBEIF,QC34DSR)==0);// wait for last data to send out
					gUSBMSCSWResult = ATA_WaitATABusy();
				}
				QCDCT34 = 0;							// indicate all data xfered
			}
			else
				QCDCT34 = 1;							// indicate not all data xfered

			gATALBA += Block;
		}
		while (Block16 && !gUSBMSCSWResult);


	}
	mUSBSetBit(SNAK,UEPCSR4A);						// disable USB tx
	mSetBit(QnEN,QC1CR);									// enable QC1
	QC1REQ	= kQCREQUSBRx;								// USB Rx
	mClearBit(QnEN,QC4CR);								// disable QC4
	QC4REQ	= kQCREQNone;									// map to non existing resource
	mSetBit(QnPRST,QC3CR);								// reset QC3
	mSet2Bit(DRHE,DTHE,QC34DTR);					// enable force handshake
	mClearBit(QnTHRU,QC3CR);							// disable QC34 passthrough mode

	if (!QCDCT34)													// if all data tx out
		USBMS_SendCSW();
	else	
		USBMS_SetPhyEP5Int(0);							// short packet
}


// ==================================================================
//   SCSILIST2A() -
//
//     Write
//
// ==================================================================
void ATAMS_SCSIList2A()
{
	muint32 i;
	muint16	j;
	muint8	Block;
	muint32	*pLBA;
	muint16	*pBlock16,Block16;

	mClearBit(kLED1Pin,kLED1Port);

	pLBA 	= (muint32*) (gpbCBWPacket+kSCSI10LBAByte3);
	gATALBA 	= *pLBA;
	pBlock16 	= (muint16*) (gpbCBWPacket+kSCSI10XferLength1);
	Block16 	= *pBlock16;

	mUSBClearBit(USBTCIE,UEPCSR4A);			// disable Xfer complete int
	mSetBit(QnPRST,QC1DR);							// reset QC1
	mSetBit(CH12DBE,IQUECR);						// QC12 double buffer
	mSetBit(DBRST,QC12DCR);							// reset QC12 double buffer

//	DisableInterrupts;
	if (mCheckBit(bitATAUDMAMode,gATAStatus))	// UDMA mode
	{

		mClearBit(QnEN,QC3CR);						// disable QC3
		QC3REQ	= kQCREQNone;							// remap to non-exisiting resources
		mSetBit(QnEN,QC2CR);							// enable QC2
		QC2REQ	= kQCREQATATx;						// QC2 = ATA Tx
		mClear2Bit(DRHE,DTHE,QC12DTR);		// disable QC12 force handshake
		mSetBit(QnTHRU,QC1CR);						// QC12 passthrough mode

		do
		{
			if (Block16 & 0xFF00)						// Block > 0xff
			{
				Block = 0xff;
				Block16 -= 0xff;
			}
			else
			{
				Block = (muint8) Block16;
				Block16 = 0;
			}

			gUSBMSCSWResult = ATA_LBAATACommand(Block,kATACmdWriteDMA);
			
			if (!gUSBMSCSWResult)				// no error found
			{

		mUSBClearBit(SNAK,UEPCSR4A);	// enable USB receive

//				Block = *(gpbCBWPacket+kSCSI10XferLength0);
				QCDCT12 = Block;

				if (gUSBFullSpeed)				// full speed
				{
					for (j=0; j<8; j++)
					{
						gUSBMSCSWResult = USBMS_WaitIQUEwithATAIRQ(&QCDCT12);
						if (gUSBMSCSWResult)	// error found
							break;
						QCDCT12 = Block;
					}
					QCDCT12 = 0;		
				}
				else							// high speed
					gUSBMSCSWResult = USBMS_WaitIQUEwithATAIRQ(&QCDCT12);
			}
			gATALBA += Block;
		}
		while (Block16 && !gUSBMSCSWResult);	

		if (!QCDCT12)					// all data xfered
			gUSBMSCSWResult = ATA_WaitATABusy();	// get error including CRC
		else
			mUSBSetBit(STALL,UEPCSR4A);		// stall EP4

//	EnableInterrupts;

		mUSBSetBit(SNAK,UEPCSR4A);		// disable USB receive
		mSetBit(DBRST,QC12DCR);				// reset QC12 double buffer
		mClearBit(CH12DBE,IQUECR);			// set QC12 single buffer
		mClearBit(QnEN,QC2CR);				// disable QC2
		QC2REQ	= kQCREQNone;				// remap QC2 to unused area
		mSetBit(QnPRST,QC1CR);				// reset QC1
		mClearBit(QnTHRU,QC1CR);			// not passthrough
	}
	
	else										// PIO mode
	{
		do
		{
			if (Block16 & 0xFF00)						// Block > 0xff
			{
				Block = 0xff;
				Block16 -= 0xff;
			}
			else
			{
				Block = (muint8) Block16;
				Block16 = 0;
			}

			gUSBMSCSWResult = ATA_LBAATACommand(Block,kATACmdWrite);

			if (!gUSBMSCSWResult)					// no error found
			{
				mUSBClearBit(SNAK,UEPCSR4A);		// enable receive

				for (i=0; i<( (muint16) Block <<kOneByte);i)	// get data
				{
					while (!(QC12DSR & 0x03));		// wait while DBSF == 0

					for (j=0; j<gUSBPacketSize; j++)
					{
						i++;
						ATA_DDR = QC1DR;			// write to ATA
						if (ATA_WaitRegBusy())			
							break;					// error found	

					}
					mSetBit(TXDA, QC12DTR);					// Set Transmit acknowledge
					gUSBMSCSWResult = ATA_WaitATABusy();
					if (gUSBMSCSWResult)
						break;
				}
				if (!gUSBMSCSWResult)
					gUSBMSCSWResult = ATA_WaitATABusy();
			}		
			gATALBA += Block;
		}
		while (Block16 && !gUSBMSCSWResult);	

	}

	USBMS_SendCSW();
}

void ATAMS_SCSIList2F()
{
	gUSBMSCSWResult = 0;
	USBMS_SendCSW();
}

muint8 USBMS_WaitIQUE(volatile muint8* QCxxDCR)
{
	muint16 BegTime, CurTime;

	BegTime = MK_GetCurrentTime();		// begin time

	do
	{
	    if (!*QCxxDCR)
	    	return(kCSWPass);			// exit 
	    	
		CurTime = MK_GetCurrentTime();	// current time
	}
	while ( ((CurTime-BegTime) < kATATimeout) || ((BegTime - CurTime) < kATATimeout));

	gATAError = kSCSISKHardwareError;
	mSetBit(ATAHUT,ATA_DCR_L);
	return(kCSWPhaseError);				// timeout => phase error
}

muint8 USBMS_WaitIQUEwithATAIRQ2(volatile muint8* QCxxDCR)
{
	muint16 BegTime, CurTime;


	BegTime = MK_GetCurrentTime();		// begin time
	do
	{
//	    if ((!*QCxxDCR) && mCheckBit(ATAINTRQ,PORTS))
    if (!*QCxxDCR)
    	return(kCSWPass);			// exit if finish transfer
	    	
		if (mCheckBit(ATAINTRQ,PORTS) && (*QCxxDCR > 2) && (!mCheckBit(6,PORTS)))
		{	
			mSetBit(ATAHUT,ATA_DCR_L);
			return (kCSWFailed);
		}	
		CurTime = MK_GetCurrentTime();	// current time

	}
	while ( ((CurTime-BegTime) < kATATimeout) || ((BegTime - CurTime) < kATATimeout));

	mSetBit(ATAHUT,ATA_DCR_L);
	gATAError = kSCSISKHardwareError;
	return(kCSWPhaseError);				// timeout => phase error
}


muint8 USBMS_WaitIQUEwithATAIRQ(volatile muint8* QCxxDCR)
{
	muint16 BegTime, CurTime;


	BegTime = MK_GetCurrentTime();		// begin time
	do
	{
    if (!*QCxxDCR)
    	return(kCSWPass);			// exit if finish transfer
	    	
		if (mCheckBit(ATAINTRQ,PORTS) && (!mCheckBit(6,PORTS)))
		{	
			mSetBit(ATAHUT,ATA_DCR_L);
			return (kCSWFailed);
		}	
		CurTime = MK_GetCurrentTime();	// current time

	}
	while ( ((CurTime-BegTime) < kATATimeout) || ((BegTime - CurTime) < kATATimeout));

	mSetBit(ATAHUT,ATA_DCR_L);
	gATAError = kSCSISKHardwareError;
	return(kCSWPhaseError);				// timeout => phase error
}


/*
muint8 USBMS_WaitIQUEwithATAIRQ(volatile muint8* QCxxDCR)
{

//	mSetBit(mCheckTimeoutStart,gATATimeoutStatus);
	muint16	i,j;

	DisableInterrupts;
	for (i=0; i<0x1000; i++)
	{
		for (j=0; j<0x4000; j++)
		{

			if ( ((QC12DSR & QC1BP_H & 0x01)) && (*QCxxDCR > 1) )
			{
				while (QC1BP_L < 0xe0)
				{
					if (!mCheckBit(4,PORTS))			// no USB power
					break;
				}
	
				QC2REQ = kQCREQNone;
			}
		

			if (!mCheckBit(4,PORTS))			// no USB power
				UTL_CheckBusPower();
		
			if ( ((QC12DSR & 0x03) == 2) || (*QCxxDCR == 1))
				QC2REQ = kQCREQATATx;
			
			else if (mCheckBit(TFRERR, UEPCSR4B))
				UEPCSR4B = (1<<TFRERR);				// clear error flag

	    else if (!*QCxxDCR)
	    {
	    	EnableInterrupts;
	    	return(kCSWPass);			// exit if finish transfer
	    }
		    	
			else if (mCheckBit(ATAINTRQ,PORTS) && (*QCxxDCR) && (!mCheckBit(6,PORTS)))
			{	
				mSetBit(ATAHUT,ATA_DCR_L);
	    	EnableInterrupts;

				if (*QCxxDCR == 1)
					return(kCSWPass);
				
				asm nop;
				return (kCSWFailed);
			}	

		}
	}
	EnableInterrupts
	mSetBit(ATAHUT,ATA_DCR_L);
	gATAError = kSCSISKHardwareError;
	return(kCSWPhaseError);				// timeout => phase error
}
*/
//
// The end of file usbmb_processor.c 
// *********************************************************************************

⌨️ 快捷键说明

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