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

📄 fw_cmd.c

📁 ATMEL ARM7 虚拟优盘
💻 C
字号:
//  ----------------------------------------------------------------------------
//          ATMEL Microcontroller Software Support  -  ROUSSET  -
//  ----------------------------------------------------------------------------
//  DISCLAIMER:  CONDITIONS AS PER SIGNED LIMITED LICENSE AGREEMENT (AT91
//  SOFTWARE AND USER DOCUMENTATION)
//  ALL SOFTWARE IS PROVIDED AS IS, WITH ALL FAULTS, AND WITH NO WARRANTY
//  WHATSOEVER.  ATMEL EXPRESSLY DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED,
//  OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.
//  ----------------------------------------------------------------------------
// File Name           : fw_cmd.c
// Object              : command sent to the chip.
// Creation            : JCB      27/oct/2002
// Modif               : JCB      18/fev/2005
//                       JCB      18/mar/2005 add some checking loops
//----------------------------------------------------------------------------
#include "po_types.h"
#include "trace.h"
#include "fw_usb.h"
#include "po_kernel.h"


/*****************************************************************
*
* ROUTINE     fw_setAddressEnable
*
*-----------------------------------------------------------------
*
* Object :
*   send a set address enable command
*
* Input parameters : bAddress : address of the device
*                    bEnable  : set if we want to enable the device
*
* Output parameters : NONE
*
*****************************************************************/
void fw_setAddressEnable(UCHAR bAddress)
{
  // UDP_FADDR : Function Address Register
  AT91F_UDP_SetAddress( USBDEV_BASE_UDP, bAddress );
  // UDP_GLBSTATE : Global State Register
  AT91F_UDP_SetState( USBDEV_BASE_UDP, AT91C_UDP_FADDEN );
}


/*****************************************************************
*
* ROUTINE     fw_setEndpointEnable
*
*-----------------------------------------------------------------
*
* Object :
*   send a set endpoint enable command
*
* Input parameters : bEnable : set if we want to enable the EP
*
* Output parameters : NONE
*
*****************************************************************/
/*void fw_setEndpointEnable(UCHAR bEnable)
{
  // UDP_FADDR : Function Address Register
  USBDEV_BASE_UDP->UDP_FADDR |= ( bEnable ? AT91C_UDP_FEN:0 );
}
*/

/*****************************************************************
*
*
* ROUTINE     fw_readInterruptRegister
*
*-----------------------------------------------------------------
*
* Object : read the IT register
*
* Input parameters : NONE
*
* Output parameters : register value
*
*****************************************************************/
#ifdef ADS_COMPIL
ULONG fw_readInterruptRegister(void)
#else
__ramfunc ULONG fw_readInterruptRegister(void)
#endif
{
  volatile unsigned int tmp;

  tmp = AT91F_UDP_InterruptStatusRegister(USBDEV_BASE_UDP) & STATUS_ALL_IT;
  return( tmp & AT91F_UDP_GetInterruptMaskStatus( USBDEV_BASE_UDP ) );
}

/*****************************************************************
*
* ROUTINE     fw_setEndpointStatus
*
*-----------------------------------------------------------------
*
* Object :  set EP status (STALLED or not)
*
* Input parameters : bEndp    : number of the EP
*                    bStalled : 1 if EP must be stalled
*
* Output parameters : NONE
*
* Global variables :
*
*****************************************************************/
void fw_setEndpointStatus(EPx bEndp, UCHAR bStalled)
{
  if(bStalled)
  {
    /* send STALL to the host */
    // UDP_CSR[8] : Endpoint Control and Status Register
    AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_FORCESTALL );
  }
  else
  {
    AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_FORCESTALL );
    AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_ISOERROR );
  }
}

/*****************************************************************
*
* ROUTINE     fw_readEndpoint
*
*-----------------------------------------------------------------
*
* Object :
*   read a buffer of data in the EP buffer
*
* Input parameters : bEndp : number of the EP
*                    buf   : data buffer
*                    len   : length of the data
*
* Output parameters : length of data read
*
*****************************************************************/
long fw_readEndpoint(EPx bEndp, UCHAR * buf)
{
  int _NbOctets, _NbOctetsLus = 0;
  UCHAR* _Buff = buf;

  if(_Buff != NULL)
  {
    _NbOctetsLus = ( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) >> 16) &0x7F );
    _NbOctets = _NbOctetsLus;
    while(_NbOctets-- > 0)
    {
      *_Buff++ = AT91F_UDP_EpRead( USBDEV_BASE_UDP, bEndp );
    }
    if(bEndp == FW_EP_BULK_OUT)
    {
      // Read data bank 0
      if(fw_databk == 0)
      {
        // Notify USB peripheral device that data has been read in the FIFO bank 0
        AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK0 );
        fw_databk = 1;
      }
      else
      {
        // Read data bank 1
        // Notify USB peripheral device that data has been read in the FIFO bank 1
        AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK1 );
        fw_databk = 0;
      }
    }
    else
    {
      if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & USBDEV_UDP_RX_DATA_BK0 )
      {
        AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK0 );
      }
      if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & USBDEV_UDP_RX_DATA_BK1 )
      {
        AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK1 );
      }
    }
  }
  return( _NbOctetsLus );
}


/*****************************************************************
*
* ROUTINE     fw_writeEndpoint
*
*-----------------------------------------------------------------
*
* Object :
*   send a set address enable command
*
* Input parameters : bEndp : number of the EP
*                    buf   : data buffer
*                    len   : length of the data
*
* Output parameters : length of write data
*
* Global variables :
*****************************************************************/
long fw_writeEndpoint(EPx bEndp, UCHAR * buf, UCHAR len)
{
  int    _i;
  UCHAR *_pBuffer = buf;
  long   _status;

  if(len == 0)
  {
    // validate ED
    AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_TXPKTRDY );
    _status = 0;
  }
  else
  {
    if(_pBuffer != NULL)
    {
      AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_ISOERROR );
      if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & AT91C_UDP_TXPKTRDY)
      {
        _status = 0; /* test if we can write in fifo */
      }
      else
      {
        for(_i=0; _i<len; _i++)
        {
          AT91F_UDP_EpWrite( USBDEV_BASE_UDP, bEndp, *_pBuffer++);
        }
        // validate ED
        AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_TXPKTRDY );
        _status = (long)len;
      }
    }
    else
    {
      _status = -1;
    }
  }
  return( _status );
}


/*****************************************************************
*
* ROUTINE     fw_changedir
*
*-----------------------------------------------------------------
*
* Object :
*   Change Dir in Control Register for Endpoint Control
*
* Input parameters :
*
* Output parameters :
*
* Global variables :
*****************************************************************/
void fw_changedir(int dir)
{
  if(dir == FW_HOST_TO_DEVICE)
  {
    // DIR = 0, OUT
    AT91F_UDP_EpClear( USBDEV_BASE_UDP, FW_EP_CTRL, AT91C_UDP_DIR );
    while ( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & AT91C_UDP_DIR ) );
  }
  else
  {
    // DIR = 1, IN
    AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_CTRL, AT91C_UDP_DIR );
    while ( !( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & AT91C_UDP_DIR ) );
  }
}


/*****************************************************************
*
* ROUTINE     fw_resetEP
*
*-----------------------------------------------------------------
*
* Object :  Disable  Endpoint
*
*
* Input parameters :
*
* Output parameters :
*
* Global variables :
*****************************************************************/
#ifdef ADS_COMPIL
void fw_resetEP(EPx bEndp)
#else
__ramfunc void fw_resetEP(EPx bEndp)
#endif
{
  AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_EPEDS );
}


/*****************************************************************
*
* ROUTINE     fw_activateEP
*
*-----------------------------------------------------------------
*
* Object :  Activate  Endpoint
*
*
* Input parameters :
*
* Output parameters :
*
* Global variables :
*****************************************************************/
void fw_activateEP(EPx bEndp)
{
  switch(bEndp)
  {
    case FW_EP_BULK_IN:
      AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_BULK_IN, AT91C_UDP_EPTYPE_BULK_IN );
    break;

    case FW_EP_BULK_OUT:
      AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_BULK_OUT, AT91C_UDP_EPTYPE_BULK_OUT );
    break;

    default:
      TRACE_ERROR( "ER_1 \n\r");
  }
  AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_EPEDS );
}


/*****************************************************************
*
* ROUTINE     fw_IsSetupPacket
*
*-----------------------------------------------------------------
*
* Object :  return 1 if SETUP PACKET is received
*
*
* Input parameters :
*
* Output parameters :
*
* Global variables :
*****************************************************************/
int fw_IsSetupPacket(EPx bEndp)
{
  return( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & AT91C_UDP_RXSETUP ) ? 1 : 0;
}


/*****************************************************************
*
* ROUTINE     fw_acknowledgeSetup
*
*-----------------------------------------------------------------
*
* Object :
*
*
* Input parameters :
*
* Output parameters :
*
* Global variables :
*****************************************************************/
void fw_acknowledgeSetup(EPx bEndp)
{
  AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_RXSETUP );
  while( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & AT91C_UDP_RXSETUP ) );
}


⌨️ 快捷键说明

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