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

📄 fw.c

📁 FS7805 使用APLIF的demoFS7805 使用APLIF的demo
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
* 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)

⌨️ 快捷键说明

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