📄 d12ci.c
字号:
#include "mainloop.h"
#include "epphal.h"
#include "d12ci.h"
void D12_SetAddressEnable(unsigned char bAddress,
unsigned char bEnable)
{
outportb(D12_COMMAND, 0XD0);
if(bEnable)
bAddress |= 0X80;
outportb(D12_DATA, bAddress);
}
void D12_SetEndpointEnable(unsigned char bEnable)
{
outportb(D12_COMMAND, 0XD8);
if(bEnable)
outportb(D12_DATA, 1);
else
outportb(D12_DATA, 0);
}
void D12_SetMode(unsigned char bConfig,
unsigned char bClkDiv)
{
outportb(D12_COMMAND, 0XF3);
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
}
void D12_SetDMA(unsigned char bMode)
{
outportb(D12_COMMAND, 0XFB);
outportb(D12_DATA, bMode);
}
unsigned int D12_ReadInterruptRegister(void)
{
unsigned char tmp;
unsigned int IntReg;
outportb(D12_COMMAND, 0XF4);
tmp = inportb(D12_DATA);
IntReg = (unsigned int)inportb(D12_DATA);
IntReg <<= 8;
IntReg |= tmp;
return IntReg;
}
unsigned int D12_ReadChipID(void)
{
unsigned char tmp;
unsigned int ID;
outportb(D12_COMMAND, 0XFD);
tmp = inportb(D12_DATA);
ID = (unsigned int)inportb(D12_DATA);
ID <<= 8;
ID += tmp;
return ID;
}
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
outportb(D12_COMMAND, bEndp);
return inportb(D12_DATA);
}
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
outportb(D12_COMMAND, 0X40 | bEndp);
return inportb(D12_DATA);
}
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
outportb(D12_COMMAND, 0X80 | bEndp);
return inportb(D12_DATA);
}
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
outportb(D12_COMMAND,0X40 | bEndp);
outportb(D12_DATA, bStalled);
}
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0XF6);
}
unsigned short D12_ReadCurrentFrameNumber(void)
{
unsigned int r;
outportb(D12_COMMAND, 0XF5);
r = inportb(D12_DATA);
r <<= 8;
r |= inportb(D12_DATA);
return r;
}
unsigned char D12_ReadEndpoint(unsigned char endp,
unsigned char len,
unsigned char * buf)
{
unsigned char i,j;
outportb(D12_COMMAND, endp); //Select Endpoint
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) //Get Buffer Status:empty or full
return 0;
outportb(D12_COMMAND, 0X80 | endp); //Get Endpoint Status
i = inportb(D12_DATA);
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); //Read Endpoint
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); //Clear Buffer
return j;
}
unsigned char D12_WriteEndpoint(unsigned char endp,
unsigned char len,
unsigned char * buf)
{
unsigned char i;
outportb(D12_COMMAND, endp); //Select Endpoint
inportb(D12_DATA);
outportb(D12_COMMAND, 0XF0); //Write Endpoint
outportb(D12_DATA, 0);
outportb(D12_DATA, len);
for(i = 0; i < len; i++)
outportb(D12_DATA, *(buf + i));
outportb(D12_COMMAND, 0XFA); //Enable Buffer
return len;
}
void D12_AcknowledgeEndpoint(unsigned char endp)
{
outportb(D12_COMMAND, endp); //Select Endpoint
outportb(D12_COMMAND, 0XF1); //set ACK
if(endp == 0)
outportb(D12_COMMAND, 0XF2); //Clear Buffer
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -