📄 standard.c
字号:
//
// The number of bytes actually sent depends on both the length
// requested by the host and the actual length of the descriptor.
// \param pClass Pointer to a class driver instance
// \param wLength Number of bytes requested by the host
// \param wIndex Index of requested string descriptor
//------------------------------------------------------------------------------
static void STD_GetStringDescriptor(const S_std_class *pClass,
unsigned short wLength,
unsigned char bIndex)
{
USB_Write(pClass->pUsb,
0,
(void *) pClass->pDescriptors->pStrings[bIndex],
min( *(pClass->pDescriptors->pStrings[bIndex]), wLength),
0,
0);
}
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//! \ingroup usb_std_req_hlr
//! \brief Handles standard SETUP requests
//! \param pClass Pointer to a class driver instance
//------------------------------------------------------------------------------
void STD_RequestHandler(S_std_class *pClass)
{
S_usb_request *pSetup = USB_GetSetup(pClass->pUsb);
TRACE_DEBUG_M("Std ");
// Handle incoming request
switch (pSetup->bRequest) {
//----------------------
case USB_GET_DESCRIPTOR:
//----------------------
TRACE_DEBUG_M("gDesc ");
// The HBYTE macro returns the upper byte of a word
switch (HBYTE(pSetup->wValue)) {
//-------------------------
case USB_DEVICE_DESCRIPTOR:
//-------------------------
TRACE_DEBUG_M("Dev ");
STD_GetDeviceDescriptor(pClass, pSetup->wLength);
break;
//--------------------------------
case USB_CONFIGURATION_DESCRIPTOR:
//--------------------------------
TRACE_DEBUG_M("Cfg ");
STD_GetConfigurationDescriptor(pClass, pSetup->wLength);
break;
#if defined(HIGHSPEED)
//-----------------------------------
case USB_DEVICE_QUALIFIER_DESCRIPTOR:
//-----------------------------------
TRACE_DEBUG_M("Qua ");
STD_GetQualifierDescriptor(pClass, pSetup->wLength);
break;
//--------------------------------------------
case USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR:
//--------------------------------------------
TRACE_DEBUG_M("OSC ");
STD_GetOSCDescriptor(pClass, pSetup->wLength);
break;
#endif
//-------------------------
case USB_STRING_DESCRIPTOR:
//-------------------------
TRACE_DEBUG_M("Str%d ", LBYTE(pSetup->wValue));
STD_GetStringDescriptor(pClass,
pSetup->wLength,
LBYTE(pSetup->wValue));
break;
//------
default:
//------
TRACE_WARNING(
"W: STD_RequestHandler: Unknown GetDescriptor = 0x%02X\n\r",
pSetup->bRequest
);
USB_Stall(pClass->pUsb, 0);
}
break;
//-------------------
case USB_SET_ADDRESS:
//-------------------
TRACE_DEBUG_M("sAddr ");
USB_SendZLP0(pClass->pUsb,
(Callback_f) USB_SetAddress,
(void *) pClass->pUsb);
break;
//-------------------------
case USB_SET_CONFIGURATION:
//-------------------------
TRACE_DEBUG_M("sCfg ");
STD_SetConfiguration(pClass, (char) pSetup->wValue);
break;
//-------------------------
case USB_GET_CONFIGURATION:
//-------------------------
TRACE_DEBUG_M("gCfg ");
STD_GetConfiguration(pClass);
break;
//---------------------
case USB_CLEAR_FEATURE:
//---------------------
TRACE_DEBUG_M("cFeat ");
switch (pSetup->wValue) {
//---------------------
case USB_ENDPOINT_HALT:
//---------------------
TRACE_DEBUG_M("Hlt ");
USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_CLEAR_FEATURE);
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//----------------------------
case USB_DEVICE_REMOTE_WAKEUP:
//----------------------------
TRACE_DEBUG_M("RmWak ");
pClass->wDeviceStatus &= ~REMOTE_WAKEUP; // Remote wakeup disabled
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//------
default:
//------
TRACE_DEBUG_H("Sta ");
USB_Stall(pClass->pUsb, 0);
}
break;
//------------------
case USB_GET_STATUS:
//------------------
TRACE_DEBUG_H("gSta ");
switch (USB_REQUEST_RECIPIENT(pSetup)) {
//-------------------------
case USB_RECIPIENT_DEVICE:
//-------------------------
TRACE_DEBUG_M("Dev ");
STD_GetDeviceStatus(pClass);
break;
//---------------------------
case USB_RECIPIENT_ENDPOINT:
//---------------------------
TRACE_DEBUG_M("Ept ");
STD_GetEndpointStatus(pClass,
LBYTE(pSetup->wIndex));
break;
//------
default:
//------
TRACE_WARNING(
"W: STD_RequestHandler: Unsupported GetStatus = 0x%02X\n\r",
pSetup->bmRequestType
);
USB_Stall(pClass->pUsb, 0);
}
break;
//-------------------
case USB_SET_FEATURE:
//-------------------
TRACE_DEBUG_H("sFeat ");
switch (pSetup->wValue) {
//---------------------
case USB_ENDPOINT_HALT:
//---------------------
USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_SET_FEATURE);
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//----------------------------
case USB_DEVICE_REMOTE_WAKEUP:
//----------------------------
pClass->wDeviceStatus |= REMOTE_WAKEUP; // Remote wakeup enabled
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//------
default:
//------
TRACE_WARNING(
"W: STD_RequestHandler: Unsupported SetFeature=0x%04X\n\r",
pSetup->wValue
);
USB_Stall(pClass->pUsb, 0);
}
break;
//------
default:
//------
TRACE_WARNING(
"W: STD_RequestHandler: Unsupported request: 0x%02X\n\r",
pSetup->bRequest
);
USB_Stall(pClass->pUsb, 0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -