⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbci.c

📁 PDIUSBD12的嵌入式软件
💻 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 + -