📄 kitlusbser.c
字号:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&g_oDescDevice+0, 8); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_GD_DEV_1;
//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_DEV_0)\n");
}
break;
case EP0_STATE_GD_DEV_1:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&g_oDescDevice+8, 8); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_GD_DEV_2;
//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_DEV_1)\n");
break;
case EP0_STATE_GD_DEV_2:
Outp32(BYTE_WRITE_CNT_REG, 2);
WrPktEp0((UINT8 *)&g_oDescDevice+16, 2); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_INIT;
//KITLOutputDebugString("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 (g_eSpeed == 1)
{
Outp32(BYTE_WRITE_CNT_REG, 32);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 32); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_INIT;
//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_CFG) : 32\n");
}
else
{
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 8); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_GD_CFG_1;
//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_CFG_0) : 8\n");
}
break;
case EP0_STATE_GD_CFG_1:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+8, 8); // EP0_PKT_SIZE WrPktEp0((UINT8 *)&descConf+8, 1); WrPktEp0((UINT8 *)&descIf+0, 7);
g_uEp0State = EP0_STATE_GD_CFG_2;
break;
case EP0_STATE_GD_CFG_2:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+16, 8); // EP0_PKT_SIZE WrPktEp0((UINT8 *)&descIf+7, 2); WrPktEp0((UINT8 *)&descEndpt0+0, 6);
g_uEp0State = EP0_STATE_GD_CFG_3;
break;
case EP0_STATE_GD_CFG_3:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+24, 8); // EP0_PKT_SIZE WrPktEp0((UINT8 *)&descEndpt0+6, 1); WrPktEp0((UINT8 *)&descEndpt1+0, 7);
g_uEp0State = EP0_STATE_GD_CFG_4;
break;
case EP0_STATE_GD_CFG_4:
Outp32(BYTE_WRITE_CNT_REG, 0);
g_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:CONFIGURATION ONLY===
case EP0_STATE_GD_CFG_ONLY_0:
if (g_eSpeed == 1)
{
//KITLOutputDebugString("[DBG : EP0_STATE_GD_CFG_ONLY] : 9\n");
Outp32(BYTE_WRITE_CNT_REG, 9);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 9); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_INIT;
}
else
{
//KITLOutputDebugString("[DBG : EP0_STATE_GD_CFG_ONLY_0] : 8\n");
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 8); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_GD_CFG_ONLY_1;
}
break;
case EP0_STATE_GD_CFG_ONLY_1:
//KITLOutputDebugString("[DBG : EP0_STATE_GD_CFG_ONLY_1]\n");
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oDesc.oDescConfig+8, 1); // EP0_PKT_SIZE
g_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:INTERFACE ONLY===
case EP0_STATE_GD_IF_ONLY_0:
if (g_eSpeed == 1)
{
Outp32(BYTE_WRITE_CNT_REG, 9); // INTERFACE_DESC_SIZE
WrPktEp0((UINT8 *)&oDesc.oDescInterface+0, 9);
g_uEp0State = EP0_STATE_INIT;
}
else
{
Outp32(BYTE_WRITE_CNT_REG, 8); // INTERFACE_DESC_SIZE
WrPktEp0((UINT8 *)&oDesc.oDescInterface+0, 8);
g_uEp0State = EP0_STATE_GD_IF_ONLY_1;
}
break;
case EP0_STATE_GD_IF_ONLY_1:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oDesc.oDescInterface+8, 1);
g_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:ENDPOINT 1 ONLY===
case EP0_STATE_GD_EP0_ONLY_0:
Outp32(BYTE_WRITE_CNT_REG, ENDPOINT_DESC_SIZE);
Inp32(SYS_STATUS_REG, usSysStatus);
WrPktEp0((UINT8 *)&oDesc.oDescEndpt1+0, ENDPOINT_DESC_SIZE);
g_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:ENDPOINT 2 ONLY===
case EP0_STATE_GD_EP1_ONLY_0:
Outp32(BYTE_WRITE_CNT_REG, ENDPOINT_DESC_SIZE);
Inp32(SYS_STATUS_REG, usSysStatus);
WrPktEp0((UINT8 *)&oDesc.oDescEndpt3+0, ENDPOINT_DESC_SIZE);
g_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:STRING ===
case EP0_STATE_GD_STR_I0:
Outp32(BYTE_WRITE_CNT_REG, 4);
//KITLOutputDebugString("[GDS0_0]");
WrPktEp0((UINT8 *)aDescStr0, 4);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GD_STR_I1:
//KITLOutputDebugString("[GDS1_%d]", g_uEp0SubState);
if ((g_uEp0SubState*g_uEp0MaxPktSize+g_uEp0MaxPktSize)<sizeof(aDescStr1))
{
Outp32(BYTE_WRITE_CNT_REG, g_uEp0MaxPktSize);
WrPktEp0((UINT8 *)aDescStr1+(g_uEp0SubState*g_uEp0MaxPktSize), g_uEp0MaxPktSize);
g_uEp0State = EP0_STATE_GD_STR_I1;
g_uEp0SubState++;
}
else
{
Outp32(BYTE_WRITE_CNT_REG, sizeof(aDescStr1)-(g_uEp0SubState*g_uEp0MaxPktSize));
WrPktEp0((UINT8 *)aDescStr1+(g_uEp0SubState*g_uEp0MaxPktSize), sizeof(aDescStr1)-(g_uEp0SubState*g_uEp0MaxPktSize));
g_uEp0State = EP0_STATE_INIT;
g_uEp0SubState = 0;
}
break;
case EP0_STATE_GD_STR_I2:
//KITLOutputDebugString("[GDS2_%d]", g_uEp0SubState);
if ((g_uEp0SubState*g_uEp0MaxPktSize+g_uEp0MaxPktSize)<sizeof(aDescStr2))
{
Outp32(BYTE_WRITE_CNT_REG, g_uEp0MaxPktSize);
WrPktEp0((UINT8 *)aDescStr2+(g_uEp0SubState*g_uEp0MaxPktSize), g_uEp0MaxPktSize);
g_uEp0State = EP0_STATE_GD_STR_I2;
g_uEp0SubState++;
}
else
{
//KITLOutputDebugString("[E]");
Outp32(BYTE_WRITE_CNT_REG, sizeof(aDescStr2)-(g_uEp0SubState*g_uEp0MaxPktSize));
WrPktEp0((UINT8 *)aDescStr2+(g_uEp0SubState*g_uEp0MaxPktSize), sizeof(aDescStr2)-(g_uEp0SubState*g_uEp0MaxPktSize));
g_uEp0State = EP0_STATE_INIT;
g_uEp0SubState = 0;
}
break;
case EP0_STATE_GD_DEV_QUALIFIER:
Outp32(BYTE_WRITE_CNT_REG, 10);
WrPktEp0((UINT8 *)aDeviceQualifierDescriptor+0, 10);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_INTERFACE_GET:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oInterfaceGet+0, 1);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_GET_STATUS0:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oStatusGet+0, 1);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_GET_STATUS1:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oStatusGet+1, 1);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_GET_STATUS2:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oStatusGet+2, 1);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_GET_STATUS3:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oStatusGet+3, 1);
g_uEp0State = EP0_STATE_INIT;
break;
case EP0_GET_STATUS4:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((UINT8 *)&oStatusGet+4, 1);
g_uEp0State = EP0_STATE_INIT;
break;
default:
break;
}
//KITLOutputDebugString ("[-]TransferEp0\n");
}
void HandleEvent_EP0(void)
{
UINT32 DeviceRequestLength;
UINT16 ep0csr;
UINT16 ReadCnt, i;
UINT16 ReadBuf[64]={0x0000, };
UINT8 setaddress;
UINT32 uRemoteWakeUp=0;
UINT16 usConfig=0;
Outp32(INDEX_REG, EP0);
Inp32(EP0_STATUS_REG, ep0csr);
//KITLOutputDebugString ("[+]HandleEvent_EP0 : %x\n",ep0csr);
// EP0 CSR register status check
if (ep0csr & EP0_SENT_STALL) // SENT STALL : protocol stall.
{
//KITLOutputDebugString(" Sent Stall \n");
Outp32(EP0_STATUS_REG, EP0_SENT_STALL);
if (ep0csr & EP0_RX_SUCCESS)
Outp32(EP0_STATUS_REG, EP0_RX_SUCCESS);
g_uEp0State = EP0_STATE_INIT;
return;
}
if (ep0csr & EP0_TX_SUCCESS)
{
//KITLOutputDebugString(" EP0_TX_SUCCESS \n");
Outp32(EP0_STATUS_REG, EP0_TX_SUCCESS);
}
// if ((ep0csr & EP0_RX_SUCCESS) & (g_uEp0State == EP0_STATE_INIT))
if (g_uEp0State == EP0_STATE_INIT)
{
Inp32(BYTE_READ_CNT_REG, ReadCnt);
for(i=0;i<4;i++) Inp32(EP0_FIFO, ReadBuf[i]);
//KITLOutputDebugString("ReadCnt : %d\n",ReadCnt);
Outp32(EP0_STATUS_REG, EP0_RX_SUCCESS);
g_oDeviceRequest.bmRequestType=(UINT8)ReadBuf[0];
g_oDeviceRequest.bRequest=ReadBuf[0]>>8;
g_oDeviceRequest.wValue_L=(UINT8)ReadBuf[1];
g_oDeviceRequest.wValue_H=ReadBuf[1]>>8;
g_oDeviceRequest.wIndex_L=(UINT8)ReadBuf[2];
g_oDeviceRequest.wIndex_H=ReadBuf[2]>>8;
g_oDeviceRequest.wLength_L=(UINT8)ReadBuf[3];
g_oDeviceRequest.wLength_H=ReadBuf[3]>>8;
// PrintEp0Pkt((UINT8 *)&g_oDeviceRequest, 8);
//////////////////////////////////////////
/* Decode and execute the command. We support two sets of commands, vendor
* specific (modem control) and chapter 9 standard commands.
*/
if (g_oDeviceRequest.bmRequestType & 0x60 )
{
/*
KITLOutputDebugString("readcnt : %d,bmRequest: %x bRequest: %x wValue: %x wIndex: %x wLength: %x\n",
ReadCnt,
g_oDeviceRequest.bmRequestType,
g_oDeviceRequest.bRequest,
g_oDeviceRequest.wValue_L,
g_oDeviceRequest.wIndex_L,
g_oDeviceRequest.wLength_L);
if(ReadCnt ==0) return;
*/
// vendor or class command
// //KITLOutputDebugString("Vendor/Class Command !!\n");
//KITLOutputDebugString("Vendor/Class Command : bmRequestType : %x!!\n",g_oDeviceRequest.bmRequestType);
//KITLOutputDebugString("Vendor/Class Command : bRequest : %x !!\n",g_oDeviceRequest.bRequest);
switch ( g_oDeviceRequest.bRequest)
{
case ( SET_CONTROL_LINE_STATE ) :
{
/* Host is notifying us of control line state.
* wValue contains bitmask
* 0 - DTR
* 1 - RTS
*/
//KITLOutputDebugString("SET_CONTROL_LINE_STATE, H:%X,L:%X \r\n",g_oDeviceRequest.wValue_H, g_oDeviceRequest.wValue_L);
if ( g_oDeviceRequest.wValue_L & 0x01 )
USBSerInfo.dwModemStatus |= (MS_DSR_ON|MS_RLSD_ON); // DTR active, set DSR/RLSD
else
USBSerInfo.dwModemStatus &= ~(MS_DSR_ON|MS_RLSD_ON); // DTR clear, clr DSR/RLSD
if ( g_oDeviceRequest.wValue_L & 0x02 )
USBSerInfo.dwModemStatus |= MS_CTS_ON; // RTS active, set CTS
else
USBSerInfo.dwModemStatus &= ~MS_CTS_ON; // RTS clear, clear CTS
if (USBSerInfo.dwModemStatus != 0 )
{
USBSerInfo.dwState = KITLUSBSER_STATE_CONNECTED;
//KITLOutputDebugString("\n KITLUSBSER_STATE_CONNECTED \n");
}
else
{
USBSerInfo.dwState = KITLUSBSER_STATE_CONFIGURED;
//KITLOutputDebugString("\n KITLUSBSER_STATE_CONFIGURED \n");
}
/* Command is complete
*/
// sendDone(0);
}
break;
default:
{
// Unknown vendor/class request
//KITLOutputDebugString("Unknown vendor/class request %X\r\n",g_oDeviceRequest.bRequest);
}
}
return;
}
////////////////////////
///
switch (g_oDeviceRequest.bRequest)
{
case STANDARD_SET_ADDRESS:
setaddress = (g_oDeviceRequest.wValue_L); // Set Address Update bit
//KITLOutputDebugString("Func_ADDR_Setaddr : %d \n", setaddress);
g_uEp0State = EP0_STATE_INIT;
break;
case STANDARD_SET_DESCRIPTOR:
//KITLOutputDebugString("\n MCU >> Set Descriptor \n");
break;
case STANDARD_SET_CONFIGURATION:
//KITLOutputDebugString("MCU >> Set Configuration \n");
usConfig = g_oDeviceRequest.wValue_L; // Configuration value in configuration descriptor
USBSerInfo.dwState = KITLUSBSER_STATE_CONFIGURED;
break;
case STANDARD_GET_CONFIGURATION:
//KITLOutputDebugString("MCU >> Get Configruation \n");
Outp32(BYTE_WRITE_CNT_REG, 1);
Outp32(EP0_FIFO, usConfig);
m_uEnumerationDone = TRUE;
break;
case STANDARD_GET_DESCRIPTOR:
switch (g_oDeviceRequest.wValue_H)
{
case DEVICE_DESCRIPTOR:
//KITLOutputDebugString("MCU >> Get Device Descriptor \n");
g_uEp0State = EP0_STATE_GD_DEV_0;
break;
case CONFIGURATION_DESCRIPTOR:
//KITLOutputDebugString("MCU >> Get Configuration Descriptor \n");
DeviceRequestLength = (UINT32)((g_oDeviceRequest.wLength_H << 8) |
g_oDeviceRequest.wLength_L);
if (DeviceRequestLength > CONFIG_DESC_SIZE){
// === GET_DESCRIPTOR:CONFIGURATION+INTERFACE+ENDPOINT0+ENDPOINT1 ===
// Windows98 gets these 4 descriptors all together by issuing only a request.
// Windows2000 gets each descriptor seperately.
// m_uEpZeroTransferLength = CONFIG_DESC_TOTAL_SIZE;
// m_uEpZeroTransferdata = 0;
g_uEp0State = EP0_STATE_GD_CFG_0;
}
else
g_uEp0State = EP0_STATE_GD_CFG_ONLY_0; // for win2k
break;
case STRING_DESCRIPTOR :
switch(g_oDeviceRequest.wValue_L)
{
case 0:
g_uEp0State = EP0_STATE_GD_STR_I0;
break;
case 1:
g_uEp0State = EP0_STATE_GD_STR_I1;
break;
case 2:
g_uEp0State = EP0_STATE_GD_STR_I2;
break;
default:
break;
}
break;
case ENDPOINT_DESCRIPTOR:
switch(g_oDeviceRequest.wValue_L&0xf)
{
case 0:
g_uEp0State=EP0_STATE_GD_EP0_ONLY_0;
break;
case 1:
g_uEp0State=EP0_STATE_GD_EP1_ONLY_0;
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -