📄 fw_cmd.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 + -