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

📄 isr.c

📁 usbhost 开发码
💻 C
字号:
//////isr.c
#include "common.h"
#include "isr.h"
#include "d12ci.h"
#include "mainloop.h"
#include "chap_9.h"
#include "usb100.h"
#include "disp.h"

extern EPPFLAGS 		bEPPflags;
extern CONTROL_XFER 	ControlData;
			
extern uchar EpBuf[64];
extern uchar GenEpBuf[64];

void fn_usb_isr()
{	
//	static uchar count;//
	uint i_st;
	bEPPflags.bits.in_isr = 1;
	i_st = D12_ReadInterruptRegister();
//	if(count>0x39)//
//		count = 0x30;//
//	dispinfo(2,"int:");
//	writedispdata(count++);//
//	disphex(i_st);
//	dispinfo(0,"  ");
	if(i_st!=0)
	{
		if(i_st&D12_INT_BUSRESET)
			bEPPflags.bits.bus_reset = 1;
		if(i_st&D12_INT_EOT)
			dma_eot();
		if(i_st&D12_INT_SUSPENDCHANGE)
			bEPPflags.bits.suspend = 1;
		if(i_st&D12_INT_ENDP0IN)
			ep0_txdone();
		if(i_st&D12_INT_ENDP0OUT)
			ep0_rxdone();
		if(i_st&D12_INT_ENDP1IN)
			ep1_txdone();
		if(i_st&D12_INT_ENDP1OUT)
			ep1_rxdone();
		if(i_st&D12_INT_ENDP2IN)
			main_txdone();
		if(i_st&D12_INT_ENDP2OUT)
			main_rxdone();
	}
	bEPPflags.bits.in_isr = 0;
}

void dma_eot()
{
////not use DMA
}
void ep0_rxdone()
{
	uchar ep_last,i;
//	dispinfo(0,"ep0rx");
	ep_last = D12_ReadLastTransactionStatus(0);
	if(ep_last&D12_SETUPPACKET)
	{
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
			bEPPflags.bits.control_state = USB_IDLE;
			return;
		}
		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
		D12_AcknowledgeEnppoint(0);
		D12_AcknowledgeEnppoint(1);
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
		if(ControlData.DeviceRequest.bmRequestType&USB_ENDPOINT_DIRECTION_MASK)
		{
			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>MAX_CONTROLDATA_SIZE)
				{
					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,EP0_PACKET_SIZE,	ControlData.dataBuffer+ControlData.wCount);
		ControlData.wCount += i;
		if(i != EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}
	else {
	bEPPflags.bits.control_state = USB_IDLE;
	}
}

void ep0_txdone(void)
{
 	short i = ControlData.wLength - ControlData.wCount;
//	dispinfo(0,"ep0tx"); 
	disphex(D12_ReadLastTransactionStatus(1));
	if(bEPPflags.bits.control_state!=USB_TRANSMIT)
		return;
	if(i>=EP0_PACKET_SIZE)
	{
		D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
	}
	else if(i != 0)
	{
		D12_WriteEndpoint(1,i,ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;
		bEPPflags.bits.control_state = USB_IDLE;
	}
	else if(i==0)
	{
		D12_WriteEndpoint(1,0,0);
		bEPPflags.bits.control_state = USB_IDLE;
	}
}
void ep1_txdone()
{
//	dispinfo(0,"ep1tx");
	D12_ReadLastTransactionStatus(3);
}
void ep1_rxdone()
{
	uchar len;
//	dispinfo(0,"ep1tx");
	D12_ReadLastTransactionStatus(2);
	len = D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf);
	if(len !=0)
		bEPPflags.bits.ep1_rxdone = 1;
}
void main_txdone()
{
//	dispinfo(0,"maintx");
	D12_ReadLastTransactionStatus(5);
}
void main_rxdone()
{
	uchar len,epstatus;
//	dispinfo(0,"mainrx");
	D12_ReadLastTransactionStatus(4);
	epstatus = D12_ReadEndpointStatus(4);
	epstatus &= 0x60;
	len = D12_ReadEndpoint(4,64,EpBuf);
	if(epstatus == 0x60)
		len = D12_ReadEndpoint(4,64,EpBuf);
}

⌨️ 快捷键说明

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