?? wdf_cypress_lib.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 + -