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