📄 chap_99.c
字号:
bD13flags.bits.remote_wakeup = 0;
Chap9_SingleTransmitEP0(0, 0);
}
else
Chap9_StallEP0InControlWrite();
break;
case USB_RECIPIENT_ENDPOINT:
if(wFeature == USB_FEATURE_ENDPOINT_STALL)
{
if( ControlData.DeviceRequest.wIndex == 0x00 )
{
endp = 0;
Hal4D13_SetEndpointStatus(endp, 0);
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Chap9_StallEP0InControlWrite();
break;
}
}
else
Chap9_StallEP0InControlWrite();
break;
default:
Chap9_StallEP0InControlWrite();
break;
}
}
}
else
{
if( ControlData.DeviceRequest.wLength == 0 )
{
switch(bRecipient)
{
case USB_RECIPIENT_DEVICE:
if(wFeature == USB_FEATURE_REMOTE_WAKEUP)
{
bD13flags.bits.remote_wakeup = 0;
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Chap9_StallEP0InControlWrite();
}
break;
case USB_RECIPIENT_ENDPOINT:
if(wFeature == USB_FEATURE_ENDPOINT_STALL)
{
if( ControlData.DeviceRequest.wIndex == 0x00 )
endp = -1;
else
endp = (UCHAR)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
Hal4D13_SetEndpointStatus(endp+1, 0);
Hal4D13_SetEndpointStatus(endp+1, 0);
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Chap9_StallEP0InControlWrite();
}
break;
default:
Chap9_StallEP0InControlWrite();
break;
}
}
}
}
void Chap9_SetFeature(void)
{
UCHAR endp = 0;
UCHAR bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
USHORT wFeature = ControlData.DeviceRequest.wValue;
if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
{
switch(bRecipient)
{
case USB_RECIPIENT_DEVICE:
if(wFeature == USB_FEATURE_REMOTE_WAKEUP)
{
bD13flags.bits.remote_wakeup = 1;
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Chap9_StallEP0InControlWrite();
}
break;
case USB_RECIPIENT_ENDPOINT:
if( wFeature == USB_FEATURE_ENDPOINT_STALL)
{
if( ControlData.DeviceRequest.wIndex == 0x00 )
endp = -1;
Hal4D13_SetEndpointStatus(endp+1, D13REG_EPSTS_STALL);
Chap9_SingleTransmitEP0(0, 0);
}
else
Chap9_StallEP0InControlWrite();
break;
default:
Chap9_StallEP0InControlWrite();
break;
}
}
else
{
if( ControlData.DeviceRequest.wLength == 0 )
{
switch(bRecipient)
{
case USB_RECIPIENT_DEVICE:
if(wFeature == USB_FEATURE_REMOTE_WAKEUP)
{
bD13flags.bits.remote_wakeup = 1;
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Chap9_StallEP0InControlWrite();
}
break;
case USB_RECIPIENT_ENDPOINT:
if( wFeature == USB_FEATURE_ENDPOINT_STALL)
{
if( ControlData.DeviceRequest.wIndex == 0x00 )
endp = -1;
else
endp = (UCHAR)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
Hal4D13_SetEndpointStatus(endp+1, D13REG_EPSTS_STALL);
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Hal4D13_SetEndpointStatus(endp+1, 0);
Chap9_SingleTransmitEP0(0, 0);
}
break;
default:
Chap9_StallEP0InControlWrite();
break;
}
}
}
}
void Chap9_SetAddress(void)
{
UCHAR j;
{
RaiseIRQL();
disable();
if(!ControlData.Abort)
{
if(bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE)
{
if((ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK) != 0 )
{
bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 0;
Hal4D13_SetAddressEnable((UCHAR)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1;
Chap9_SingleTransmitEP0(0, 0);
}
else
bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1;
}
else if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
{
if((ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK) == 0 )
{
Hal4D13_SetAddressEnable((UCHAR)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0;
Chap9_SingleTransmitEP0(0, 0);
}
else
{
bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 0;
Hal4D13_SetAddressEnable((UCHAR)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1;
Chap9_SingleTransmitEP0(0, 0);
}
}
else
{
bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 0;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0;
bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1;
j = DEV_BEHAVIOUR_NOT_SPECIFIED;
Chap9_SingleTransmitEP0(&j, 0);
}
}
LowerIRQL();
enable();
}
printf("Hal4D13_GetAddress %04x\n",Hal4D13_GetAddress());
}
void Chap9_GetDescriptor(void)
{
UCHAR bDescriptor = MSB(ControlData.DeviceRequest.wValue);
UCHAR bDescriptorIndex = LSB(ControlData.DeviceRequest.wValue);
printf("bDescriptor %d\n",bDescriptor);
printf("bDescriptorIndex %d\n",bDescriptorIndex);
printf("size %d\n",sizeof(USB_CONFIGURATION_DESCRIPTOR));
printf("sizeof(USB_DEVICE_DESCRIPTOR) %d\n",sizeof(USB_DEVICE_DESCRIPTOR));
switch(bDescriptor)
{
case USB_DEVICE_DESCRIPTOR_TYPE:{//1
Chap9_BurstTransmitEP0((PUCHAR)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
break;}
case USB_CONFIGURATION_DESCRIPTOR_TYPE:{//2
// Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
printf("\nConfigDescr \n"); Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, 46);//sizeof(USB_CONFIGURATION_DESCRIPTOR));
// printf("\nInterfaceDescr0 "); Chap9_BurstTransmitEP0((PUCHAR)&InterfaceDescr0, sizeof(USB_INTERFACE_DESCRIPTOR));
// printf("\nEP1_TXDesc "); Chap9_BurstTransmitEP0((PUCHAR)&EP1_TXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
// printf("\nEP1_RXDescr "); Chap9_BurstTransmitEP0((PUCHAR)&EP1_RXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
// printf("\nEP2_TXDescr "); Chap9_BurstTransmitEP0((PUCHAR)&EP2_TXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
// printf("\nEP2_RXDescr "); Chap9_BurstTransmitEP0((PUCHAR)&EP2_RXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
break;}
case USB_STRING_DESCRIPTOR_TYPE://3
switch(bDescriptorIndex)
{
case STR_INDEX_LANGUAGE:
printf("\n str1 \n");Chap9_BurstTransmitEP0((PUCHAR)&strLanguage, sizeof(USB_STRING_LANGUAGE_DESCRIPTOR));
break;
case STR_INDEX_MANUFACTURER:
printf("\n str2 \n");Chap9_BurstTransmitEP0((PUCHAR)&strManufacturer, sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR));
break;
case STR_INDEX_PRODUCT:
printf("\n str3 \n");Chap9_BurstTransmitEP0((PUCHAR)&strProduct, sizeof(USB_STRING_PRODUCT_DESCRIPTOR));
break;
case STR_INDEX_SERIALNUMBER:
printf("\n str4 \n");Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, sizeof(CONFIG_DESCRIPTOR_LENGTH));
break;
case STR_INDEX_CONFIGURATION:
printf("\n str5 \n");Chap9_BurstTransmitEP0((PUCHAR)&strConfiguration, sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR) );
break;
case STR_INDEX_INTERFACE:
printf("\n str6 \n");Chap9_BurstTransmitEP0((PUCHAR)&strInterface, sizeof(USB_STRING_INTERFACE_DESCRIPTOR) );
break;
default:
printf("\n str7 \n");Chap9_StallEP0InControlRead();
break;
}
case USB_INTERFACE_DESCRIPTOR_TYPE:
case USB_ENDPOINT_DESCRIPTOR_TYPE:
case USB_POWER_DESCRIPTOR_TYPE:
default:
Chap9_StallEP0InControlRead();
break;
}
}
void Chap9_GetConfiguration(void)
{
UCHAR c = bD13flags.bits.configuration;
UCHAR j;
if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
{
j = 0;
Chap9_SingleTransmitEP0(&j, 1);
}
else
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0 && ControlData.DeviceRequest.wLength == 1)
{
Chap9_SingleTransmitEP0(&c, 1);
}
}
}
void Chap9_SetConfiguration(void)
{
if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
{
if(ControlData.DeviceRequest.wIndex == 0 && ControlData.DeviceRequest.wLength == 0)
{
if (ControlData.DeviceRequest.wValue == 0)
{
/* put device in unconfigured state */
bD13flags.bits.configuration = 0;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1;
Chap9_SingleTransmitEP0(0, 0);
}
else if (ControlData.DeviceRequest.wValue == 1)
{
/* Configure device */
bD13flags.bits.configuration = 1;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0;
bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 1;
Chap9_SingleTransmitEP0(0, 0);
}
else
Chap9_StallEP0InControlWrite();
}
}
else
{
if (ControlData.DeviceRequest.wValue == 0)
{
/* put device in unconfigured state */
bD13flags.bits.configuration = 0;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 1;
bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 0;
Chap9_SingleTransmitEP0(0, 0);
}
else if (ControlData.DeviceRequest.wValue == 1)
{
/* Configure device */
bD13flags.bits.configuration = 1;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0;
bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 1;
Chap9_SingleTransmitEP0(0, 0);
}
else
Chap9_StallEP0InControlWrite();
}
}
void Chap9_GetInterface(void)
{
if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
Chap9_StallEP0InControlRead();
else
{
if ((ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0 && ControlData.DeviceRequest.wLength == 1))
Chap9_SingleTransmitEP0(&ALTERNATIVE_SETTING, 1); //txdat
else
Chap9_StallEP0InControlRead();
}
}
void Chap9_SetInterface(void)
{
UCHAR dir = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_DIR_MASK;
if(dir)
Chap9_StallEP0InControlRead();
if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
Chap9_StallEP0InControlRead();
else
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
{
ALTERNATIVE_SETTING = 0;
Chap9_SingleTransmitEP0(0,0);
}
else if (ControlData.DeviceRequest.wValue == 1 && ControlData.DeviceRequest.wIndex == 0)
{
ALTERNATIVE_SETTING = 1;
Chap9_SingleTransmitEP0(0,0);
}
else
{
Chap9_StallEP0InControlWrite();
}
}
}
// *************************************************************************
// Chap9 support functions
// *************************************************************************
void Chap9_StallEP0(void)
{
UCHAR dir;
dir = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_DIR_MASK;
if(dir)
{
Hal4D13_StallEP0InControlRead();
}
else
{
Hal4D13_StallEP0InControlWrite();
}
RaiseIRQL();
if(!ControlData.Abort)
{
bD13flags.bits.DCP_state = USBFSM4DCP_STALL;
}
LowerIRQL();
}
void Chap9_StallEP0InControlWrite(void)
{
Hal4D13_StallEP0InControlWrite();
RaiseIRQL();
if(!ControlData.Abort)
{
bD13flags.bits.DCP_state = USBFSM4DCP_STALL;
}
LowerIRQL();
}
void Chap9_StallEP0InControlRead(void)
{
Hal4D13_StallEP0InControlRead();
RaiseIRQL();
if(!ControlData.Abort)
{
bD13flags.bits.DCP_state = USBFSM4DCP_STALL;
}
LowerIRQL();
}
void Chap9_SingleTransmitEP0(PUCHAR buf, USHORT len)
{
Hal4D13_SingleTransmitEP0(buf, len);
RaiseIRQL();
if(!ControlData.Abort)
{
ControlData.wLength = ControlData.wCount = len;
bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE;
}
LowerIRQL();
}
void Chap9_BurstTransmitEP0(PUCHAR pData, USHORT len)
{
ControlData.wCount = 0;
if(ControlData.wLength > len)
ControlData.wLength = len;
ControlData.Addr.pData = pData;
if( ControlData.wLength >= EP0_PACKET_SIZE)
{
Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, EP0_PACKET_SIZE);
RaiseIRQL();
if(!ControlData.Abort)
{
ControlData.wCount += EP0_PACKET_SIZE;
bD13flags.bits.DCP_state = USBFSM4DCP_DATAIN;
}
LowerIRQL();
}
else
{
Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, ControlData.wLength);
RaiseIRQL();
if(!ControlData.Abort)
{
ControlData.wCount += ControlData.wLength;
bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE;
}
LowerIRQL();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -