📄 d12ci.c
字号:
/******************************************************************************
* Filename: D12CI.c
* Author: Tan Dewen
* Date: 2004/06/26
******************************************************************************/
#include "D12CI.h"
//
extern voidDelay(int time);
void D12_SetMode(U8 bConfig, U8 bClkDiv)
{
outportb(D12_COMMAND, SET_MODE);
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
}
void D12_SetAddressEnable(U8 bAddress, U8 bEnable)
{
outportb(D12_COMMAND, SET_ADDRESS);
outportb(D12_DATA, bAddress|bEnable);
}
void D12_SetEndpointEnable(U8 bEnable)
{
outportb(D12_COMMAND, SET_ENDPOINT);
outportb(D12_DATA, bEnable);
}
void D12_SetDMA(U8 bMode)
{
outportb(D12_COMMAND, SET_DMA);
outportb(D12_DATA, bMode);
}
U16 D12_ReadInterruptRegister(void)
{
U16 intValue, i;
outportb(D12_COMMAND, READ_INTERRUPT_REGISTER);
i = inportb(D12_DATA);
intValue = inportb(D12_DATA);
intValue <<= 8;
intValue |= i;
return intValue;
}
U8 D12_SelectEndpoint(U8 bEndp)
{
U8 EndpStatus;
outportb(D12_COMMAND, bEndp);
EndpStatus = inportb(D12_DATA);
return EndpStatus;
}
U8 D12_ReadLastTransactionStatus(U8 bEndp)
{
U8 TraStatus;
outportb(D12_COMMAND, READ_LAST_STATUS_CTR_OUT+bEndp);
TraStatus = inportb(D12_DATA);
return TraStatus;
}
void D12_SetEndpointStatus(U8 bEndp, U8 bStalled)
{
outportb(D12_COMMAND, SET_STATUS_CTR_OUT+bEndp);
outportb(D12_DATA, bStalled);
}
void D12_SendResume(void)
{
outportb(D12_COMMAND, SEND_RESUME);
}
U16 D12_ReadCurrentFrameNumber(void)
{
U16 FrameNumber;
U8 temp;
outportb(D12_COMMAND, READ_CURRENT_FRAME_NUMBER);
temp = inportb(D12_DATA);
FrameNumber = inportb(D12_DATA);
FrameNumber <<= 8;
FrameNumber |= temp;
return FrameNumber;
}
U8 D12_ReadEndpoint(U8 endp, U8 *buf, U8 len)
{
U8 RetLen, i;
i = D12_SelectEndpoint(endp);
if( !(i&ENDP_FULL) )
{
return 0;
}
outportb(D12_COMMAND, READ_BUFFER);
RetLen = inportb(D12_DATA); // this byte reserved
RetLen = inportb(D12_DATA); // length of data bytes
if( RetLen>len ) //
RetLen = len;
// read data
for( i=0; i<RetLen; i++)
{
*(buf+i) = inportb(D12_DATA);
}
// clear buffer to receive next packet
outportb(D12_COMMAND, CLEAR_BUFFER);
return RetLen;
}
U8 D12_WriteEndpoint(U8 endp, U8 *buf, U8 len)
{
U8 RetLen, i;
while(1)
{
i = D12_SelectEndpoint(endp);
if( !(i&ENDP_FULL) )
break;
}
if( len>130 ) len = 130; // max read/write bytes is 130
outportb(D12_COMMAND, WRITE_BUFFER);
outportb(D12_DATA, 0);
outportb(D12_DATA, len);
for( i=0; i<len; i++)
{
outportb(D12_DATA, *(buf+i) );
}
// indicates data in buffer is valid
outportb(D12_COMMAND, VALIDATE_BUFFER);
return RetLen;
}
void D12_AckknowledgeEndpoint(U8 endp)
{
D12_SelectEndpoint(endp);
outportb(D12_COMMAND, ACK_SETUP);
if( !endp )
D12_ClearBuffer();
}
void D12_ClearBuffer(void)
{
outportb(D12_COMMAND, CLEAR_BUFFER);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -