📄 usbdev.cpp
字号:
m_poDeviceRequest->bmRequestType=ReadBuf[0];
m_poDeviceRequest->bRequest=ReadBuf[0]>>8;
m_poDeviceRequest->wValue_L=ReadBuf[1];
m_poDeviceRequest->wValue_H=ReadBuf[1]>>8;
m_poDeviceRequest->wIndex_L=ReadBuf[2];
m_poDeviceRequest->wIndex_H=ReadBuf[2]>>8;
m_poDeviceRequest->wLength_L=ReadBuf[3];
m_poDeviceRequest->wLength_H=ReadBuf[3]>>8;
PrintEp0Pkt((U8 *)m_poDeviceRequest, 8);
switch (m_poDeviceRequest->bRequest)
{
case STANDARD_SET_ADDRESS:
setaddress = (m_poDeviceRequest->wValue_L); // Set Address Update bit
DbgUsb(("Func_ADDR_Setaddr : %d \n", setaddress));
m_uEp0State = EP0_STATE_INIT;
break;
case STANDARD_SET_DESCRIPTOR:
DbgUsb(("\n MCU >> Set Descriptor \n"));
break;
case STANDARD_SET_CONFIGURATION:
DbgUsb(("\n MCU >> Set Configuration \n"));
usConfig = m_poDeviceRequest->wValue_L; // Configuration value in configuration descriptor
m_uEnumerationDone = 1;
break;
case STANDARD_GET_CONFIGURATION:
// Uart_Printf("\n MCU >> Get Configruation \n");
Outp32(BYTE_WRITE_CNT_REG, 1);
Outp32(EP0_FIFO, usConfig);
break;
case STANDARD_GET_DESCRIPTOR:
switch (m_poDeviceRequest->wValue_H)
{
case DEVICE_DESCRIPTOR:
DbgUsb(("\n MCU >> Get Device Descriptor \n"));
m_uEp0State = EP0_STATE_GD_DEV_0;
break;
case CONFIGURATION_DESCRIPTOR:
DbgUsb(("\n MCU >> Get Configuration Descriptor \n"));
DeviceRequestLength = (U32)((m_poDeviceRequest->wLength_H << 8) |
m_poDeviceRequest->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;
m_uEp0State = EP0_STATE_GD_CFG_0;
}
else
m_uEp0State = EP0_STATE_GD_CFG_ONLY_0; // for win2k
break;
case STRING_DESCRIPTOR :
switch(m_poDeviceRequest->wValue_L)
{
case 0:
m_uEp0State = EP0_STATE_GD_STR_I0;
break;
case 1:
m_uEp0State = EP0_STATE_GD_STR_I1;
break;
case 2:
m_uEp0State = EP0_STATE_GD_STR_I2;
break;
default:
break;
}
break;
case ENDPOINT_DESCRIPTOR:
switch(m_poDeviceRequest->wValue_L&0xf)
{
case 0:
m_uEp0State=EP0_STATE_GD_EP0_ONLY_0;
break;
case 1:
m_uEp0State=EP0_STATE_GD_EP1_ONLY_0;
break;
default:
break;
}
break;
case DEVICE_QUALIFIER:
DbgUsb(("\n MCU >> Get Device Qualifier Descriptor \n"));
m_uEp0State = EP0_STATE_GD_DEV_QUALIFIER;
break;
}
break;
case STANDARD_CLEAR_FEATURE:
DbgUsb(("\n MCU >> Clear Feature \n"));
switch (m_poDeviceRequest->bmRequestType)
{
case DEVICE_RECIPIENT:
if (m_poDeviceRequest->wValue_L == 1)
uRemoteWakeUp = false;
break;
case ENDPOINT_RECIPIENT:
if (m_poDeviceRequest->wValue_L == 0)
{
if ((m_poDeviceRequest->wIndex_L & 0x7f) == 0x00)
m_poStatusGet->Endpoint0= 0;
if ((m_poDeviceRequest->wIndex_L & 0x8f) == 0x01) // IN Endpoint 1
m_poStatusGet->Endpoint1= 0;
if ((m_poDeviceRequest->wIndex_L & 0x8f) == 0x03) // OUT Endpoint 3
m_poStatusGet->Endpoint3= 0;
}
break;
default:
break;
}
m_uEp0State = EP0_STATE_INIT;
break;
case STANDARD_SET_FEATURE:
//test
#define TEST_PKT_SIZE 53
#define TEST_ARR_SIZE 54
U8 ahwTestPkt [TEST_ARR_SIZE] = {
0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
0xAA,0x00, 0xAA,0xAA, 0xAA,0xAA, 0xAA,0xAA,
0xEE,0xAA, 0xEE,0xEE, 0xEE,0xEE, 0xEE,0xEE,
0xFE,0xEE, 0xFF,0xFF, 0xFF,0xFF, 0xFF,0xFF,
0xFF,0xFF, 0xFF,0xFF, 0x7F,0xFF, 0xDF,0xBF,
0xF7,0xEF, 0xFD,0xFB, 0x7E,0xFC, 0xDF,0xBF,
0xF7,0xEF, 0xFD,0xFB, 0x00,0x7E
};
DbgUsb(("\n MCU >> Set Feature \n"));
switch (m_poDeviceRequest->bmRequestType)
{
case DEVICE_RECIPIENT:
if (m_poDeviceRequest->wValue_L == 1)
uRemoteWakeUp = true;
break;
case ENDPOINT_RECIPIENT:
if (m_poDeviceRequest->wValue_L == 0)
{
if ((m_poDeviceRequest->wIndex_L & 0x7f) == 0x00)
m_poStatusGet->Endpoint0= 1;
if ((m_poDeviceRequest->wIndex_L & 0x8f) == 0x01)
m_poStatusGet->Endpoint1= 1;
if ((m_poDeviceRequest->wIndex_L & 0x8f) == 0x03)
m_poStatusGet->Endpoint3= 1;
}
break;
default:
break;
}
//=======================================================
switch (m_poDeviceRequest->wValue_L) {
case EP_STALL:
// TBD: addnl processing if reqd
break;
case TEST_MODE:
U32 tmp;
if ((0 != m_poDeviceRequest->wIndex_L ) ||(0 != m_poDeviceRequest->bmRequestType))
break;
// Set TEST MODE
//output32rTR |= TR_TMD;
Inp32(TEST_REG,tmp);
tmp|=TR_TMD;
Outp32(TEST_REG,TR_TMD);
switch( m_poDeviceRequest->wIndex_H)
{
case TEST_J:
//Set Test J
//rTR |= TR_TJS;
Inp32(TEST_REG,tmp);
tmp|=TR_TJS;
Outp32(TEST_REG,tmp);
break;
case TEST_K:
//Set Test K
//rTR |= TR_TKS;
Inp32(TEST_REG,tmp);
tmp|=TR_TKS;
Outp32(TEST_REG,tmp);
break;
case TEST_SE0_NAK:
//Set Test SE0NAK
//rTR |= TR_TSNS;
Inp32(TEST_REG,tmp);
tmp|=TR_TSNS;
Outp32(TEST_REG,tmp);
break;
case TEST_PACKET:
printf ("Test_packet\n");
Outp32(BYTE_WRITE_CNT_REG, 54);
WrPktEp0(ahwTestPkt, TEST_PKT_SIZE);
// EpxSendData (ahwTestPkt, TEST_PKT_SIZE, EP0);
//rTR |= TR_TPS;
Inp32(TEST_REG,tmp);
tmp|=TR_TPS;
Outp32(TEST_REG,tmp);
printf ("tr=%0X\n", tmp);
break;
}
break;
default:
break;
}
//=======================================================
m_uEp0State = EP0_STATE_INIT;
break;
case STANDARD_GET_STATUS:
switch(m_poDeviceRequest->bmRequestType)
{
case (0x80):
m_poStatusGet->Device=((U8)uRemoteWakeUp<<1)|0x1; // SelfPowered
m_uEp0State = EP0_GET_STATUS0;
break;
case (0x81):
m_poStatusGet->Interface=0;
m_uEp0State = EP0_GET_STATUS1;
break;
case (0x82):
if ((m_poDeviceRequest->wIndex_L & 0x7f) == 0x00)
m_uEp0State = EP0_GET_STATUS2;
if ((m_poDeviceRequest->wIndex_L & 0x8f) == 0x01)
m_uEp0State = EP0_GET_STATUS3;
if ((m_poDeviceRequest->wIndex_L & 0x8f) == 0x03)
m_uEp0State = EP0_GET_STATUS4;
break;
default:
break;
}
break;
case STANDARD_GET_INTERFACE:
m_uEp0State = EP0_INTERFACE_GET;
break;
case STANDARD_SET_INTERFACE:
m_poInterfaceGet->AlternateSetting= m_poDeviceRequest->wValue_L;
m_uEp0State = EP0_STATE_INIT;
break;
case STANDARD_SYNCH_FRAME:
m_uEp0State = EP0_STATE_INIT;
break;
default:
break;
}
}
TransferEp0();
}
// Not Supporting About Set Descriptor for USB Standard
void USBDEV::StandardSetDescriptor(void)
{
// CLR_EP0_CSR_OUT_PACKET_READY;
}
// ======================================================================
// TransferEp0()
//
// This is function for Control Transfer Transmit.
// ======================================================================
void USBDEV::TransferEp0(void)
{
U32 i;
U32 dataLength;
U16 usSysStatus;
// CLR_EP0_CSR_OUT_PACKET_READY;
switch (m_uEp0State)
{
case EP0_STATE_INIT:
break;
// === GET_DESCRIPTOR:DEVICE ===
case EP0_STATE_GD_DEV_0:
if (m_eSpeed == 1)
{
Outp32(BYTE_WRITE_CNT_REG, 18);
WrPktEp0((U8 *)m_poDescDevice+0, 18); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_INIT;
DbgUsb(("EndpointZeroTransfer(EP0_STATE_GD_DEV)\n"));
}
else
{
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)m_poDescDevice+0, 8); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_GD_DEV_1;
DbgUsb(("EndpointZeroTransfer(EP0_STATE_GD_DEV_0)\n"));
}
break;
case EP0_STATE_GD_DEV_1:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)m_poDescDevice+8, 8); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_GD_DEV_2;
DbgUsb(("EndpointZeroTransfer(EP0_STATE_GD_DEV_1)\n"));
break;
case EP0_STATE_GD_DEV_2:
Outp32(BYTE_WRITE_CNT_REG, 2);
WrPktEp0((U8 *)m_poDescDevice+16, 2); // EP0_PKT_SIZE
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 (m_eSpeed == 1)
{
Outp32(BYTE_WRITE_CNT_REG, 32);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+0, 32); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_INIT;
DbgUsb(("EndpointZeroTransfer(EP0_STATE_GD_CFG)\n"));
}
else
{
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+0, 8); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_GD_CFG_1;
DbgUsb(("EndpointZeroTransfer(EP0_STATE_GD_CFG_0)\n"));
}
break;
case EP0_STATE_GD_CFG_1:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+8, 8); // EP0_PKT_SIZE WrPktEp0((U8 *)&descConf+8, 1); WrPktEp0((U8 *)&descIf+0, 7);
m_uEp0State = EP0_STATE_GD_CFG_2;
break;
case EP0_STATE_GD_CFG_2:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+16, 8); // EP0_PKT_SIZE WrPktEp0((U8 *)&descIf+7, 2); WrPktEp0((U8 *)&descEndpt0+0, 6);
m_uEp0State = EP0_STATE_GD_CFG_3;
break;
case EP0_STATE_GD_CFG_3:
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+24, 8); // EP0_PKT_SIZE WrPktEp0((U8 *)&descEndpt0+6, 1); WrPktEp0((U8 *)&descEndpt1+0, 7);
m_uEp0State = EP0_STATE_GD_CFG_4;
break;
case EP0_STATE_GD_CFG_4:
Outp32(BYTE_WRITE_CNT_REG, 0);
m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:CONFIGURATION ONLY===
case EP0_STATE_GD_CFG_ONLY_0:
if (m_eSpeed == 1)
{
DbgUsb(("[DBG : EP0_STATE_GD_CFG_ONLY]\n"));
Outp32(BYTE_WRITE_CNT_REG, 9);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+0, 9); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_INIT;
}
else
{
DbgUsb(("[DBG : EP0_STATE_GD_CFG_ONLY_0]\n"));
Outp32(BYTE_WRITE_CNT_REG, 8);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+0, 8); // EP0_PKT_SIZE
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(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((U8 *)&m_poDesc->oDescConfig+8, 1); // EP0_PKT_SIZE
m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:INTERFACE ONLY===
case EP0_STATE_GD_IF_ONLY_0:
if (m_eSpeed == 1)
{
Outp32(BYTE_WRITE_CNT_REG, 9); // INTERFACE_DESC_SIZE
WrPktEp0((U8 *)&m_poDesc->oDescInterface+0, 9);
m_uEp0State = EP0_STATE_INIT;
}
else
{
Outp32(BYTE_WRITE_CNT_REG, 8); // INTERFACE_DESC_SIZE
WrPktEp0((U8 *)&m_poDesc->oDescInterface+0, 8);
m_uEp0State = EP0_STATE_GD_IF_ONLY_1;
}
break;
case EP0_STATE_GD_IF_ONLY_1:
Outp32(BYTE_WRITE_CNT_REG, 1);
WrPktEp0((U8 *)&m_poDesc->oDescInterface+8, 1);
m_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((U8 *)&m_poDesc->oDescEndpt1+0, ENDPOINT_DESC_SIZE);
m_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((U8 *)&m_poDesc->oDescEndpt3+0, ENDPOINT_DESC_SIZE);
m_uEp0State = EP0_STATE_INIT;
break;
// === GET_DESCRIPTOR:STRING ===
case EP0_STATE_GD_STR_I0:
Outp32(BYTE_WRITE_CNT_REG, 4);
DbgUsb(("[GDS0_0]"));
WrPktEp0((U8 *)aDescStr0, 4);
m_uEp0State = EP0_STATE_INIT;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -