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

📄 fw_chap9.c

📁 ATMEL公司的demo程序,USB驱动程序,与识别片上flash,并进行枚举和操作.
💻 C
📖 第 1 页 / 共 2 页
字号:
* Output parameters : NONE
*
* Global data : fw_controlData : request to be processed
*
*****************************************************************/
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;

  //! Goes back to Address State Cf Usb Spec Chpt9
  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 |= AT91C_UDP_FADDEN;
#else
      USBDEV_BASE_UDP->UDPHS_CTRL &= ~AT91C_EN_USB;
#endif

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

    /* Disable all endpoints, not EPT0 */
    fw_resetEP(FW_EP_BULK_IN);
    fw_resetEP(FW_EP_BULK_OUT);
  }
  else
  {
    //! If wValue != 0 enter in Configured State Cf Usb Spec Chpt9
    /* 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;
  }
}


/*****************************************************************
*
* 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -