📄 chap_9.c
字号:
DEVICE_ADDRESS_MASK), 1);
Chap9sup_SingleTransmitEP0(0,0);
}
void Chap9_GetInterface(void)//0x0a
{
tempvars4UsbReq.chars.tx0 = 0; /* Only/Current interface = 0 */
Chap9sup_SingleTransmitEP0(&tempvars4UsbReq.chars.tx0,1);
}
void Chap9_SetInterface(void) //0x0B
{
if (DCPDeviceRequest.wValue == 0 && DCPDeviceRequest.wIndex == 0)
{
Chap9sup_SingleTransmitEP0(0,0);
}
else
REQBF_StallDCPRequest = 1;
}
void Chap9_GetConfiguration(void)// 0x08
{
tempvars4UsbReq.chars.tx0 = D12BF_Configuration;
if (DCPDeviceRequest.wValue == 0 && DCPDeviceRequest.wIndex == 0 && DCPDeviceRequest.wLength == 1)
{
Chap9sup_SingleTransmitEP0(&tempvars4UsbReq.chars.tx0,1);
}
else
{
REQBF_StallDCPRequest = 1;
}
}
void Chap9_SetConfiguration(void)//0x09
{
if(DCPDeviceRequest.wIndex == 0 && DCPDeviceRequest.wLength == 0)
{
if (DCPDeviceRequest.wValue == 0) {
/* put device in unconfigured state */
D12BF_Configuration = 0; /* This flag should be set before Unconfig and Config */
Hal4D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
} else if (DCPDeviceRequest.wValue == 1) {
/* Configure device */
D12BF_Configuration = 1; /* This flag should be set before Unconfig and Config */
Hal4D12_SetEndpointEnable(1); /* Disable all endpoints but EPP0. */
} else
{
REQBF_StallDCPRequest = 1;
}
}
else
{
REQBF_StallDCPRequest = 1;
}
if(!REQBF_StallDCPRequest)
Chap9sup_SingleTransmitEP0(0,0);
}
void Chap9_GetStatus(void) // 0x00
{
if(DCPDeviceRequest.wValue == 0 && DCPDeviceRequest.wLength == 2 )
{
switch(UsbReq_Recipient)
{
case USB_RECIPIENT_DEVICE: // 设备 0x00
tempvars4UsbReq.chars.tx0 = DEVSTS_SELFPOWERED; /* Self-powered*/
tempvars4UsbReq.chars.tx1=0;
break;
case USB_RECIPIENT_INTERFACE:// 接口 0x01
tempvars4UsbReq.ints.i0=0;
break;
case USB_RECIPIENT_ENDPOINT: // 0x02 端点
tempvars4UsbReq.chars.endp = (INT8)(DCPDeviceRequest.wIndex & MAX_ENDPOINTS);
if (REQBF_DCPRequest_EPdir)
tempvars4UsbReq.chars.c0 = Hal4D12_SelectEndpoint((tempvars4UsbReq.chars.endp<<1)+ 1); /* Control-in */
else
tempvars4UsbReq.chars.c0 = Hal4D12_SelectEndpoint(tempvars4UsbReq.chars.endp<<1); /* Control-out */
if(tempvars4UsbReq.chars.c0 & D12_STALL)
tempvars4UsbReq.chars.tx0 = ENDPSTS_HALT; /* Halt */
else
tempvars4UsbReq.chars.tx0 = 0;
tempvars4UsbReq.chars.tx1 = 0;
break;
default:
REQBF_StallDCPRequest = 1;
break;
}
}
else
{
REQBF_StallDCPRequest = 1;
}
if(!REQBF_StallDCPRequest)
{
Chap9sup_SingleTransmitEP0(&tempvars4UsbReq.chars.tx0,2);
}
}
void Chap9_ClearFeature(void) //0x01
{
if( DCPDeviceRequest.wLength == 0 )
{
switch(UsbReq_Recipient)
{
case USB_RECIPIENT_DEVICE://0x00 设备
break;
case USB_RECIPIENT_ENDPOINT://0x02 端点
if(DCPDeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) //USB_FEATURE_ENDPOINT_STALL=0x0000
{
tempvars4UsbReq.chars.endp = (INT8)(DCPDeviceRequest.wIndex & MAX_ENDPOINTS);
if(!D12BF_SetupOverwritten)
{
if (REQBF_DCPRequest_EPdir)
{
/* clear TX stall for IN on EPn. */
Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1)+1, 0);
if(tempvars4UsbReq.chars.endp == 2)
{
BOTBF_StallAtBulkIn = 0;
//if(BOTBF_StallAtBulkOut == 0)
BOTFSMstate = USBFSM4BOT_CSW;
}
}
else
{
/* clear RX stall for OUT on EPn. */
Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1), 0);
if(tempvars4UsbReq.chars.endp == 2)
{
BOTBF_StallAtBulkOut = 0;
//if(BOTBF_StallAtBulkIn == 0)
// BOTFSMstate = USBFSM4BOT_IDLE;
}
}
}
}
else
{
REQBF_StallDCPRequest = 1;
}
break;
default:
REQBF_StallDCPRequest = 1;
break;
}
}
else
{
REQBF_StallDCPRequest = 1;
}
if(!REQBF_StallDCPRequest)
{
Chap9sup_SingleTransmitEP0(0,0);
}
}
void Chap9_SetFeature(void) //0x03 特性选择符
{
if( DCPDeviceRequest.wLength == 0 )
{
switch(UsbReq_Recipient)
{
case USB_RECIPIENT_DEVICE: // 0x00 设备
if(DCPDeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
REQBF_StallDCPRequest = 1;
}
break;
case USB_RECIPIENT_ENDPOINT: // 0x02 端点
if( DCPDeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
tempvars4UsbReq.chars.endp = (INT8)(DCPDeviceRequest.wIndex & MAX_ENDPOINTS);
if(!D12BF_SetupOverwritten)
{
if (REQBF_DCPRequest_EPdir)
{
/* clear TX stall for IN on EPn. */
Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1)+1, 1);
}
else
{
/* clear RX stall for OUT on EPn. */
Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1), 1);
}
}
}
else
{
REQBF_StallDCPRequest = 1;
}
break;
default:
REQBF_StallDCPRequest = 1;
break;
}
}
else
{
REQBF_StallDCPRequest = 1;
}
if(!REQBF_StallDCPRequest)
Chap9sup_SingleTransmitEP0(0,0);
}
void Chap9_GetDescriptor(void)//0x06 描述符类型和索引
{
// tempvars4UsbReq.ints.i0 = DCPDeviceRequest.wValue; // wValue has be swapped.
switch(DCPDeviceRequest.wValue>>8)
{
case USB_DEVICE_DESCRIPTOR_TYPE:
DCPXfer_wResidue = sizeof(USB_DEVICE_DESCRIPTOR);//
DCPXfer_pData = (INT8 *)&DeviceDescr; // 设备描述符号
break;
case USB_CONFIGURATION_DESCRIPTOR_TYPE:
DCPXfer_wResidue = CONFIG_DESCRIPTOR_LENGTH;
DCPXfer_pData = (INT8 *)&ConfigDescr; // 配置描述符
break;
case USB_STRING_DESCRIPTOR_TYPE: // 0x03
switch( tempvars4UsbReq.Descriptor.Index )
{
case STR_INDEX_LANGUAGE://0x00
DCPXfer_wResidue = sizeof(USB_STRING_LANGUAGE_DESCRIPTOR);
DCPXfer_pData = (INT8 *)&strLanguage;
break;
case STR_INDEX_MANUFACTURER://0x01 厂商描述符字符串索引
DCPXfer_wResidue = sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR);
DCPXfer_pData = (INT8 *)&strManufacturer;
break;
case STR_INDEX_PRODUCT://0x02 产品描述符字符串索引
DCPXfer_wResidue = sizeof(USB_STRING_PRODUCT_DESCRIPTOR);
DCPXfer_pData = (INT8 *)&strProduct;
break;
case STR_INDEX_SERIALNUMBER: // 设序列号字符串索引,= 03H
DCPXfer_wResidue = sizeof(USB_STRING_SERIALNUMBER_DESCRIPTOR);
DCPXfer_pData = (INT8 *)&strSerialNum;
break;
default:
REQBF_StallDCPRequest = 1;
break;
}
break;
default:
REQBF_StallDCPRequest = 1;
break;
}
if(!REQBF_StallDCPRequest)
{
Chap9sup_BurstTransmitEP0();
}
}
//*************************************************************************
// Chap9 support functions
//*************************************************************************
void Chap9sup_SingleTransmitEP0(INT8 * buf, INT8 len)
{
DCPXfer_wResidue = len;
Xfer_Space &= DCPXFERSPACE_MASK; // 0xF0
Xfer_Space |= DCPXFERSPACE_MCURAM; // 0x02
if(DCPXfer_wResidue == 0)
{
DCPFSMstate = USBFSM4DCP_HANDSHAKE4CO; // USBFSM4DCP_HANDSHAKE4CO=0x08
}
else
{
DCPFSMstate = USBFSM4DCP_HANDSHAKE4CI; // USBFSM4DCP_HANDSHAKE4CI=0x10
}
Hal4D12_SingleTransmitEP0(buf, len);
}
void Chap9sup_BurstTransmitEP0( void )// 端定0批量传输
{
if(DCPXfer_wResidue > DCPDeviceRequest.wLength)
DCPXfer_wResidue = DCPDeviceRequest.wLength;
Xfer_Space &= DCPXFERSPACE_MASK;
Xfer_Space |= DCPXFERSPACE_MCUCODE;
if( DCPXfer_wResidue >= EP0_PACKET_SIZE)
{
DCPFSMstate = USBFSM4DCP_DATAIN;
Hal4D12_WriteEPAtCode(1, EP0_PACKET_SIZE, DCPXfer_pData);
DCPXfer_pData += EP0_PACKET_SIZE;
DCPXfer_wResidue -= EP0_PACKET_SIZE;
}
else
{
Hal4D12_WriteEPAtCode(1, DCPXfer_wResidue, DCPXfer_pData );
//DCPXfer_pData += DCPXfer_wResidue;
DCPXfer_wResidue = 0;
DCPFSMstate = USBFSM4DCP_HANDSHAKE4CI;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -