fw_chap9.c

来自「atmel at91sam7s和7x下」· C语言 代码 · 共 708 行 · 第 1/2 页

C
708
字号
*
*****************************************************************/
void fw_setAddress(void)
{
  fw_singleTransmit(0,0);

  fw_AskValidateAddress = fw_controlData.DeviceRequest.wValue & FW_DEVICE_ADDRESS_MASK;
}


/*****************************************************************
*
* ROUTINE   fw_setConfiguration
*
*-----------------------------------------------------------------
*
* Purpose :
*   9.4.7 Set Configuration ( SET_CONFIGURATION )
*   This request sets the device configuration.
*
* Input parameters : NONE
*
* Output parameters : NONE
*
* Global data : fw_controlData : request to be processed
*   fw_device_state : bitmap for different device caracteristics
*
*****************************************************************/
void fw_setConfiguration(void)
{
  int _i = 0;

  if (fw_controlData.DeviceRequest.wValue == 0)
  {
    /* status phase */
    fw_singleTransmit(0, 0);

    while( !( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_TXCOMP )
    && (_i++ < 10));

#ifndef AT91SAM9265
      USBDEV_BASE_UDP->UDP_GLBSTATE &= ~USBDEV_UDP_CONFG;
#else
      USBDEV_BASE_UDP->UDPHS_CTRL &= ~AT91C_EN_USB;
#endif

    /* mark the device as unconfigured */
    fw_deviceState = (UCHAR)~FW_DS_CONFIG;

    /* Disable all endpoints but EPP0. */
    fw_resetEP(FW_EP_BULK_IN);
    fw_resetEP(FW_EP_BULK_OUT);
  }
  else
  {
    if (fw_controlData.DeviceRequest.wValue == 1)
    {
      /* status phase */
      fw_singleTransmit(0, 0);

      while( !( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_TXCOMP )
      && (_i++ < 10));

#ifndef AT91SAM9265
      USBDEV_BASE_UDP->UDP_GLBSTATE |= USBDEV_UDP_CONFG;
#else
      USBDEV_BASE_UDP->UDPHS_CTRL |= AT91C_EN_USB;
#endif
      /* Configure device if it's not already the case */
      if(!(fw_deviceState & FW_DS_CONFIG))
      {
        /* Enable all endpoints */
        fw_activateEP(FW_EP_BULK_IN);
        fw_activateEP(FW_EP_BULK_OUT);

        /* mark the device as configured */
        fw_deviceState |= FW_DS_CONFIG;
      }

      /* The device is plugged and enumerated */
      USB_EVENT |= USB_EVENT_MASK_PLUG;
    }
    else
    {
      TRACE_DEBUG_H( "STALL\n\r");
      fw_stallEp0();
    }
  }
}


/*****************************************************************
*
* ROUTINE     fw_setFeature
*
*-----------------------------------------------------------------
*
* Purpose :
*   9.4.9 Set Feature ( SET_FEATURE )
*   This request is used to set or enable a specific feature.
*
* Input parameters : NONE
*
* Output parameters : NONE
*
* Global data : fw_controlData : request to be processed
*
*****************************************************************/
void fw_setFeature(void)
{
  EPx _endp;
  UCHAR _bRecipient = fw_controlData.DeviceRequest.bmRequestType & FW_USB_RECIPIENT;

  TRACE_DEBUG_H( "fsetFeature\n\r");
  if (_bRecipient == FW_USB_RECIPIENT_ENDPOINT
  && fw_controlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_HALT)
  {
    _endp = (EPx)(fw_controlData.DeviceRequest.wIndex & (FW_EP_CTRL | FW_EP_BULK_IN | FW_EP_BULK_OUT));
    /* set TX stall for IN on EPn. */
    fw_setEndpointStatus(_endp, 1);
    stallEndpointStatus |= (1<<_endp);
    fw_singleTransmit(0, 0);
  }
  else
  {
    if(fw_controlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
    {
      stallEndpointStatus |= (1<<4);
      fw_singleTransmit(0, 0);
    }
    else
    {
      TRACE_DEBUG_H( "setFeat stall\n\r");
      fw_stallEp0();
      stallEndpointStatus |= (1<<FW_EP_CTRL);
    }
  }
}



/*****************************************************************
*
*
* ROUTINE   fw_setInterface
*
*-----------------------------------------------------------------
*
* Purpose :
*   9.4.10 Set Interface ( SET_INTERFACE )
*   This request allows the host to select an alternate setting for the specified interface.
*
* Input parameters : NONE
*
* Output parameters : NONE
*
* Global data : fw_controlData : request to be processed
*
*****************************************************************/
void fw_setInterface(void)
{
  TRACE_DEBUG_H( "setInt\n\r");
  if (fw_controlData.DeviceRequest.wValue == 0 && fw_controlData.DeviceRequest.wIndex == 0)
  {
    fw_singleTransmit(0, 0);
  }
  else
  {
    TRACE_DEBUG_H( "stall\n\r");
    fw_stallEp0();
  }
}


/*****************************************************************
*
* ROUTINE     fw_reserved
*
*-----------------------------------------------------------------
*
* Purpose :
*
*
* Input parameters : NONE
*
* Output parameters : NONE
*
* Global data :
*
*****************************************************************/
void fw_reserved(void)
{
  TRACE_DEBUG_H( "fw_reserved\n\r");
  fw_stallEp0();
}


/*****************************************************************
*
* ROUTINE   fw_busReset
*
*-----------------------------------------------------------------
*
* Purpose :
*   called when a bus reset occured,re-init of global variables
*
* In parameters : NONE
*
* Out parameters : NONE
*
* Global data :
*   fw_controlData  : structure that contains info for control transfer
*   fw_device_state : bit map for different device states
*   fw_fifoId       : Id of the IN FIFO
*
*****************************************************************/
#ifdef ADS_COMPIL
void fw_busReset(void)
#else
__ramfunc void fw_busReset(void)
#endif
{
  // empty the endpoint buffers
  fw_resetEP(FW_EP_BULK_IN);
  fw_resetEP(FW_EP_BULK_OUT);

  // made as if a bus reset occured and reset all
  fw_controlData.DeviceRequest.bmRequestType = 0x00;
  fw_controlData.DeviceRequest.bRequest      = 0x00;
  fw_controlData.DeviceRequest.wValue   = 0x0000;
  fw_controlData.DeviceRequest.wIndex   = 0x0000;
  fw_controlData.DeviceRequest.wLength  = 0x0000;
  fw_controlData.state = FW_STATE_END;
  fw_controlData.pData = NULL;
  fw_deviceState = 0;
  fw_databk = 0;

  po_rngFlush(&fw_fifoId);
}

/*****************************************************************
*
* ROUTINE   fw_suspendChange
*
*-----------------------------------------------------------------
*
* Purpose :
*   called when a suspend change occured
*
* In parameters : NONE
*
* Out parameters : NONE
*
*****************************************************************/
void fw_suspendChange(void)
{
  TRACE_DEBUG_H( "suspend\n\r");
  if(!(fw_deviceState & FW_DS_COMHANG))
  {
    fw_deviceState |= FW_DS_COMHANG;
    USB_EVENT |= USB_EVENT_MASK_SUSPEND;
  //  fw_IsrCount = 0;
  }
}

/*****************************************************************
*
* ROUTINE     fw_stallEp0
*
*-----------------------------------------------------------------
*
* Purpose :
*   set the EP0 STALL
*
* In parameters : NONE
*
* Out parameters : NONE
*
*****************************************************************/
void fw_stallEp0(void)
{
  fw_setEndpointStatus(FW_EP_CTRL, 1);
}


/*****************************************************************
*
* ROUTINE     fw_singleTransmit
*
*-----------------------------------------------------------------
*
* Purpose :
*   transmit a single packet of data from EP0
*
* In parameters : buf : data buffer to transmit
*                 len : length of the data
*
* Out parameters : NONE
*
*****************************************************************/
void fw_singleTransmit(UCHAR * buf, UCHAR len)
{
  if( len <= FW_EP0_MAXPACKET_SIZE)
  {
    fw_writeEndpoint(FW_EP_CTRL, buf, len);
  }
  else
  {
    TRACE_ERROR( "singleTr error\n\r");
  }
}

/*****************************************************************
*
* ROUTINE fw_codeTransmit
*
*-----------------------------------------------------------------
*
* Purpose :
*   transmit a buffer of data from EP0
*
* In parameters : pData : data buffer to transmit
*                 len   : length of the data
*
* Out parameters : NONE
*
* Global data : fw_controlData : request to be processed
*
*****************************************************************/
void fw_codeTransmit(UCHAR * pData, USHORT len)
{
  fw_controlData.wCount = 0;
  if(fw_controlData.wLength > len)
  {
    fw_controlData.wLength = len;
  }

  fw_controlData.pData = pData;

  if( fw_controlData.wLength >= FW_EP0_MAXPACKET_SIZE)
  {
    fw_writeEndpoint(FW_EP_CTRL, fw_controlData.pData, FW_EP0_MAXPACKET_SIZE);
    fw_controlData.wCount += FW_EP0_MAXPACKET_SIZE;
  }
  else
  {
    fw_writeEndpoint(FW_EP_CTRL, pData, fw_controlData.wLength);
    fw_controlData.wCount += fw_controlData.wLength;
    fw_controlData.pData = NULL;
  }
}


⌨️ 快捷键说明

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