📄 usbci.c
字号:
/*
* usbci.c
*
* PDIUSBD12 USB device comm's - "Command Interface layer".
*
* From Philips PDIUSBD12 firmware library (D12CI.C)
*
* NB: See "usbhal.h" for definitions of macros DISABLE_USB_IRQ and RESTORE_USB_IRQ.
*/
#include "gendef.h"
#include "usbdef.h"
#include "usbhal.h"
#include "usbci.h"
#include "usb200.h"
void D12_SetAddressEnable(uchar bAddress, uchar bEnable)
{
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0xD0);
if (bEnable) bAddress |= 0x80;
d12outp(D12_DATA, bAddress);
RESTORE_USB_IRQ;
}
void D12_SetEndpointEnable(uchar bEnable)
{
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0xD8);
if (bEnable) d12outp(D12_DATA, 1);
else d12outp(D12_DATA, 0);
RESTORE_USB_IRQ;
}
void D12_SetMode(uchar bConfig, uchar bClkDiv)
{
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0xF3);
d12outp(D12_DATA, bConfig);
d12outp(D12_DATA, bClkDiv);
RESTORE_USB_IRQ;
}
void D12_SetDMA(uchar bMode)
{
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0xFB);
d12outp(D12_DATA, bMode);
RESTORE_USB_IRQ;
}
ushort D12_ReadInterruptRegister(void)
{
uchar b1;
ushort j;
d12outp(D12_COMMAND, 0xF4);
b1 = d12inp(D12_DATA);
j = d12inp(D12_DATA);
j <<= 8;
j += b1;
return j;
}
uchar D12_SelectEndpoint(uchar bEndp)
{
uchar c;
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, bEndp);
c = d12inp(D12_DATA);
RESTORE_USB_IRQ;
return c;
}
uchar D12_ReadLastTransactionStatus(uchar bEndp)
{
d12outp(D12_COMMAND, 0x40 + bEndp);
return d12inp(D12_DATA);
}
uchar D12_ReadEndpointStatus(uchar bEndp)
{
uchar c;
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0x80 + bEndp);
c = d12inp(D12_DATA);
RESTORE_USB_IRQ;
return c;
}
void D12_SetEndpointStatus(uchar bEndp, uchar bStalled)
{
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0x40 + bEndp);
d12outp(D12_DATA, bStalled);
RESTORE_USB_IRQ;
}
void D12_SendResume(void)
{
d12outp(D12_COMMAND, 0xF6);
}
ushort D12_ReadCurrentFrameNumber(void)
{
ushort i, j;
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0xF5);
i = d12inp(D12_DATA);
j = d12inp(D12_DATA);
i += (j<<8);
RESTORE_USB_IRQ;
return i;
}
ushort D12_ReadChipID(void)
{
ushort i, j;
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, 0xFD);
i = d12inp(D12_DATA);
j = d12inp(D12_DATA);
i += (j<<8);
RESTORE_USB_IRQ;
return i;
}
uchar D12_ReadEndpoint(uchar endp, uchar * buf, uchar len)
{
uchar i, j;
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, endp);
if ((d12inp(D12_DATA) & D12_FULLEMPTY) == 0)
{
RESTORE_USB_IRQ;
return 0;
}
d12outp(D12_COMMAND, 0xF0);
j = d12inp(D12_DATA);
j = d12inp(D12_DATA);
if (j > len) j = len;
for (i=0; i<j; i++)
{
*(buf+i) = d12inp(D12_DATA);
}
d12outp(D12_COMMAND, 0xF2);
RESTORE_USB_IRQ;
return j;
}
uchar D12_WriteEndpoint(uchar endp, uchar * buf, uchar len)
{
uchar i;
DISABLE_USB_IRQ;
d12outp(D12_COMMAND, endp);
d12inp(D12_DATA);
d12outp(D12_COMMAND, 0xF0);
d12outp(D12_DATA, 0);
d12outp(D12_DATA, len);
for (i=0; i<len; i++)
{
d12outp(D12_DATA, *(buf+i));
}
d12outp(D12_COMMAND, 0xFA);
RESTORE_USB_IRQ;
return len;
}
void D12_AcknowledgeEndpoint(uchar endp)
{
d12outp(D12_COMMAND, endp);
d12outp(D12_COMMAND, 0xF1);
if (endp == 0) d12outp(D12_COMMAND, 0xF2);
}
/* end */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -