📄 hal4d12.c
字号:
///////////////////////////////////////////////////////////////////////
#include "common.h"
#include "Hal4Sys.h"
#include "Hal4d12.h"
///////////////////////////////////////////////////////////////////////
void Hal4D12_SetAddressEnable(u8 bAddress, u8 bEnable)
{
Hal4Sys_D12CmdPortOutB( 0xD0);
if(bEnable)
bAddress |= 0x80;
Hal4Sys_D12DataPortOutB( bAddress);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_SetEndpointEnable(u8 bEnable)
{
Hal4Sys_D12CmdPortOutB( 0xD8);
if(bEnable)
Hal4Sys_D12DataPortOutB( 1);
else
Hal4Sys_D12DataPortOutB( 0);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_SetMode(u8 bConfig, u8 bClkDiv)
{
Hal4Sys_D12CmdPortOutB( 0xF3);
Hal4Sys_D12DataPortOutB( bConfig);
Hal4Sys_D12DataPortOutB( bClkDiv);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_SetDMA(u8 bMode)
{
Hal4Sys_D12CmdPortOutB( 0xFB);
Hal4Sys_D12DataPortOutB( bMode);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_ReadInterruptRegister( u16 * pInterruptReg)
{
u16 tmp;
Hal4Sys_D12CmdPortOutB( 0xf4);
tmp = Hal4Sys_D12DataPortInB();
tmp<<=8;
tmp |= Hal4Sys_D12DataPortInB();
*pInterruptReg=u16_swap(tmp);
}
///////////////////////////////////////////////////////////////////////
u8 Hal4D12_ReadLastTransactionStatus(u8 bEndp)
{
Hal4Sys_D12CmdPortOutB(0x40|bEndp);
return Hal4Sys_D12DataPortInB();
}
///////////////////////////////////////////////////////////////////////
u8 Hal4D12_SelectEndpoint(u8 bEndp)
{
Hal4Sys_D12CmdPortOutB(bEndp);
return Hal4Sys_D12DataPortInB();
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_SetEndpointStatus(u8 bEndp, u8 bStalled)
{
Hal4Sys_D12CmdPortOutB(0x40|bEndp);
Hal4Sys_D12DataPortOutB(bStalled);
}
///////////////////////////////////////////////////////////////////////
u8 Hal4D12_ReadEndpoint(u8 endp, u8 len, u8 * buf)
{
u8 tmp;
u8 *pt;
Hal4Sys_D12CmdPortOutB(endp);
if((Hal4Sys_D12DataPortInB() & D12_FULLEMPTY) == 0)
{
return D12_FIFOEMPTY;
}
Hal4Sys_D12CmdPortOutB(0xf0);
Hal4Sys_D12DataPortInB();
tmp = Hal4Sys_D12DataPortInB(); // fifo len
if( tmp > len)
tmp = len;
else
len = tmp;
pt=buf;
for(; tmp != 0 ; tmp--, pt++ )
*pt = Hal4Sys_D12DataPortInB();
Hal4Sys_D12CmdPortOutB( 0xf2);
return len ;
}
///////////////////////////////////////////////////////////////////////
u8 Hal4D12_WriteEndpoint(u8 endp, u8 len, u8 * buf)
{
Hal4Sys_D12CmdPortOutB( endp);
Hal4Sys_D12DataPortInB();
endp = len;
Hal4Sys_D12CmdPortOutB( 0xF0);
Hal4Sys_D12DataPortOutB( 0);
Hal4Sys_D12DataPortOutB( endp);
for( ; endp != 0; endp-- , buf++)
Hal4Sys_D12DataPortOutB( *(buf) );
Hal4Sys_D12CmdPortOutB( 0xFA); // validate buffer
return len;
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_AcknowledgeEndpoint(u8 endp)
{
Hal4Sys_D12CmdPortOutB( endp);
Hal4Sys_D12CmdPortOutB( 0xF1);
if(endp == 0)
Hal4Sys_D12CmdPortOutB( 0xF2);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_SingleTransmitEP0(u8 * buf, u8 len)
{
Hal4D12_WriteEndpoint(1, len, buf);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_AcknowledgeSETUP(void)
{
Hal4D12_AcknowledgeEndpoint(0);
Hal4D12_AcknowledgeEndpoint(1);
}
///////////////////////////////////////////////////////////////////////
void Hal4D12_StallEP0(void)
{
Hal4D12_SetEndpointStatus(0, 1);
Hal4D12_SetEndpointStatus(1, 1);
}
///////////////////////////////////////////////////////////////////////
u16 Hal4D12_ReadChipID(void)
{
u16 tmp=0;
Hal4Sys_D12CmdPortOutB(0xfd);
tmp=Hal4Sys_D12DataPortInB();
tmp<<=8;
tmp|=Hal4Sys_D12DataPortInB();
return tmp;
}
///////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -