📄 papp_eve.c
字号:
{
b |= 1;
}
}
else if ((request->bmRequestType & USB_MASK_RECIPIENT) == USB_RECIPIENT_ENDPOINT)
{
if (0 == request->wIndex)
{
if (SCC_TRUE == pc->halted)
{
b = 1;
}
}
else
{
TdiPeriphEp* ep;
ep = PCDAPP_EVE_FindEp(pc, request->wIndex);
if (SCC_TRUE == ep->halted)
{
b = 1;
}
}
}
request->buffer[0] = b;
request->buffer[1] = 0;
request->data = request->buffer;
request->actualLength = 2;
return SCS_SUCCESS;
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ProcessFeature
Purpose : Process Class Setup message
Arguments : pc - PCD handle
request - SETUP packet
set - Set or Clear feature
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessFeature(TdiPeriphController* pc,
PeriphSetupRequest* request, SctBool set)
{
if ((request->bmRequestType & USB_MASK_RECIPIENT) == USB_RECIPIENT_DEVICE)
{
if (request->wValue == USB_FEATURE_DEVICE_REMOTE_WAKEUP)
{
/* set or clear remote wakeup */
pc->remoteWakeupEnable = set;
}
}
else if ((request->bmRequestType & USB_MASK_RECIPIENT) == USB_RECIPIENT_ENDPOINT)
{
if (request->wValue == USB_FEATURE_ENDPOINT_HALT)
{
TdiPeriphEp *ep;
ep = PCDAPP_EVE_FindEp(pc, request->wIndex);
if (NULL != ep)
{
if (SCC_TRUE == set)
{
PCDAPP_EVE_SetEpStall(pc, request->wIndex);
}
else
{
PCDAPP_EVE_ClearEpStall(pc, request->wIndex);
}
}
}
}
return SCS_SUCCESS;
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ProcessSetAddress
Purpose : Process Class Setup message
Arguments : pc - PCD handle
request - SETUP packet
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessSetAddress(TdiPeriphController* pc,
PeriphSetupRequest* request)
{
pc->state = USB_STATE_ADDRESS;
usbAssignedAddress = request->wValue;
/* Use any buffer 'cause this is zero length */
request->data = pc->currentDeviceDescriptor;
request->actualLength = 0;
return SCS_SUCCESS;
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ProcessGetDescriptor
Purpose : Process get descriptor command
Arguments : pc - peripheral controller handle
request - SETUP packet
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessGetDescriptor(TdiPeriphController* pc,
PeriphSetupRequest* request)
{
U8 type;
U8 index;
type = (request->wValue >> 8) & 0xFF;
index = request->wValue & 0xFF;
if ((request->bmRequestType & USB_MASK_RECIPIENT) != USB_RECIPIENT_DEVICE)
{
return SCS_SUCCESS;/* subclass's GetDescriptor function will be called */
}
switch (type)
{
case USB_DEVICE_DESCRIPTOR:
request->data = pc->currentDeviceDescriptor;
if (request->wLength < pc->currentDeviceDescriptor[0])
{
request->actualLength = request->wLength;
}
else
{
request->actualLength = pc->currentDeviceDescriptor[0];
}
break;
case USB_CONFIG_DESCRIPTOR:
request->data = pc->currentConfigDescriptors[index];
if (request->wLength < request->data[USBDESC_CONFIG_WTOTALLENGTH])
{
request->actualLength = request->wLength;
}
else
{
request->actualLength = request->data[USBDESC_CONFIG_WTOTALLENGTH];
}
break;
case USB_STRING_DESCRIPTOR:
request->data = pc->stringDescriptors[index];
if (request->wLength < request->data[0])
{
request->actualLength = request->wLength;
}
else
{
request->actualLength = request->data[0];
}
break;
case USB_DEVICE_QUALIFIER_DESCRIPTOR:
request->data = pc->deviceQualifierDescriptor;
if (request->wLength < pc->deviceQualifierDescriptor[0])
{
request->actualLength = request->wLength;
}
else
{
request->actualLength = pc->deviceQualifierDescriptor[0];
}
break;
case USB_OTHER_SPEED_CONFIG_DESCRIPTOR:
request->data = pc->currentOtherSpeedConfigDescriptors[index];
if (request->wLength < request->data[USBDESC_CONFIG_WTOTALLENGTH])
{
request->actualLength = request->wLength;
}
else
{
request->actualLength = request->data[USBDESC_CONFIG_WTOTALLENGTH];
}
break;
default:
return SCS_ERROR;
}
return SCS_SUCCESS;
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ProcessGetConfiguration
Purpose : Process get configuration command
Arguments : pc - peripheral controller handle
request - SETUP packet
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessGetConfiguration(TdiPeriphController* pc,
PeriphSetupRequest* request)
{
U8 b = 0;
b = CurrentConfigNum;
request->buffer[0] = b;
request->data = request->buffer;
request->actualLength = 1;
return SCS_SUCCESS;
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ProcessSetConfiguration
Purpose : Process set configuration command
Arguments : pc - peripheral controller handle
request - SETUP packet
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessSetConfiguration(TdiPeriphController* pc,
PeriphSetupRequest* request)
{
U8 b;
U8* config;
SctStatus result;
b = request->wValue & 0xFF;
CurrentConfigNum = b;
config = pc->currentConfigDescriptors[0];
result = PCDAPP_EVE_SetConfiguration(pc, config, CurrentConfigNum);
if (SCS_ERROR == result)
{
return SCS_ERROR;
}
return SCS_SUCCESS;
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ControlTransferDone
Purpose : Process Control transfer status done event
Arguments : urb - pointer to urb structure
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
void PCDAPP_EVE_ControlTransferDone(TdiPurb* urb)
{
if (vendorCmdStatClear)
{
vendorCommandStatus = 0;
vendorCmdStatClear = SCC_FALSE;
}
if (addressPending)
{
/* safe to set address now since ths status phase is done */
addressPending = SCC_FALSE;
PCD_SetAddress(urb->pc, usbAssignedAddress);
enumerationDone = SCC_TRUE;
}
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ControlInDataPhaseDone
Purpose : Process Control IN data phase done event
Arguments : urb - pointer to urb structure
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
void PCDAPP_EVE_ControlInDataPhaseDone(TdiPurb* urb)
{
SctStatus result;
/* Enqueue the Status Phase */
ep0->urb = &controlOutUrb;
controlOutUrb.data = urb->data;
controlOutUrb.length = 0;
controlOutUrb.lengthSoFar = 0;
controlOutUrb.dataPosition = 0;
controlOutUrb.status = 0;
controlOutUrb.callBackFunction = PCDAPP_EVE_ControlTransferDone;
controlOutUrb.pc = urb->pc;
controlOutUrb.ep = ep0;
controlOutUrb.direction = 0;
controlOutUrb.oneShot = 0;
result = PCD_Transfer(urb->pc, &controlOutUrb);
if (result != SCS_SUCCESS)
{
PRINT1("(PCDAPP_EVE_ControlInDataPhaseDone) : Status phase error.\n");
}
}
/*------------------------------------------------------------------------------
Name : PCDAPP_EVE_ControlOutDataPhaseDone
Purpose : Process Control OUT data phase done event
Arguments : urb - pointer to urb structure
Returns : SctStatus
Notes :
-----------------------------------------------------------------------------*/
void PCDAPP_EVE_ControlOutDataPhaseDone(TdiPurb* urb)
{
SctStatus result;
/* Enqueue the Status Phase */
ep0->urb = &controlInUrb;
controlInUrb.data = urb->data;
controlInUrb.length = 0;
controlInUrb.lengthSoFar = 0;
controlInUrb.dataPosition = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -