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

📄 d12ci.c

📁 44b0板上的usb固件及上位机程序
💻 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 + -