📄 usbh_hcds_vhub.c
字号:
Inline long GetConfiguration( DEVICE_REQUEST *psDeviceRequest )
{
USBH_HCD_URB *psUrb;
unsigned char *pBufAdrs;
psUrb = VHUBStatus.psUrb;
pBufAdrs = (unsigned char *)psUrb->pTransBuf;
if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
/* Direction of transfer is different */
return STATUS_INVALID_PARAMETER;
}
if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_DEVICE ){
return STATUS_INVALID_PARAMETER;
}
if( VHUBStatus.bmFlags.usbState == DEFAULT_STATE ){
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
/* wValue != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
/* wIndex != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_CONFIG_DATA_LENGTH ){
/* wLength != GET_CONFIG_DATA_LENGTH */
return STATUS_INVALID_PARAMETER;
}
/*===========================/
Set the replying data /
/===========================*/
pBufAdrs[0] = VHUBStatus.configValue;
psUrb->actualLength = GET_CONFIG_DATA_LENGTH;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: SetConfiguration
// description : Set Configuration request
//
// Process for Set Configuration request
//
// argument : *psDeviceRequest Pointer of device request
//
// return : STATUS_SUCCESS Success
// STATUS_INVALID_PARAMETER Error
// STATUS_NOT_IMPLEMENTED Not implemented
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
Inline long SetConfiguration( DEVICE_REQUEST *psDeviceRequest )
{
long retValue;
if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_HOST_TO_DEVICE ){
/* Direction of transfer is different */
return STATUS_INVALID_PARAMETER;
}
if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_DEVICE ){
return STATUS_INVALID_PARAMETER;
}
if( VHUBStatus.bmFlags.usbState == DEFAULT_STATE ){
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wValueH ){
/* wValue.h != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
/* wIndex != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL ){
/* wLength != 0 */
return STATUS_INVALID_PARAMETER;
}
/*=============================================/
Check whether the specified ConfigurationValue is effective /
/=============================================*/
if( psDeviceRequest->wValueL > StdDevDesc[OFFSET_BNUMCONFIGURATIONS] ){
/* Invalid ConfigurationValue */
return STATUS_INVALID_PARAMETER;
}
/*==========================/
Change of Configuration Value/
/==========================*/
VHUBStatus.configValue = psDeviceRequest->wValueL;
/*======================/
Change of USB state/
/======================*/
if( psDeviceRequest->wValueL != 0 ){
VHUBStatus.bmFlags.usbState = CONFIGURED_STATE;
/*=====================================/
The port is put into the state that the power supply is not supplied/
/=====================================*/
retValue = USBH_HCDS_PortControl(USBH_HCDS_PORT_ST_POWERED_OFF);
if( retValue != STATUS_SUCCESS ){
return retValue;
}
} else {
VHUBStatus.bmFlags.usbState = ADDRESSED_STATE;
}
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: GetInterface
//
// description : Get Interface request
//
// Process for Interface request
//
// argument : *psDeviceRequest Pointer of device request
//
// return : STATUS_SUCCESS Success
// STATUS_INVALID_PARAMETER Error
// STATUS_NOT_IMPLEMENTED Not implemented
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
Inline long GetInterface( DEVICE_REQUEST *psDeviceRequest )
{
USBH_HCD_URB *psUrb;
unsigned char *pBufAdrs;
psUrb = VHUBStatus.psUrb;
pBufAdrs = (unsigned char *)psUrb->pTransBuf;
if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
/* Direction of transfer is different */
return STATUS_INVALID_PARAMETER;
}
if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_INTERFACE ){
return STATUS_INVALID_PARAMETER;
}
if( VHUBStatus.bmFlags.usbState != CONFIGURED_STATE ){
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
/* wValue != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wIndexH ){
/* wIndex.h != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_INTERFACE_DATA_LENGTH){
/* wLength != GET_INTERFACE_DATA_LENGTH */
return STATUS_INVALID_PARAMETER;
}
/*===========================================/
Check whether the specified Interface Number is effective /
/===========================================*/
if( psDeviceRequest->wIndexL > (StdConfigDesc[OFFSET_BNUMINTERFACES] - 1) ){
/* Invalid Interface Number */
return STATUS_INVALID_PARAMETER;
}
/*===========================/
/Set The replying data /
/===========================*/
pBufAdrs[0] = 0;
psUrb->actualLength = GET_INTERFACE_DATA_LENGTH;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: SetInterface
//
// description : Set Interface request
//
// Process for Set Interface request
//
// argument : *psDeviceRequest Pointer of device request
//
// return : STATUS_SUCCESS Success
// STATUS_INVALID_PARAMETER Error
// STATUS_NOT_IMPLEMENTED Not implemented
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
Inline long SetInterface( DEVICE_REQUEST *psDeviceRequest )
{
if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_HOST_TO_DEVICE){
/* Direction of transfer is different */
return STATUS_INVALID_PARAMETER;
}
if( (psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK) != RECIPIENT_INTERFACE){
return STATUS_INVALID_PARAMETER;
}
if(VHUBStatus.bmFlags.usbState != CONFIGURED_STATE){
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wValueH ){
/* wValue.h != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wIndexH ){
/* wIndex.h != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL ){
/* wLength != 0 */
return STATUS_INVALID_PARAMETER;
}
/*===========================================/
Check whether the specified Interface Number is effective /
/===========================================*/
if( psDeviceRequest->wIndexL > (StdConfigDesc[OFFSET_BNUMINTERFACES] - 1) ){
/* Invalid Interface Number */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wValueL != 0 ){
/* AlternateSetting value doesn't exist */
return STATUS_INVALID_PARAMETER;
}
return STATUS_SUCCESS;
}
/*=============================================================================================
// Function_Name: ClassRequest
//
// description : Class request process
//
// Analyze the passed request data, and process an appropriate class request
//
// argument : *psDeviceRequest (in)Pointer to request data
//
// return : STATUS_SUCCESS Processing completed successfully
===============================================================================================*/
Inline long ClassRequest( DEVICE_REQUEST *psDeviceRequest )
{
long retValue;
switch( psDeviceRequest->bRequest ){
case CREQ_GET_STATUS:
retValue = ClassGetStatus(psDeviceRequest);
break;
case CREQ_CLEAR_FEATURE:
retValue = ClassClearFeature(psDeviceRequest);
break;
case CREQ_SET_FEATURE:
retValue = ClassSetFeature(psDeviceRequest);
break;
case CREQ_GET_DESCRIPTOR:
retValue = ClassGetDescriptor(psDeviceRequest);
break;
case CREQ_CLEAR_TT_BUFFER:
retValue = ClassClearTTBuffer(psDeviceRequest);
break;
case CREQ_RESET_TT:
retValue = ClassResetTT(psDeviceRequest);
break;
case CREQ_GET_TT_STATE:
retValue = ClassGetTTState(psDeviceRequest);
break;
case CREQ_STOP_TT:
retValue = ClassStopTT(psDeviceRequest);
break;
default:
retValue = STATUS_INVALID_PARAMETER;
}
return retValue;
}
/*======================================================================
// Function_Name: ClassGetStatus
//
// description : Class definition Get Status request
//
// Process for Get Status request of class definition
//
// argument : *psDeviceRequest Pointer of device request
//
// return : STATUS_SUCCESS Success
// STATUS_INVALID_PARAMETER Error
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
Inline long ClassGetStatus( DEVICE_REQUEST *psDeviceRequest )
{
USBH_HCD_URB *psUrb;
unsigned char *pBufAdrs;
psUrb = VHUBStatus.psUrb;
pBufAdrs = (unsigned char *)psUrb->pTransBuf;
if( VHUBStatus.bmFlags.usbState != CONFIGURED_STATE ){
/* Except for Configured State */
return STATUS_INVALID_PARAMETER;
}
if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
/* Direction of transfer is different */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
/* wValue != 0 */
return STATUS_INVALID_PARAMETER;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != CLASS_GET_STATUS_DATA_LENGTH ){
/* wLength != GET_STATUS_DATA_LENGTH */
return STATUS_INVALID_PARAMETER;
}
switch( psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK ){
case RECIPIENT_DEVICE:
/* Get HUB Status */
if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
/* wIndex != 0*/
return STATUS_INVALID_PARAMETER;
}
/*===========================/
Set the replying data /
/===========================*/
pBufAdrs[0] = LOBYTE(VHUBStatus.sHubStatus.status);
pBufAdrs[1] = HIBYTE(VHUBStatus.sHubStatus.status);
pBufAdrs[2] = LOBYTE(VHUBStatus.sHubStatus.changeStatus);
pBufAdrs[3] = HIBYTE(VHUBStatus.sHubStatus.changeStatus);
break;
case RECIPIENT_OTHER:
/* Get Port Status */
if( psDeviceRequest->wIndexH ){
/* wIndex != 0*/
return STATUS_INVALID_PARAMETER;
}
/*=====================================/
Check whether the specified port number is effective /
/=====================================*/
if( psDeviceRequest->wIndexL != 1 ){
/* Invalid port number */
return STATUS_INVALID_PARAMETER;
}
/*===========================/
Set the replying data /
/===========================*/
pBufAdrs[0] = LOBYTE(VHUBStatus.sPortStatus.status);
pBufAdrs[1] = HIBYTE(VHUBStatus.sPortStatus.status);
pBufAdrs[2] = LOBYTE(VHUBStatus.sPortStatus.changeStatus);
pBufAdrs[3] = HIBYTE(VHUBStatus.sPortStatus.changeStatus);
break;
default:
return STATUS_INVALID_PARAMETER;
}
psUrb->actualLength = CLASS_GET_STATUS_DATA_LENGTH;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: ClassClearFeature
//
// description : Class definition Clear Feature request
//
// Process for Clear Feature request of class definition
//
// argument : *psDeviceRequest Pointer of device request
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -