📄 fw_chap9.c
字号:
* 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 + -