?? fw.c
字號(hào):
/*
*********************************************************************************************************
* File: Fw.C
* Contents: Firmware frameworks task dispatcher and device request parser source
*
* $Date: 04/06/06 Kimi v0.1
* $Date: 04/25/06 Kimi v0.2
* $Date: 04/30/06 Kimi v0.3
* $Date: 01/23/07 Kevin v0.4
* Copyright (c) 2006 Fameg, Inc. All rights reserved
*********************************************************************************************************
*/
#include "fs7805.h"
#include "fs7805regs.h"
#include "string.h"
const INT8U xdata WaveData[128] =
{
// Wave 0
/* LenBr */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Opcode*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* LFun */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Output*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Wave 1
/* LenBr */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Opcode*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* LFun */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Output*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Wave 2
/* LenBr */ 0x01, 0x02, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Opcode*/ 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
/* LFun */ 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Output*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
// Wave 3
/* LenBr */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Opcode*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* LFun */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Output*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/*
*********************************************************************************************************
* VARIABLE PROTOTYPES
*********************************************************************************************************
*/
union FIFODataLen
{
INT16U Val;
INT8U Byte[2];
};
union FIFODataLen Length;
#ifdef PINGPONG_FIFO
INT8U SW_FifoOut_Toggle = 0, SW_FifoIn_Toggle = 0;
#endif
INT16U UsbDmaBuffer;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
#ifdef PINGPONG_FIFO
void FifoIn (INT8U *pReadBuffer, INT8U BufferNo, INT16U DataLen);
void FifoOut (INT8U *pReadBuffer, INT8U BufferNo);
void SendDataCmd (INT8U BufferNo);
#else
void FifoIn (INT8U *pReadBuffer, INT16U DataLen);
void FifoOut (INT8U *pReadBuffer);
void SendDataCmd (void);
#endif
void UsbBulkIn (INT8U *pReadBuffer, INT16U DataLen);
void UsbBulkOut (INT8U *pReadBuffer);
void UsbInit (void);
void KsocInit (void);
#ifdef PINGPONG_FIFO
/*
*********************************************************************************************************
* USBBULKOUT
*
* Description: Device receive data from host
*
* Arguments : pReadBuffer buffer address
*
* Returns : none
*********************************************************************************************************
*/
void UsbBulkOut (INT8U *pReadBuffer)
{
if ((EP2FIFOCS & bmFIFO0_FULL) && (EP2FIFOCS & bmFIFO1_FULL))
{ // FULL_0 = 1 and FULL_1 = 1
if (SW_FifoOut_Toggle == 0)
{
FifoOut(pReadBuffer, 0); // Read FIFO0
}
else
{
FifoOut(pReadBuffer, 1); // Read FIFO1
}
}
else if (EP2FIFOCS & bmFIFO0_FULL) // FULL_0 = 1
{
FifoOut(pReadBuffer, 0); // Read FIFO0
}
else if (EP2FIFOCS & bmFIFO1_FULL) // FULL_1 = 1
{
FifoOut(pReadBuffer, 1); // Read FIFO1
}
}
/*
*********************************************************************************************************
* USBBULKIN
*
* Description: Device send data to host
*
* Arguments : pReadBuffer buffer address
*
* DataLen Data Length
*
* Returns : none
*********************************************************************************************************
*/
void UsbBulkIn (INT8U *pReadBuffer, INT16U DataLen)
{
if ((!(EP1FIFOCS & bmFIFO0_FULL)) && (!(EP1FIFOCS & bmFIFO1_FULL)))
{ // FULL_0 = 0 and FULL_1 = 0
if ((EP1FIFOCS & bmFIFO_TOG) == 0)
{
FifoIn(pReadBuffer, 0, DataLen); // Write FIFO0
}
else
{
FifoIn(pReadBuffer, 1, DataLen); // Write FIFO1
}
}
else if (!(EP1FIFOCS & bmFIFO0_FULL)) // FULL_0 = 0
{
FifoIn(pReadBuffer, 0, DataLen); // Write FIFO0
}
else if (!(EP1FIFOCS & bmFIFO1_FULL)) // FULL_1 = 0
{
FifoIn(pReadBuffer, 1, DataLen); // Write FIFO1
}
if ((!(EP1FIFOCS & bmFIFO0_FULL)) && (!(EP1FIFOCS & bmFIFO1_FULL)))
{ // FULL_0 = 0 and FULL_1 = 0
if (SW_FifoIn_Toggle == 0)
{
SendDataCmd(0); // Complete Write FIFO0
}
else
{
SendDataCmd(1); // Complete Write FIFO1
}
}
else if (!(EP1FIFOCS & bmFIFO0_FULL)) // FULL_0 = 0
{
SendDataCmd(0); // Complete Write FIFO0
}
else if (!(EP1FIFOCS & bmFIFO1_FULL)) // FULL_1 = 0
{
SendDataCmd(1); // Complete Write FIFO1
}
}
/*
*********************************************************************************************************
* FIFOOUT
*
* Description: Device receive data from host using FIFO function
*
* Arguments : pReadBuffer buffer address
*
* BufferNo FIFO0 or FIFO1
*
* Returns : none
*********************************************************************************************************
*/
void FifoOut (INT8U *pReadBuffer, INT8U BufferNo)
{
SW_FifoOut_Toggle = !BufferNo; // Invert SW_FifoOut_Toggle polarity
if (BufferNo == 0)
{
Length.Byte[1] = EP2CNT0L; // Get low byte data
Length.Byte[0] = EP2CNTH & 0x07; // Get high byte data
UsbDmaBuffer = DMA_FIFO2_0; // Get FIFO address
}
else
{
Length.Byte[1] = EP2CNT1L;
Length.Byte[0] = (EP2CNTH & 0x70) >> 4;
UsbDmaBuffer = DMA_FIFO2_1;
}
memcpy(pReadBuffer, (INT8U xdata *)UsbDmaBuffer, Length.Val);
if (BufferNo == 0) // Switch FIFO_Toggle and Clear FULL bit
{
EP2FIFOCS = (EP2FIFOCS | bmFIFO_TOG_WE) | bmFIFO_TOG;
EP2FIFOCS = (EP2FIFOCS | bmFIFO0_FULL_WE) & (~bmFIFO0_FULL);
}
else
{
EP2FIFOCS = (EP2FIFOCS | bmFIFO_TOG_WE) & (~bmFIFO_TOG);
EP2FIFOCS = (EP2FIFOCS | bmFIFO1_FULL_WE) & (~bmFIFO1_FULL);
}
EP2CS = EP2CS | bmEP_RXTXEN; // Enable RXTX
}
/*
*********************************************************************************************************
* FIFOIN
*
* Description: Device send data to host using FIFO function
*
* Arguments : pReadBuffer buffer address
*
* BufferNo FIFO0 or FIFO1
*
* DataLen Data Length
*
* Returns : none
*********************************************************************************************************
*/
void FifoIn (INT8U *pReadBuffer, INT8U BufferNo, INT16U DataLen)
{
union
{
INT8U Val;
struct
{
INT8U Count0 : 3;
INT8U : 1;
INT8U Count1 : 3;
INT8U : 1;
} Bit;
} HighReg;
Length.Val = DataLen;
HighReg.Val = EP1CNTH;
if (BufferNo == 0)
{
EP1CNT0L = Length.Byte[1]; // Write count low byte
HighReg.Bit.Count0 = Length.Byte[0] & 0x07;
HighReg.Val = HighReg.Val | bmCNT0HWEN;
EP1CNTH = HighReg.Val; // Write count high byte
UsbDmaBuffer = DMA_FIFO1_0; // Get FIFO address
}
else
{
EP1CNT1L = Length.Byte[1];
HighReg.Bit.Count1 = Length.Byte[0] & 0x07;
HighReg.Val = HighReg.Val | bmCNT1HWEN;
EP1CNTH = HighReg.Val;
UsbDmaBuffer = DMA_FIFO1_1;
}
memcpy((INT8U xdata *)UsbDmaBuffer, pReadBuffer, DataLen);
// Copy data
}
/*
*********************************************************************************************************
* SENDDATACMD
*
* Description: Complete IN operation function
*
* Arguments : BufferNo FIFO0 or FIFO1
*
* Returns : none
*********************************************************************************************************
*/
void SendDataCmd (INT8U BufferNo)
{
if (BufferNo == 0) // Set FULL bit
{
EP1FIFOCS = (EP1FIFOCS | bmFIFO0_FULL_WE) | bmFIFO0_FULL;
}
else
{
EP1FIFOCS = (EP1FIFOCS | bmFIFO1_FULL_WE) | bmFIFO1_FULL;
}
SW_FifoIn_Toggle = !BufferNo; // Invert SW_FifoOut_Toggle polarity
EP1CS = EP1CS | bmEP_RXTXEN; // Enable RXTX
}
#else
/*
*********************************************************************************************************
* USBBULKOUT
*
* Description: Device receive data from host
*
* Arguments : pReadBuffer buffer address
*
* Returns : none
*********************************************************************************************************
*/
void UsbBulkOut (INT8U *pReadBuffer)
{
if (EP2FIFOCS & bmFIFO0_FULL)
{
FifoOut(pReadBuffer); // Read FIFO0
}
}
/*
*********************************************************************************************************
* USBBULKIN
*
* Description: Device send data to host
*
* Arguments : pReadBuffer buffer address
*
* DataLen Data Length
*
* Returns : none
*********************************************************************************************************
*/
void UsbBulkIn (INT8U *pReadBuffer, INT16U DataLen)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -