📄 isr.c
字号:
#include "declare.h"
#include "isr.h"
#pragma disable
void extern0_ISR(void) interrupt 0
{
d12comm(0xf4);
s = d12read();
d12read();
if (sb7 == 1) //SuspendChange
{
}
else if (sb6 == 1) //BusReset
{
Configured = 0;
}
else if (sb0 == 1) //EP0Out
{
d12comm(0x40);
d12read();
SetupPacketReceived();
}
else if (sb1 == 1) //EP0In
{
d12comm(0x41);
d12read();
if (SaveLength != 0)
{
PTR = SavePTR;
SendNextPieceOfDescriptor(SaveLength);
}
}
else if (sb2 == 1) //EP1Out
{
d12comm(0x42);
d12read();
}
else if (sb3 == 1) //EP1In
{
d12comm(0x43);
d12read();
IsListening = 1;
if (mode == D12TEST) Output(Counter);
}
else if (sb4 == 1) //EP2Out
{
d12comm(0x44);
d12read();
}
else if (sb5 == 1) //EP2In
{
d12comm(0x45);
d12read();
}
else //SOF
{
if (Configured == 1)
{
switch (mode) {
case D12TEST:
if (--MSecCounter == 0)
{
MSecCounter = 125;
Counter++;
ReplyCount = 1;
ReplyBuffer[0] = Counter;
IsListening = 0;
d12comm(0x03);
SendReplyBuffer();
}
break;
case KEYBOARD:
// ps2write(0xfe);
// ps2read();
// ps2read();
// Output(PS2_BYTE);
/*
ReplyCount = 0;
ReplyBuffer[0] = 0;
ReplyBuffer[1] = 0;
ReplyBuffer[2] = 0;
ReplyBuffer[3] = 0;
ReplyBuffer[4] = 0;
ReplyBuffer[5] = 0;
ReplyBuffer[6] = 0;
ReplyBuffer[7] = 0;
IsListening = 0;
d12comm(0x03);
SendReplyBuffer();
*/
break;
case MOUSE:
break;
case PRINTER:
break;
case STORAGE:
break;
default:
;
}
}
}
}
void timer0_ISR (void) interrupt 1{} /* not used */
void extern1_ISR(void) interrupt 2{} /* not used */
void timer1_ISR (void) interrupt 3{} /* not used */
void serial_ISR (void) interrupt 4{} /* not used */
void SetupPacketReceived(void)
{
SaveLength = 0;
d12comm(0x00);
d12comm(0xf0);
SetupDataResv = d12read();
SetupDataLen = d12read();
RequestType = d12read();
Request = d12read();
wValueLow = d12read();
wValueHigh = d12read();
wIndexLow = d12read();
wIndexHigh = d12read();
wLengthLow = d12read();
wLengthHigh = d12read();
/*
#define tttt 0
if (++temp == tttt)//////////////////////////////////////////////////////////////////////////////////
{
Output(SetupDataLen);
delay(4000);
Output(RequestType);
delay(4000);
Output(Request);
delay(4000);
Output(wValueLow);
delay(4000);
Output(wValueHigh);
delay(4000);
Output(wIndexLow);
delay(4000);
Output(wIndexHigh);
delay(4000);
Output(wLengthLow);
delay(4000);
Output(wLengthHigh);
delay(4000);
}*/
d12comm(0xf1);
d12comm(0xf2);
d12comm(0x01);
d12comm(0xf1);
if (SetupDataLen != 0)
{
ServiceSetupPacket();
if (STALL == 1)
{
d12comm(0x40); //SendStall
d12write(0x01);
d12comm(0x41);
d12write(0x01);
}
else
{
if (SetAddr == 1)
{
SetD12Address();
}
else if (SendData == 0)
{
HandShake();
}
else if (IsDescriptor == 0)
{
SendReplyBuffer();
}
else
{
SendDescriptor();
}
}
}
}
void SendDescriptor(void)
{
if (wLengthHigh == 0)
{
if (ReturnLength < wLengthLow)
{
SendNextPieceOfDescriptor(ReturnLength);
}
else
{
SendNextPieceOfDescriptor(wLengthLow);
}
}
else
{
SendNextPieceOfDescriptor(ReturnLength);
}
}
void SendNextPieceOfDescriptor(unsigned char Len)
{
if (Len > EP0Size)
{
SaveLength = Len - EP0Size;
SavePTR = PTR + EP0Size;
SendPacketToD12(EP0Size);
}
else
{
SaveLength = 0;
SendPacketToD12(Len);
}
}
void SendPacketToD12(unsigned char Len)
{
/*
if(temp++==2)
{
Output(Len);
delay(5000);
}
*///to send but not sending
ReplyCount = Len;
if (Len != 0)
{
for (i=0;i<Len;i++)
{
ReplyBuffer[i] = *(PTR++);//CBYTE[PTR++];
}
}
SendReplyBuffer();
}
void SendReplyBuffer(void)
{
d12comm(0xf0);
d12write(0x00);
d12write(ReplyCount);
if (ReplyCount != 0)
{
for (i=0;i<ReplyCount;i++)
{
d12write(ReplyBuffer[i]);
ReplyBuffer[i] = 0;///////////////////////////////////////////////////////////
}
}
d12comm(0xfa);
/*
if (temp == tttt)///////////////////////////////////////////////////////////////////
{
Output(ReplyCount);
delay(4000);
for (i=0;i<ReplyCount;i++)
{
Output(ReplyBuffer[i]);
delay(4000);
}
}
*/
}
void SetD12Address(void)
{
d12comm(0xd0);
s = wValueLow;
sb7 = 1;
d12write(s);
d12comm(0xd8);
d12write(0x01);
if (mode == D12TEST)
{
d12comm(0xfb);
d12write(0x20);
}
HandShake();
}
void HandShake(void)
{
SendPacketToD12(0);
}
void Wait4D(void)
{
do {
d12comm(0xf4);
s = d12read();
d12read();
} while (s^0 == 0);
d12comm(0x00);
d12comm(0xf0);
d12read();
d12read();
switch (mode) {
case D12TEST:
i = d12read();
if (i == 0xff)
{
Counter = Input();
}
else
{
Counter = i;
}
break;
case KEYBOARD:
break;
case MOUSE:
break;
case PRINTER:
break;
case STORAGE:
break;
default:
;
}
d12comm(0xf1);
d12comm(0xf2);
d12comm(0x01);
d12comm(0xf1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -