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

📄 __usbd12.c

📁 C语言版的USB单片机固件源代码
💻 C
字号:
//===================================================================//
//     Project Name : ZBoard
//      Module Name : Master Firmware Program
//     Product Type : License
//      OS/Dev Tool : AT89C52, uVision 2
//  Original Author : Ray Yang
//     Organization : YBWork.com
//    Original Date : July, 25, 2001
//             Addr : Room 402, No. 131, Meilong No. 9
//              TEL : 86-21-54630718
//            EMail : rayyang2000@yahoo.com
//          Website : http://www.ybwork.com
//		  Copyright : Copyright (L) YBWork.com, 2001
//         Comments : 
//                    
//					<< History >> 
//					July, 25, 2001		The first release
//===================================================================//

#include "HAL.H"
#include "ZBoard.H"
#include "USBD12.H"
#include "VDOR.H"
#include "FLASH.H"

extern ZBOARDFLAGS bZBoardFlags;
extern unsigned char idata GenBuf[GENBUF_LENGH];
extern unsigned char nFlashPhase;
extern CODE_DATA idata CodeData;

void USBD12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xD0);
	if(bEnable)
		bAddress |= 0x80;
	outportb(IC_D12_DATA, bAddress);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;
}

void USBD12_SetEndpointEnable(unsigned char bEnable)
{
	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xD8);
	if(bEnable)
		outportb(IC_D12_DATA, 1);
	else
		outportb(IC_D12_DATA, 0);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;
}

void USBD12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xF3);
	outportb(IC_D12_DATA, bConfig);
	outportb(IC_D12_DATA, bClkDiv);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;
}

void USBD12_SetDMA(unsigned char bMode)
{
	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xFB);
	outportb(IC_D12_DATA, bMode);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;
}

unsigned short USBD12_ReadInterruptRegister(void)
{
	unsigned char b1;
	unsigned int j;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xF4);
	b1 = inportb(IC_D12_DATA);
	j = inportb(IC_D12_DATA);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	j <<= 8;
	j += b1;

	return j;
}

unsigned char USBD12_SelectEndpoint(unsigned char bEndp)
{
	unsigned char c;

	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, bEndp);
	c = inportb(IC_D12_DATA);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;

	return c;
}

unsigned char USBD12_ReadLastTransactionStatus(unsigned char bEndp)
{
	unsigned char nVal;
#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0x40 + bEndp);
	nVal = inportb(IC_D12_DATA);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif
	
	return nVal;
}


void USBD12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0x40 + bEndp);
	outportb(IC_D12_DATA, bStalled);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;
}

unsigned char USBD12_ReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
	unsigned char i, j, k = 0;

	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, endp);
	if((inportb(IC_D12_DATA) & USBD12_FULLEMPTY) == 0) {
		if(bZBoardFlags.bits.bIN_ISR == 0)
			ENABLE_INTERRUPTS;
		return 0;
	}

	outportb(IC_D12_COMMAND, 0xF0);
	j = inportb(IC_D12_DATA);
	j = inportb(IC_D12_DATA);

	if(j > len)
		j = len;

	for(i=0; i<j; i++)
		*(buf+i) = inportb(IC_D12_DATA);

	outportb(IC_D12_COMMAND, 0xF2);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;

	return j;
}

unsigned char USBD12_ReadEndpointStatus(unsigned char bEndp)
{
	unsigned char c;

	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0x80 + bEndp);
	c = inportb(IC_D12_DATA);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;

	return c;
}
/*
void USBD12_SendResume(void)
{
#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xF6);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

}

unsigned short USBD12_ReadCurrentFrameNumber(void)
{
	unsigned short i,j;

	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, 0xF5);
	i= inportb(IC_D12_DATA);
	j = inportb(IC_D12_DATA);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	i += (j<<8);

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;

	return i;
}


*/
// USBD12_ReadMainEndpoint() added to support double-buffering.
// Caller should assume maxium 128 bytes of returned data.
unsigned char USBD12_ReadMainEP(/*unsigned char * buf*/)
{
	unsigned char i, j, k = 0, bDblBuf = 1;

	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif
/*
	outportb(IC_D12_COMMAND, 0x84);
	if((inportb(IC_D12_DATA) & 0x60) == 0x60)
//	if((USBD12_ReadEndpointStatus(4) & 0x60) == 0x60)
	{
		bDblBuf = 2;
	}

	while(bDblBuf)
*/	{
		nFlashPhase ++;
		outportb(IC_D12_COMMAND, 4);
//		if((inportb(IC_D12_DATA) & USBD12_FULLEMPTY) == 0)
//			break;
		if((inportb(IC_D12_DATA) & USBD12_FULLEMPTY) == 0) {
			if(bZBoardFlags.bits.bIN_ISR == 0)
				ENABLE_INTERRUPTS;
			return 0;
		}

		outportb(IC_D12_COMMAND, 0xF0);
		j = inportb(IC_D12_DATA);
		j = inportb(IC_D12_DATA);

		for(i=0; i<j; i++)
		{
			*(CodeData.pCodeData) = inportb(IC_D12_DATA);
			if(CodeData.pCodeData >= (GenBuf + sizeof(GenBuf) - 1))
			{
				CodeData.pCodeData = GenBuf;
#ifdef _DEBUG
				printf("FlashWrite\n");
#endif
				FlashWrite(GenBuf, CodeData.wCodeAddress, sizeof(GenBuf));
				CodeData.wCodeAddress += FLASH_SECTOR_SIZE;
			}
			else
				CodeData.pCodeData ++;
		}

		CodeData.wCodeCount += j;
		k += j;

		outportb(IC_D12_COMMAND, 0xF2);

		bDblBuf --;
	}

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;

	return k;
}

unsigned char USBD12_WriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
	unsigned char i;

	if(bZBoardFlags.bits.bIN_ISR == 0)
		DISABLE_INTERRUPTS;

#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, endp);
	inportb(IC_D12_DATA);

	outportb(IC_D12_COMMAND, 0xF0);
	outportb(IC_D12_DATA, 0);
	outportb(IC_D12_DATA, len);

	for(i=0; i<len; i++)
		outportb(IC_D12_DATA, *(buf+i));

	outportb(IC_D12_COMMAND, 0xFA);
#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif

	if(bZBoardFlags.bits.bIN_ISR == 0)
		ENABLE_INTERRUPTS;

	return len;
}

void USBD12_AcknowledgeEndpoint(unsigned char endp)
{
#ifdef PARALLEL_BUS
	P1 &= 0xf1;	// Enable D12
#endif

	outportb(IC_D12_COMMAND, endp);
	outportb(IC_D12_COMMAND, 0xF1);
	if(endp == 0)
		outportb(IC_D12_COMMAND, 0xF2);

#ifdef PARALLEL_BUS
	P1 |= 0x0e;	// Disable D12
#endif
	
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -