📄 chap_9.c
字号:
switch(DCPCtrlXfer.DeviceRequest.bmRequestType.Recipient)
{
case USB_RECIPIENT_DEVICE:
if(USB_FEATURE_REMOTE_WAKEUP == wFeature)
{
// D13_DevInfo.bits.remote_wakeup = 0;
Chap9sup_SingleTransmitEP0(0, 0);
}
/* else if(USB_FEATURE_B_HNP_ENABLE == wFeature)
{
OtgTcb.b_hnp_en = 0;
Chap9sup_SingleTransmitEP0(0, 0);
}
else if(USB_FEATURE_A_HNP_SUPPORT == wFeature)
{
OtgTcb.a_hnp_support = 0;
Chap9sup_SingleTransmitEP0(0, 0);
}
else if(USB_FEATURE_A_ALT_HNP_SUPPORT == wFeature)
{
OtgTcb.a_alt_hnp_support = 0;
Chap9sup_SingleTransmitEP0(0, 0);
} */
else
{
Chap9sup_StallEP0InControlWrite();
return;
}
break;
case USB_RECIPIENT_ENDPOINT:
if( 0 != DCPCtrlXfer.DeviceRequest.wIndex && DEVSTATE_ADDRESS == D13_DevInfo.bits.DevState)
{
Chap9sup_StallEP0InControlWrite();
return;
}
if(wFeature == USB_FEATURE_ENDPOINT_STALL)
{
byEndp = (UCHAR)(DCPCtrlXfer.DeviceRequest.wIndex & MAX_ENDPOINTS);
D13_SetEndpointStatus( D13_Endp2EndpIndex(byEndp), 0);
Chap9sup_SingleTransmitEP0(0, 0);
}
else
{
Chap9sup_StallEP0InControlWrite();
}
break;
case USB_RECIPIENT_INTERFACE:
default:
Chap9sup_StallEP0InControlWrite();
break;
}
}
else
{
Chap9sup_StallEP0InControlWrite();
}
}
void Chap9_SetFeature(void)
{
UCHAR byEndp;
USHORT wFeature = DCPCtrlXfer.DeviceRequest.wValue;
if( DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
DCPCtrlXfer.DeviceRequest.wLength == 0 )
{
switch(DCPCtrlXfer.DeviceRequest.bmRequestType.Recipient)
{
case USB_RECIPIENT_DEVICE:
if(USB_FEATURE_REMOTE_WAKEUP == wFeature)
{
// D13_DevInfo.bits.remote_wakeup = 1;
Chap9sup_SingleTransmitEP0(0, 0);
}
else if(USB_FEATURE_B_HNP_ENABLE == wFeature)
{
Chap9sup_SingleTransmitEP0(0, 0);
OtgTcb.b_hnp_en = 1;
// printf("DC: Setup_handler: b_hnp_en = 1\n");
}
else if(USB_FEATURE_A_HNP_SUPPORT == wFeature)
{
OtgTcb.a_hnp_support = 1;
Chap9sup_SingleTransmitEP0(0, 0);
}
else if(USB_FEATURE_A_ALT_HNP_SUPPORT == wFeature)
{
OtgTcb.a_alt_hnp_support = 1;
Chap9sup_SingleTransmitEP0(0, 0);
}
else
{
Chap9sup_StallEP0InControlWrite();
return;
}
break;
case USB_RECIPIENT_ENDPOINT:
if( wFeature == USB_FEATURE_ENDPOINT_STALL)
{
if( 0 != DCPCtrlXfer.DeviceRequest.wIndex && DEVSTATE_ADDRESS == D13_DevInfo.bits.DevState)
{
Chap9sup_StallEP0InControlWrite();
return;
}
byEndp = (UCHAR)(DCPCtrlXfer.DeviceRequest.wIndex & MAX_ENDPOINTS);
D13_SetEndpointStatus(D13_Endp2EndpIndex(byEndp), D13REG_EPSTS_STALL);
Chap9sup_SingleTransmitEP0(0, 0);
}
else
{
D13_SetEndpointStatus(D13_Endp2EndpIndex(byEndp), 0);
Chap9sup_SingleTransmitEP0(0, 0);
}
break;
case USB_RECIPIENT_INTERFACE:
default:
Chap9sup_StallEP0InControlWrite();
break;
}
}else
{
Chap9sup_StallEP0InControlWrite();
}
}
void Chap9_SetAddress(void)
{
if( DIR_H2D != DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir || \
0 != DCPCtrlXfer.DeviceRequest.wIndex || \
0 != DCPCtrlXfer.DeviceRequest.wLength)
{
Chap9sup_StallEP0InControlWrite();
return;
}
if( DCPCtrlXfer.DeviceRequest.wIndex == 0 && DCPCtrlXfer.DeviceRequest.wLength == 0 ){
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
D13_SetAddressEnable((UCHAR)(DCPCtrlXfer.DeviceRequest.wValue), 1);
if(0 == (UCHAR)(DCPCtrlXfer.DeviceRequest.wValue))
D13_DevInfo.bits.DevState = DEVSTATE_DEFAULT;
else
D13_DevInfo.bits.DevState = DEVSTATE_ADDRESS;
}
LowerIRQL();
/*
// Minimize the MISSING Window for SETUP Packet
// Here give a chance to ISR whose interrupt is caused by Setup Packet
*/
Chap9sup_SingleTransmitEP0(0, 0);
}
else
{
Chap9sup_StallEP0InControlWrite();
}
}
void Chap9_GetDescriptor(void)
{
UCHAR bDescriptor = MSB(DCPCtrlXfer.DeviceRequest.wValue);
UCHAR bDescriptorIndex = LSB(DCPCtrlXfer.DeviceRequest.wValue);
if( DIR_D2H != DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir)
{
Chap9sup_StallEP0InControlRead();
return;
}
switch(bDescriptor)
{
case USB_DEVICE_DESCRIPTOR_TYPE:
Chap9sup_BurstTransmitEP0((PUSHORT)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
break;
case USB_CONFIGURATION_DESCRIPTOR_TYPE:
Chap9sup_BurstTransmitEP0((PUSHORT)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
break;
case USB_STRING_DESCRIPTOR_TYPE:
switch(bDescriptorIndex)
{
case STR_INDEX_LANGUAGE:
Chap9sup_BurstTransmitEP0((PUSHORT)&strLanguage, sizeof(USB_STRING_LANGUAGE_DESCRIPTOR));
break;
case STR_INDEX_MANUFACTURER:
Chap9sup_BurstTransmitEP0((PUSHORT)&strManufacturer, sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR));
break;
case STR_INDEX_PRODUCT:
Chap9sup_BurstTransmitEP0((PUSHORT)&strProduct, sizeof(USB_STRING_PRODUCT_DESCRIPTOR));
break;
case STR_INDEX_SERIALNUMBER:
Chap9sup_BurstTransmitEP0((PUSHORT)&ConfigDescr, sizeof(CONFIG_DESCRIPTOR_LENGTH));
break;
case STR_INDEX_CONFIGURATION:
Chap9sup_BurstTransmitEP0((PUSHORT)&strConfiguration, sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR) );
break;
case STR_INDEX_INTERFACE:
Chap9sup_BurstTransmitEP0((PUSHORT)&strInterface, sizeof(USB_STRING_INTERFACE_DESCRIPTOR) );
break;
default:
Chap9sup_StallEP0InControlRead();
break;
}
break;
case USB_INTERFACE_DESCRIPTOR_TYPE:
case USB_ENDPOINT_DESCRIPTOR_TYPE:
case USB_POWER_DESCRIPTOR_TYPE:
case USB_OTG_DESCRIPTOR_TYPE:
Chap9sup_SingleTransmitEP0((PUSHORT)&OTG_Descr, sizeof(USB_OTG_DESCRIPTOR));
break;
default:
Chap9sup_StallEP0InControlRead();
break;
}
}
void Chap9_GetConfiguration(void)
{
if (DIR_D2H == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
0 == DCPCtrlXfer.DeviceRequest.wValue && \
0 == DCPCtrlXfer.DeviceRequest.wIndex && \
1 == DCPCtrlXfer.DeviceRequest.wLength )
{
Chap9sup_SingleTransmitEP0((PUSHORT)&D13_DevInfo.bits.CnfigNo, 1);
}
else
Chap9sup_StallEP0InControlRead();
}
void Chap9_SetConfiguration(void)
{
if( DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
0 == DCPCtrlXfer.DeviceRequest.wIndex && \
0 == DCPCtrlXfer.DeviceRequest.wLength)
{
switch(DCPCtrlXfer.DeviceRequest.wValue)
{
case 0:
/* put device in unconfigured state */
D13_DevInfo.bits.CnfigNo = 0; /* This flag should be set before Unconfig and Config */
D13_DevInfo.bits.DevState = DEVSTATE_ADDRESS;
DcS_UnconfigDevice();
/*
// Minimize the MISSING Window for SETUP Packet
// Here give a chance to ISR whose interrupt is caused by Setup Packet
*/
Chap9sup_SingleTransmitEP0(0, 0);
break;
case 1:
/* Configure device */
D13_DevInfo.bits.CnfigNo = 1; /* This flag should be set before Unconfig and Config */
D13_DevInfo.bits.DevState = DEVSTATE_CONFIGURED;
DcS_UnconfigDevice();
DcS_ConfigDevice();
/*
// Minimize the MISSING Window for SETUP Packet
// Here give a chance to ISR whose interrupt is caused by Setup Packet
*/
Chap9sup_SingleTransmitEP0(0, 0);
break;
default:
Chap9sup_StallEP0InControlWrite();
}
}
else
{
Chap9sup_StallEP0InControlWrite();
}
}
void Chap9_GetInterface(void)
{
UCHAR byTemp = 0;
if (DIR_D2H == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
0 == DCPCtrlXfer.DeviceRequest.wValue && \
0 == DCPCtrlXfer.DeviceRequest.wIndex && \
1 == DCPCtrlXfer.DeviceRequest.wLength && \
DEVSTATE_CONFIGURED == D13_DevInfo.bits.DevState)
{
Chap9sup_SingleTransmitEP0((PUSHORT)&byTemp, 1);
}
else
{
Chap9sup_StallEP0InControlRead();
}
}
void Chap9_SetInterface(void)
{
if (DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
DEVSTATE_CONFIGURED == D13_DevInfo.bits.DevState)
{
if( 0 == DCPCtrlXfer.DeviceRequest.wValue && \
0 == DCPCtrlXfer.DeviceRequest.wIndex )
{
Chap9sup_SingleTransmitEP0(0,0);
}
else
{
Chap9sup_StallEP0InControlWrite();
}
}
else
{
Chap9sup_StallEP0InControlWrite();
}
}
/*
//*************************************************************************
// Chap9 support functions
//*************************************************************************
*/
void Chap9sup_StallEP0(void)
{
if(DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir)
{
DcS_StallEP0InControlRead();
}
else
{
DcS_StallEP0InControlWrite();
}
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
DCPCtrlXfer.FSMState = USBFSM4DCP_STALL;
}
LowerIRQL();
}
void Chap9sup_StallEP0InControlWrite(void)
{
DcS_StallEP0InControlWrite();
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
DCPCtrlXfer.FSMState = USBFSM4DCP_STALL;
}
LowerIRQL();
}
void Chap9sup_StallEP0InControlRead(void)
{
DcS_StallEP0InControlRead();
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
DCPCtrlXfer.FSMState = USBFSM4DCP_STALL;
}
LowerIRQL();
}
void Chap9sup_SingleTransmitEP0(PUSHORT ptrBuf, USHORT wLength)
{
DcS_SingleTransmitEP0(ptrBuf, wLength);
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
DCPCtrlXfer.wLength = DCPCtrlXfer.wCount = wLength;
DCPCtrlXfer.FSMState = USBFSM4DCP_HANDSHAKE;
}
LowerIRQL();
}
void Chap9sup_BurstTransmitEP0(PUSHORT pData, USHORT wLength)
{
DCPCtrlXfer.wCount = 0;
if(DCPCtrlXfer.wLength > wLength)
DCPCtrlXfer.wLength = wLength;
DCPCtrlXfer.ptrBuf = pData;
if( DCPCtrlXfer.wLength >= EP0_PACKET_SIZE)
{
D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, DCPCtrlXfer.ptrBuf, EP0_PACKET_SIZE);
/*
// Minimize the MISSING Window for SETUP Packet
// Here give a chance to ISR whose interrupt is caused by Setup Packet
*/
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
DCPCtrlXfer.wCount += EP0_PACKET_SIZE;
DCPCtrlXfer.FSMState = USBFSM4DCP_DATAIN;
}
LowerIRQL();
}
else
{
D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, DCPCtrlXfer.ptrBuf, DCPCtrlXfer.wLength);
/*
// Minimize the MISSING Window for SETUP Packet
// Here give a chance to ISR whose interrupt is caused by Setup Packet
*/
RaiseIRQL();
if(!DCPCtrlXfer.bAbort)
{
DCPCtrlXfer.wCount += DCPCtrlXfer.wLength;
DCPCtrlXfer.FSMState = USBFSM4DCP_HANDSHAKE;
}
LowerIRQL();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -