📄 d12ci.c
字号:
//D12CI.c
#include "common.h"
#include "D12CI.h"
#include "mainloop.h"
extern EPPFLAGS bEPPflags;
void outportb(unsigned int Addr,unsigned char Data)
{
*((unsigned char xdata *)Addr) = Data;
}
unsigned char inportb(unsigned int Addr)
{
return *((unsigned char xdata *)Addr);
}
void D12_SetAddressEnable(uchar bAddress,uchar bEnable)
{
outportb(D12_COMMAND,0xd0);
if(bEnable)
bAddress |= 0x80;
outportb(D12_DATA,bAddress);
}
void D12_SetEndpointEnable(uchar bEnable)
{
outportb(D12_COMMAND,0xd8);
if(bEnable)
outportb(D12_DATA,1);
else
outportb(D12_DATA,0);
}
void D12_SetMode(uchar bConfig,uchar bClkDiv)
{
outportb(D12_COMMAND,0xf3);
outportb(D12_DATA,bConfig);
outportb(D12_DATA,bClkDiv);
}
void D12_SetDMA(uchar bMode)
{
outportb(D12_COMMAND,0xfb);
outportb(D12_DATA,bMode);
}
ushort D12_ReadInterruptRegister(void)
{
uchar b1;
uint j;
outportb(D12_COMMAND,0xf4);
b1 = inportb(D12_DATA);
j = inportb(D12_DATA);
j <<= 8;
j += b1;
return j;
}
uchar D12_SelectEndpoint(uchar bEndp)
{
uchar c;
outportb(D12_COMMAND,bEndp);
c = inportb(D12_DATA);
return c;
}
uchar D12_ReadLastTransactionStatus(uchar bEndp)
{
outportb(D12_COMMAND,0x40+bEndp);
return inportb(D12_DATA);
}
void D12_SetEndpointStatus(uchar bEndp,uchar bStalled)
{
outportb(D12_COMMAND,0x40+bEndp);
outportb(D12_DATA,bStalled);
}
uchar D12_ReadEndpointStatus(uchar bEndp)
{
outportb(D12_COMMAND,0x80+bEndp);
return inportb(D12_DATA);
}
void D12_SendResume(void)
{
outportb(D12_COMMAND,0xf6);
}
ushort D12_ReadCurrentFrameNumber(void)
{
ushort i,j;
outportb(D12_COMMAND,0xf5);
i = inportb(D12_DATA);
j = inportb(D12_DATA);
i += (j<<8);
return i;
}
uchar D12_ReadEndpoint(uchar endp,uchar len,uchar * buf)
{
uchar i,j;
outportb(D12_COMMAND,endp);
if((inportb(D12_DATA)&0x01)==0)
return 0;
outportb(D12_COMMAND,0x80+endp);
i = inportb(D12_DATA);
i = i&0x60;
if(endp == 2)
{
if(i==0x60)
bEPPflags.bits.ep1buf_full = 1;
else
bEPPflags.bits.ep1buf_full = 0;
}
if(endp ==4)
{
if(i==0x60)
bEPPflags.bits.ep2buf_full = 1;
else
bEPPflags.bits.ep2buf_full = 0;
}
outportb(D12_COMMAND,0xF0);
j = inportb(D12_DATA);
j = inportb(D12_DATA);
if(j>len)
j = len;
for(i = 0;i<j;i++)
*(buf+i) = inportb(D12_DATA);
outportb(D12_COMMAND,0xf2);
return j;
}
uchar D12_WriteEndpoint(uchar endp,uchar len ,uchar * buf)
{
uchar i;
outportb(D12_COMMAND,endp);
inportb(D12_DATA);
outportb(D12_COMMAND,0xf0);
outportb(D12_DATA,0);
outportb(D12_DATA,len);
for(i = 0;i<len;i++)
outportb(D12_DATA,*(buf+i));
outportb(D12_COMMAND,0xfa);
return len;
}
void D12_AcknowledgeEnppoint(uchar endp)
{
outportb(D12_COMMAND,endp);
outportb(D12_COMMAND,0xf1);
if(endp == 0)
outportb(D12_COMMAND,0xf2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -