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

📄 wdf_cypress_lib.c

📁 使用Jungo Windriver開發的USB driver 及其firmware,類型為mass storage,應用於FX2(Cypress CY68013A)上.
💻 C
字号:
/******************************************************************************
*   File:     wdf_cypress_lib.c                                               *
*                                                                             *
*   Contents:  Implementation of firmware library functions for the           *
*              Cypress FX2 CY7C68013 and FX2LP CY7C68013A development boards  *
*                                                                             *
*   Code was generated by DriverWizard v8.02 - http://www.jungo.com           *
*   Copyright (c) 2008 Jungo Ltd.  http://www.jungo.com                       *
*******************************************************************************/

#include "wdf_cypress_lib.h"

#define READ TRUE
#define WRITE FALSE

static void DataToggleReset(int ep, EP_DIR dir)
{
    // TOGCTL.3..0 - Ep number (1, 2, 4, 6 or 8)
    // TOGCTL.4 - Ep direction
    // TOGCTL.5 - Clear bit
    TOGCTL = (ep | (dir << 4));
    TOGCTL = (ep | (dir << 4) | bmBIT5);
}

void WDF_EP1INConfig(EP_TYPE type)
{
    EP1INCFG = bmBIT7;  			// Enable EP1 In: EP1INCFG.7
    EP1INCFG |= (type << 4); 			// EP1IN type: 	  EP1INCFG.5..4
    DataToggleReset(0x1, DIR_IN);
}

void WDF_EP1OUTConfig(EP_TYPE type)
{
    EP1OUTCFG = bmBIT7;  			// Enable EP1 Out: EP1OUTCFG.7
    EP1OUTCFG |= (type << 4);   		// EP1OUT type:    EP1OUTCFG.5..4
    DataToggleReset(0x1, DIR_OUT);
}

void WDF_EP2Config(EP_DIR dir, EP_TYPE type, EP_BUFFERING buffering, int size,
    int nPacketPerMF)
{
    EP2CFG = bmBIT7; 				// Enable EP2: 	      	EP2CFG.7
    DELAY;
    EP2CFG |= (dir << 6); 			// EP2 direction: 	EP2CFG.6
    DELAY;
    EP2CFG |= (type << 4);			// EP2 type:      	EP2CFG.5..4
    DELAY;
    EP2CFG |= (size == 1024 ? bmBIT3 : 0); 	// EP2 size: 		EP2CFG.3
    DELAY;
    EP2CFG |= buffering; 			// EP2 buffering method:EP2CFG.1..0
    DELAY;

    if (type == ISOCHRONOUS && dir == DIR_IN)
    {
        EP2ISOINPKTS = bmBIT7; 	// Automatically send zero length packet when there is
                                 // no data in EP FIFO
        EP2ISOINPKTS |= nPacketPerMF;	// Packet Per Microframe: EP2ISOINPKTS.1..0
        DELAY;
    }
    DataToggleReset(0x2, dir);
}

void WDF_EP4Config(EP_DIR dir, EP_TYPE type)
{
    EP4CFG = bmBIT7; 				// Enable EP4: 	      	EP4CFG.7
    EP4CFG |= (dir << 6); 			// EP4 direction: 	EP4CFG.6
    EP4CFG |= (type << 4);			// EP4 type:      	EP4CFG.5..4

    if (type == ISOCHRONOUS && dir == DIR_IN)
    {
        EP4ISOINPKTS = bmBIT7; 	// Automatically send zero length packet when there is
                                 // no data in EP FIFO
        DELAY;
    }
    DataToggleReset(0x4, dir);
}

void WDF_EP6Config(EP_DIR dir, EP_TYPE type, EP_BUFFERING buffering, int size,
    int nPacketPerMF)
{
    EP6CFG = bmBIT7; 				// Enable EP6: 	      	EP6CFG.7
    DELAY;
    EP6CFG |= (dir << 6); 			// EP6 direction: 	EP6CFG.6
    DELAY;
    EP6CFG |= (type << 4);			// EP6 type:      	EP6CFG.5..4
    DELAY;
    EP6CFG |= (size == 1024 ? bmBIT3 : 0); 	// EP6 size: 		EP6CFG.3
    DELAY;
    EP6CFG |= buffering; 			// EP6 buffering method:EP6CFG.1..0
    DELAY;

    if (type == ISOCHRONOUS && dir == DIR_IN)
    {
        DELAY;
        EP6ISOINPKTS = bmBIT7; 		// Automatically send zero length packet when there is
                                         // no data in EP FIFO
        EP6ISOINPKTS |= nPacketPerMF;	// Packet Per Microframe: EP6ISOINPKTS.1..0
        DELAY;
    }
    DataToggleReset(0x6, dir);
}

void WDF_EP8Config(EP_DIR dir, EP_TYPE type)
{
    EP8CFG = bmBIT7; 				// Enable EP8: 	      	EP8CFG.7
    EP8CFG |= (dir << 6); 			// EP8 direction: 	EP8CFG.6
    EP8CFG |= (type << 4);			// EP8 type:      	EP8CFG.5..4

    if (type == ISOCHRONOUS && dir == DIR_IN)
    {
        EP8ISOINPKTS = bmBIT7; 	// Automatically send zero length packet when there is
                                 // no data in EP FIFO
        DELAY;
    }
    DataToggleReset(0x8, dir);
}

void WDF_FIFOReset (int ep)
{
    FIFORESET = 0x80;		// NAK all transfers from the host
    DELAY;
    FIFORESET = ep;		// Reset EP FIFO
    DELAY;
    FIFORESET = 0x00;		// Restore normal operation
    DELAY;
}

void WDF_SkipOutPacket(int ep)
{
    switch (ep)
    {
    case 0x1:
        DELAY;
        EP1OUTBC = 0x0;
        break;
    case 0x2:
        DELAY;
        EP2BCL = 0x80; 		// arm EP2OUT by writing byte count w/skip. 
        break;
    case 0x4:
        DELAY;
        EP4BCL = 0x80; 		// arm EP4OUT by writing byte count w/skip. 
        break;
    case 0x6:
        DELAY;
        EP6BCL = 0x80; 		// arm EP6OUT by writing byte count w/skip. 
        break;
    case 0x8:
        DELAY;
        EP8BCL = 0x80; 		// arm EP8OUT by writing byte count w/skip. 
        break;
    }
}

static void WDF_FIFOAccess(int ep, BYTE buf[], int size, BOOL fIsRead)
{
    int i;
    BYTE *epFifo;

    switch (ep)
    {
    case 0x1:
        epFifo = EP1OUTBUF;
        break;
    case 0x81:
        epFifo = EP1INBUF;
        break;
    case 0x2:
    case 0x82:
        epFifo = EP2FIFOBUF;
        break;
    case 0x4:
    case 0x84:
        epFifo = EP4FIFOBUF;
        break;
    case 0x6:
    case 0x86:
        epFifo = EP6FIFOBUF;
        break;
    case 0x8:
    case 0x88:
        epFifo = EP8FIFOBUF;
        break;
    }    

    APTR1H = MSB(buf);
    APTR1L = LSB(buf);

    AUTOPTRH2 = MSB(epFifo);
    AUTOPTRL2 = LSB(epFifo);

    for(i=0; i<size; i++)
    {
        if (fIsRead)
            EXTAUTODAT1 = EXTAUTODAT2;
        else
            EXTAUTODAT2 = EXTAUTODAT1;
    }
}

void WDF_FIFOWrite(int ep, BYTE buf[], int size)
{
    WDF_FIFOAccess(ep, buf, size, WRITE);
}

void WDF_FIFORead(int ep, BYTE buf[], int size)
{
    WDF_FIFOAccess(ep, buf, size, READ);
}

BOOL WDF_FIFOEmpty(int ep)
{
    BOOL ret;

    switch (ep)
    {
    case 0x1:
        ret = (EP1OUTCS & bmEPBUSY);
        break;
    case 0x81:
        ret = !(EP1INCS & bmEPBUSY);
        break;
    case 0x2:
    case 0x82:
        ret = (EP2468STAT & bmEP2EMPTY);
        break;
    case 0x4:
    case 0x84:
        ret = (EP2468STAT & bmEP4EMPTY);
        break;
    case 0x6:
    case 0x86:
        ret = (EP2468STAT & bmEP6EMPTY);
        break;
    case 0x8:
    case 0x88:
        ret = (EP2468STAT & bmEP8EMPTY);
        break;
    }
    return ret;
}

BOOL WDF_FIFOFull(int ep)
{
    BOOL ret;

    switch (ep)
    {
    case 0x1:
        ret = !(EP1OUTCS & bmEPBUSY);
        break;
    case 0x81:
        ret = (EP1INCS & bmEPBUSY);
        break;
    case 0x2:
    case 0x82:
        ret = (EP2468STAT & bmEP2FULL);
        break;
    case 0x4:
    case 0x84:
        ret = (EP2468STAT & bmEP4FULL);
        break;
    case 0x6:
    case 0x86:
        ret = (EP2468STAT & bmEP6FULL);
        break;
    case 0x8:
    case 0x88:
        ret = (EP2468STAT & bmEP8FULL);
        break;
    }
    return ret;
}

void WDF_SetEPByteCount(int ep, WORD bytes_count)
{
    BYTE *epBytesCntLow, *epBytesCntHigh;

    switch (ep)
    {
    case 0x1:
        epBytesCntHigh = 0;
        epBytesCntLow = &EP1OUTBC;
        break;
    case 0x81:
        epBytesCntHigh = 0;
        epBytesCntLow = &EP1INBC;
        break;
    case 0x2:
    case 0x82:
        epBytesCntHigh = &EP2BCH;
        epBytesCntLow = &EP2BCL;
        break;
    case 0x4:
    case 0x84:
        epBytesCntHigh = &EP4BCH;
        epBytesCntLow = &EP4BCL;
        break;
    case 0x6:
    case 0x86:
        epBytesCntHigh = &EP6BCH;
        epBytesCntLow = &EP6BCL;
        break;
    case 0x8: 
    case 0x88:
        epBytesCntHigh = &EP8BCH;
        epBytesCntLow = &EP8BCL;
        break;
    }

    if (epBytesCntHigh)
    {
        DELAY;
        *epBytesCntHigh = MSB(bytes_count);
    }
    DELAY;
    *epBytesCntLow = LSB(bytes_count);
    
}

WORD WDF_GetEPByteCount(int ep)
{
    WORD ret;

    switch (ep)
    {
    case 0x1:
        ret = EP1OUTBC;
        break;
    case 0x81:
        ret = EP1INBC;
        break;
    case 0x2:
    case 0x82:
        ret = (EP2BCH << 8) + EP2BCL;
        break;
    case 0x4:
    case 0x84:
        ret = (EP4BCH << 8) + EP4BCL;
        break;
    case 0x6:
    case 0x86:
        ret = (EP6BCH << 8) + EP6BCL;
        break;
    case 0x8:
    case 0x88:
        ret = (EP8BCH << 8) + EP8BCL;
        break;
    }

    return ret;
}

void WDF_I2CInit()
{
    EZUSB_InitI2C();
}

BOOL WDF_I2CWrite(BYTE addr, BYTE len, BYTE xdata *dat)
{
    return EZUSB_WriteI2C(addr, len, dat);
}

BOOL WDF_I2CRead(BYTE addr, BYTE len, BYTE xdata *dat)
{
    return EZUSB_ReadI2C(addr, len, dat);
}

void WDF_I2CWaitForEEPROMWrite(BYTE addr)
{
    EZUSB_WaitForEEPROMWrite(addr);
}

int WDF_I2CGetStatus()
{
    return I2CPckt.status;
}

void WDF_I2CClearStatus()
{
    if ((I2CPckt.status == I2C_BERROR) || (I2CPckt.status == I2C_NACK))
	I2CPckt.status = I2C_IDLE;
}

#define LED_ADDR		0x21
void WDF_SetDigitLed(int digit)
{
    BYTE xdata led_data;
    BYTE xdata digits[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 
	0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };

    if (digit < 0x0 || digit > 0xE)
        led_data = 0x0; // Turn led off
    else
        led_data = digits[digit];

    WDF_I2CWrite(LED_ADDR, 0x01, &led_data);
    WDF_I2CWaitForEEPROMWrite(LED_ADDR);
}

⌨️ 快捷键说明

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