📄 d12ci.c
字号:
//============================================================================//
// 文件名: D12CI.c
// 描 述: PDIUSBD12命令接口
// 日 期: 2003/04/03
//=============================================================================//
#include "D12CI.h"
#include "..\\usb\\chap9.h"
#define D12_FULLEMPTY 0x01
extern EPPFLAGS bEPPflags;
extern CONTROL_TRANSFERS ControlData;
extern void F_InitWriteD12(void);
extern void F_InitReadD12(void);
extern void F_WriteCmdToD12(unsigned int Command);
extern void F_WriteDataToD12(unsigned int Data);
extern unsigned int F_ReadD12(void);
void F_Disconnect_USB(void);
void F_Connect_USB(void);
void F_Reconnect_USB(void);
//void F_D12_SendResume(void);
void F_D12_SetAddressEnable(unsigned int bAddress, unsigned int bEnable)
{
F_InitWriteD12();
F_WriteCmdToD12(0x00D0);
if(bEnable)
bAddress |= 0x80;
F_WriteDataToD12(bAddress);
}
void F_D12_SetEndpointEnable(unsigned int bEnable)
{
F_InitWriteD12();
F_WriteCmdToD12(0x00D8);
if(bEnable)
F_WriteDataToD12(0x0001);
else
F_WriteDataToD12(0x0001);
}
void F_D12_SetMode(unsigned int bConfig, unsigned int bClkDiv)
{
F_InitWriteD12();
F_WriteCmdToD12(0x00F3);
F_WriteDataToD12(bConfig);
F_WriteDataToD12(bClkDiv);
}
void F_D12_SetDMA(unsigned int bMode)
{
F_InitWriteD12();
F_WriteCmdToD12(0x00FB);
F_WriteDataToD12(bMode);
}
void F_D12_SetEndpointStatus(unsigned int bEndp, unsigned int bStalled)
{
F_InitWriteD12();
F_WriteCmdToD12(0x40 + bEndp);
F_WriteDataToD12(bStalled);
}
unsigned int F_D12_WriteEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
{
unsigned int i;
F_InitWriteD12();
F_WriteCmdToD12(endp);
F_InitReadD12();
F_ReadD12();
F_InitWriteD12();
F_WriteCmdToD12(0x00F0);
F_WriteDataToD12(0x0000);
F_WriteDataToD12(len);
for(i=0; i<len; i++)
{
F_WriteDataToD12(*(buf+i));
}
F_WriteCmdToD12(0x00FA);
return len;
}
void F_D12_AcknowledgeEndpoint(unsigned int endp)
{
F_InitWriteD12();
F_WriteCmdToD12(endp);
F_WriteCmdToD12(0x00F1);
if(endp == 0)
F_WriteCmdToD12(0x00F2);
}
unsigned int F_D12_ReadInterruptRegister(void)
{
unsigned int b1,j;
F_InitWriteD12();
F_WriteCmdToD12(0x00F4);
F_InitReadD12();
b1 = F_ReadD12();
j = F_ReadD12();
j <<= 8;
j += b1;
return j;
}
unsigned int F_D12_ReadLastTransactionStatus(unsigned int bEndp)
{
F_InitWriteD12();
F_WriteCmdToD12(0x40 + bEndp);
F_InitReadD12();
return F_ReadD12();
}
unsigned int F_D12_ReadEndpoint(unsigned int endp, unsigned int len, unsigned int * buf)
{
unsigned int i, j;
F_InitWriteD12();
F_WriteCmdToD12(endp);
F_InitReadD12();
if((F_ReadD12() & D12_FULLEMPTY) == 0)
{
return 0;
}
F_InitWriteD12();
F_WriteCmdToD12(0x00F0);
F_InitReadD12();
j = F_ReadD12();
j = F_ReadD12();
if(j > len)
j = len;
for(i=0; i<j; i++)
*(buf+i) = F_ReadD12();
F_InitWriteD12();
F_WriteCmdToD12(0x00F2);
return j;
}
unsigned int F_D12_SelectEndpoint(unsigned int bEndp)
{
unsigned int c;
F_InitWriteD12();
F_WriteCmdToD12(bEndp);
F_InitReadD12();
c = F_ReadD12();
return c;
}
void F_Disconnect_USB(void)
{
F_D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_4M);
}
void F_Connect_USB(void)
{
F_D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
F_D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_4M );
}
void F_Reconnect_USB(void)
{
int i,j;
F_Disconnect_USB();
for(i=0;i<=500;i++)
{
for(j=0;j<1000;j++)
{
};
};
F_Connect_USB();
}
unsigned int F_D12_ReadEndpointAndClrD12Int(unsigned int endp, unsigned int len, unsigned int * buf)
{
unsigned int I_DataLength=0,i=0;
F_InitWriteD12();
F_WriteCmdToD12(endp);
F_InitReadD12();
if((F_ReadD12() & D12_FULLEMPTY) == 0)
{
return 0;
}
F_InitWriteD12();
F_WriteCmdToD12(0x00F0);
F_InitReadD12();
I_DataLength = F_ReadD12();
I_DataLength = F_ReadD12();
if(I_DataLength > len)
I_DataLength = len;
// UartSendData(0x22);
for(i=0; i<I_DataLength; i++)
{
*(buf+i) = F_ReadD12();
// UartSendData(*(buf+i));
}
F_InitWriteD12();
F_WriteCmdToD12(0x00F2);
//clear d12 interrupt
F_D12_ReadLastTransactionStatus(endp);
return I_DataLength;
}
unsigned int F_D12_WriteEndpointAndClrD12Int(unsigned int endp, unsigned int len, unsigned int * buf)
{
unsigned int i;
F_InitWriteD12();
F_WriteCmdToD12(endp);
F_InitReadD12();
F_ReadD12();
F_InitWriteD12();
F_WriteCmdToD12(0x00F0);
F_WriteDataToD12(0x0000);
F_WriteDataToD12(len);
for(i=0; i<len; i++)
{
F_WriteDataToD12(*(buf+i));
}
F_WriteCmdToD12(0x00FA);
//clear d12 interrupt
F_D12_ReadLastTransactionStatus(endp);
return len;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -