📄 isr.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 + -