📄 otg_dev.c
字号:
if (oOtgDev.m_eSpeed == USB_HIGH)
{
if (oOtgDev.m_uDeviceRequestLength<=DEVICE_DESC_SIZE)
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, DEVICE_DESC_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, DEVICE_DESC_SIZE); // EP0_PKT_SIZE
}
oOtgDev.m_uEp0State = EP0_STATE_INIT;
DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_DEV_0)\n");
}
else
{
if(oOtgDev.m_uDeviceRequestLength<=DEVICE_DESC_SIZE)
{
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
else if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
else
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 3, oOtgDev.m_uDeviceRequestLength);
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 3, DEVICE_DESC_SIZE);
}
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, max 8byte
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_DEV_1;
}
DbgUsb("EndpointZeroTransfer(FS:EP0_STATE_GD_DEV_0)\n");
}
break;
case EP0_STATE_GD_DEV_1:
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+FULL_SPEED_CONTROL_PKT_SIZE, (oOtgDev.m_uDeviceRequestLength-FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+FULL_SPEED_CONTROL_PKT_SIZE, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_DEV_2;
}
DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_DEV_1)\n");
break;
case EP0_STATE_GD_DEV_2:
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=DEVICE_DESC_SIZE)
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+(2*FULL_SPEED_CONTROL_PKT_SIZE), (oOtgDev.m_uDeviceRequestLength-2*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+(2*FULL_SPEED_CONTROL_PKT_SIZE), (DEVICE_DESC_SIZE-2*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
}
oOtgDev.m_uEp0State = EP0_STATE_INIT;
DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_DEV_2)\n");
break;
// === GET_DESCRIPTOR:CONFIGURATION+INTERFACE+ENDPOINT0+ENDPOINT1 ===
// Windows98 gets these 4 descriptors all together by issuing only a request.
// Windows2000 gets each descriptor seperately.
// === GET_DESCRIPTOR:CONFIGURATION ONLY for WIN2K===
case EP0_STATE_GD_CFG_0:
if (oOtgDev.m_eSpeed == USB_HIGH)
{
if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_TOTAL_SIZE)
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, CONFIG_DESC_TOTAL_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, CONFIG_DESC_TOTAL_SIZE); // EP0_PKT_SIZE
}
oOtgDev.m_uEp0State = EP0_STATE_INIT;
DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_CFG)\n");
}
else
{
if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_TOTAL_SIZE)
{
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
else if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
else if(oOtgDev.m_uDeviceRequestLength<=(3*FULL_SPEED_CONTROL_PKT_SIZE))
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 3, oOtgDev.m_uDeviceRequestLength);
else
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 4, oOtgDev.m_uDeviceRequestLength);
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 4, CONFIG_DESC_TOTAL_SIZE);
}
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_1;
}
DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_CFG_0)\n");
}
break;
case EP0_STATE_GD_CFG_1:
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+FULL_SPEED_CONTROL_PKT_SIZE, (oOtgDev.m_uDeviceRequestLength-FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+FULL_SPEED_CONTROL_PKT_SIZE, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE OTGDEV_WrPktEp0((U8 *)&descConf+8, 1); OTGDEV_WrPktEp0((U8 *)&descIf+0, 7);
oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_2;
}
break;
case EP0_STATE_GD_CFG_2:
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=(3*FULL_SPEED_CONTROL_PKT_SIZE))
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(2*FULL_SPEED_CONTROL_PKT_SIZE), (oOtgDev.m_uDeviceRequestLength-2*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(2*FULL_SPEED_CONTROL_PKT_SIZE), FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE OTGDEV_WrPktEp0((U8 *)&descIf+7, 2); OTGDEV_WrPktEp0((U8 *)&descEndpt0+0, 6);
oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_3;
}
break;
case EP0_STATE_GD_CFG_3:
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=(4*FULL_SPEED_CONTROL_PKT_SIZE))
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(3*FULL_SPEED_CONTROL_PKT_SIZE), (oOtgDev.m_uDeviceRequestLength-3*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(3*FULL_SPEED_CONTROL_PKT_SIZE), FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE OTGDEV_WrPktEp0((U8 *)&descEndpt0+6, 1); OTGDEV_WrPktEp0((U8 *)&descEndpt1+0, 7);
oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_4;
}
break;
case EP0_STATE_GD_CFG_4:
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GD_DEV_QUALIFIER: //only supported in USB 2.0
if(oOtgDev.m_uDeviceRequestLength<=10)
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0((u8 *)aDeviceQualifierDescriptor+0, oOtgDev.m_uDeviceRequestLength);
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 10);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0((u8 *)aDeviceQualifierDescriptor+0, 10);
}
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GD_OTHER_SPEED:
OTEDEV_SetOtherSpeedConfDescTable(oOtgDev.m_uDeviceRequestLength);
break;
case EP0_STATE_GD_OTHER_SPEED_HIGH_1:
if(oOtgDev.m_uDeviceRequestLength==9)
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+8, 1); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 8);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+8, 8); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_OTHER_SPEED_HIGH_2;
}
break;
case EP0_STATE_GD_OTHER_SPEED_HIGH_2:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 8);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+16, 8); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_OTHER_SPEED_HIGH_3;
break;
case EP0_STATE_GD_OTHER_SPEED_HIGH_3:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 8);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+24, 8); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:CONFIGURATION ONLY===
case EP0_STATE_GD_CFG_ONLY_0:
if (oOtgDev.m_eSpeed == USB_HIGH)
{
DbgUsb("[DBG : EP0_STATE_GD_CFG_ONLY]\n");
if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_SIZE)
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, CONFIG_DESC_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, CONFIG_DESC_SIZE); // EP0_PKT_SIZE
}
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
DbgUsb("[DBG : EP0_STATE_GD_CFG_ONLY_0]\n");
if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_SIZE)
{
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
else
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, CONFIG_DESC_SIZE);
}
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_ONLY_1;
}
}
break;
case EP0_STATE_GD_CFG_ONLY_1:
DbgUsb("[DBG : EP0_STATE_GD_CFG_ONLY_1]\n");
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+FULL_SPEED_CONTROL_PKT_SIZE, (CONFIG_DESC_SIZE-FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:INTERFACE ONLY===
case EP0_STATE_GD_IF_ONLY_0:
if (oOtgDev.m_eSpeed == USB_HIGH)
{
if(oOtgDev.m_uDeviceRequestLength<=INTERFACE_DESC_SIZE)
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, oOtgDev.m_uDeviceRequestLength); // INTERFACE_DESC_SIZE
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, INTERFACE_DESC_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, max 64byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, INTERFACE_DESC_SIZE); // INTERFACE_DESC_SIZE
}
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
if(oOtgDev.m_uDeviceRequestLength<=INTERFACE_DESC_SIZE)
{
if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
else
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, INTERFACE_DESC_SIZE);
}
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
if(oOtgDev.m_uDeviceRequestLength<FULL_SPEED_CONTROL_PKT_SIZE)
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, oOtgDev.m_uDeviceRequestLength); // INTERFACE_DESC_SIZE
oOtgDev.m_uEp0State = EP0_STATE_INIT;
}
else
{
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, FULL_SPEED_CONTROL_PKT_SIZE); // INTERFACE_DESC_SIZE
oOtgDev.m_uEp0State = EP0_STATE_GD_IF_ONLY_1;
}
}
break;
case EP0_STATE_GD_IF_ONLY_1:
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+FULL_SPEED_CONTROL_PKT_SIZE, (INTERFACE_DESC_SIZE-FULL_SPEED_CONTROL_PKT_SIZE));
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:ENDPOINT 1 ONLY===
case EP0_STATE_GD_EP0_ONLY_0:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, ENDPOINT_DESC_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescEndpt1))+0, ENDPOINT_DESC_SIZE);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:ENDPOINT 2 ONLY===
case EP0_STATE_GD_EP1_ONLY_0:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, ENDPOINT_DESC_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescEndpt2))+0, ENDPOINT_DESC_SIZE);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:STRING ===
case EP0_STATE_GD_STR_I0:
DbgUsb("[GDS0_0]");
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, STRING_DESC0_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0)); //ep0 enable, clear nak, next ep0, 8byte
OTGDEV_WrPktEp0((u8 *)aDescStr0, STRING_DESC0_SIZE);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GD_STR_I1:
DbgUsb("[GDS1_%d]", oOtgDev.m_uEp0SubState);
if ((oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize+oOtgDev.m_uControlEPMaxPktSize)<sizeof(aDescStr1))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -