📄 __usbd12.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 + -