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

📄 isr.c

📁 44b0板上的usb固件及上位机程序
💻 C
字号:
/******************************************************************************
* Filename: isr.c
* Author: Tan Dewen
* Date: 2004/07/03
******************************************************************************/
#include "USB.h"
#include "44b.h"
EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;

U8 GenEpBuf[200];

//ControlData.pData = GenEpBuf;

void fn_usb_isr()
{
	U8 i_st;
	
	bEPPflags.bits.in_isr = 1;
	do
	{
		i_st = D12_ReadInterruptRegister();
	} while( i_st==0 );

	if( i_st!=0 )
	{

		if( i_st&BUSRESET_INT )
			bEPPflags.bits.bus_reset = 1;
			
		if( i_st&SUSPEND_INT )
			bEPPflags.bits.suspend ^= 1;
		
		if( i_st&DMA_EOT )
			dma_eot();
		
		if( i_st&EP0_OUT_INT )
			ep0_rxdone();
		
		if( i_st&EP0_IN_INT )
			ep0_txdone();
		
		if( i_st&EP1_IN_INT )
			ep1_txdone();
		
		if( i_st&EP1_OUT_INT )
			ep1_rxdone();
		
		if( i_st&EP2_IN_INT )
			main_txdone();
		
		if( i_st&EP2_OUT_INT )
			main_rxdone();			
	}
	bEPPflags.bits.in_isr = 0;
	//D12_SetEndpointEnable(1);
}

void ep0_rxdone(void)
{
	U8 ep_last, i;
	
	ep_last = D12_ReadLastTransactionStatus(0);
	
	if( ep_last&D12_SETUPPACKET )
	{
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		i = D12_ReadEndpoint(0, (U8*)(&ControlData.DeviceRequest), sizeof(ControlData.DeviceRequest) );
		if( i!=sizeof(DEVICE_REQUEST))
		{
			// stalled endpoint0
			D12_SetEndpointStatus(0,1);
			D12_SetEndpointStatus(1,1);
			bEPPflags.bits.control_state = USB_IDLE;
			return;
		}
		// ack control endpoint
		D12_AckknowledgeEndpoint(0);
		D12_AckknowledgeEndpoint(1);
		
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
		
		if( ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_INPUT )
		{
			// receive data from host
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_TRANSMIT;
		}
		else
		{
			if( ControlData.DeviceRequest.wLength==0 )
			{
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;
			}
			else
			{
				if( ControlData.DeviceRequest.wLength>EP0_MAX_PACKET_SIZE )
				{
					// stalled 
					bEPPflags.bits.control_state = USB_IDLE;
					D12_SetEndpointStatus(0,1);
					D12_SetEndpointStatus(1,1);
				}
				else
					bEPPflags.bits.control_state = USB_RECEIVE;
			} // set command with data
		} // else set command
	} // if setup packet
	else if( bEPPflags.bits.control_state==USB_RECEIVE )
	{
		i = D12_ReadEndpoint(0, ControlData.dataBuffer+ControlData.wCount, EP0_MAX_PACKET_SIZE);
		ControlData.wCount += i;
		if( (i!=EP0_MAX_PACKET_SIZE) || (ControlData.wCount>=ControlData.wLength) )
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}
	else
	{
		bEPPflags.bits.control_state = USB_IDLE;
	}
	// stalled endpoint0
//	D12_SetEndpointStatus(0,1);
//	D12_SetEndpointStatus(1,1);

}

//
void ep0_txdone(void)
{
	U16 i;
	
	i = ControlData.wLength - ControlData.wCount;
	D12_ReadLastTransactionStatus(1);
	if( bEPPflags.bits.control_state!=USB_TRANSMIT )
	{
		TransmitNullResponseOnEp0();
		return;
	}
	if( i>=EP0_MAX_PACKET_SIZE )
	{
		D12_WriteEndpoint(1, ControlData.pData+ControlData.wCount, EP0_MAX_PACKET_SIZE);
		ControlData.wCount += EP0_MAX_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
	}
	else if( i!=0 )
	{
		D12_WriteEndpoint(1, ControlData.pData+ControlData.wCount, i);
		ControlData.wCount += i;
		bEPPflags.bits.control_state = USB_IDLE;
	}
	else // (i==0)
	{
		D12_WriteEndpoint(1, 0, 0);
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

//
void dma_eot(void)
{

}

//
void ep1_txdone(void)
{
	U8 i;
	
	i = D12_ReadLastTransactionStatus(SELECT_EP1_IN);
//	GenEpBuf[0] = 0;
	GenEpBuf[0] = rPDATG&0xf0;
	GenEpBuf[0] >>= 4;
	GenEpBuf[0] = ~GenEpBuf[0]&0xf;
	D12_WriteEndpoint(SELECT_EP1_IN, GenEpBuf, 8);
}

//
void ep1_rxdone(void)
{
	U8 len;
	
	len = D12_ReadLastTransactionStatus(SELECT_EP1_OUT);
	len = D12_ReadEndpoint(SELECT_EP1_OUT, GenEpBuf, sizeof(GenEpBuf));
	if( len!=0 )
		bEPPflags.bits.ep1_rxdone = 1;
}

//
void main_txdone(void)
{
	U8 i;

	i = D12_ReadLastTransactionStatus(5);
	GenEpBuf[0] = rPDATG&0xf0;
	GenEpBuf[0] >>= 4;
	GenEpBuf[0] = ~GenEpBuf[0]&0xf;
	D12_WriteEndpoint(5, GenEpBuf, 8);

}
	
void main_rxdone(void)
{
	U8 len;

	len = D12_ReadLastTransactionStatus(4);
	len = D12_ReadEndpoint(4, GenEpBuf, 8);
	if( len!=0 )
		bEPPflags.bits.ep1_rxdone = 1;

}
	

⌨️ 快捷键说明

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