📄 otg_dev.c
字号:
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;
break;
// === GET_DESCRIPTOR:INTERFACE ONLY===
case EP0_STATE_GD_IF_ONLY_0:
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;
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)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
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)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
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)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
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))
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uControlEPMaxPktSize);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)aDescStr1+(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize), oOtgDev.m_uControlEPMaxPktSize);
oOtgDev.m_uEp0State = EP0_STATE_GD_STR_I1;
oOtgDev.m_uEp0SubState++;
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, sizeof(aDescStr1)-(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize));
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)aDescStr1+(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize), sizeof(aDescStr1)-(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize));
oOtgDev.m_uEp0State = EP0_STATE_INIT;
oOtgDev.m_uEp0SubState = 0;
}
break;
case EP0_STATE_GD_STR_I2:
DbgUsb("[GDS2_%d]", oOtgDev.m_uEp0SubState);
if ((oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize+oOtgDev.m_uControlEPMaxPktSize)<sizeof(aDescStr2))
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uControlEPMaxPktSize);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)aDescStr2+(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize), oOtgDev.m_uControlEPMaxPktSize);
oOtgDev.m_uEp0State = EP0_STATE_GD_STR_I2;
oOtgDev.m_uEp0SubState++;
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, sizeof(aDescStr2)-(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize));
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
DbgUsb("[E]");
OTGDEV_WrPktEp0((u8 *)aDescStr2+(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize), sizeof(aDescStr2)-(oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize));
oOtgDev.m_uEp0State = EP0_STATE_INIT;
oOtgDev.m_uEp0SubState = 0;
}
break;
case EP0_STATE_CONFIGURATION_GET:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
Outp32(EP0_FIFO, g_usConfig);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_INTERFACE_GET:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)&oInterfaceGet+0, 1);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GET_STATUS0:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)&oStatusGet+0, 1);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GET_STATUS1:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)&oStatusGet+1, 1);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GET_STATUS2:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)&oStatusGet+2, 1);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GET_STATUS3:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)&oStatusGet+3, 1);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_GET_STATUS4:
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0((u8 *)&oStatusGet+4, 1);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case EP0_STATE_TEST_MODE:
switch(oOtgDev.m_oDeviceRequest.wIndex_H)
{
u32 uTemp;
case TEST_J:
//Set Test J
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 0);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
Disp ("Test_J\n");
uTemp = Inp32(DCTL);
uTemp = uTemp & ~(TEST_CONTROL_FIELD) | (TEST_J_MODE);
Outp32(DCTL,uTemp);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case TEST_K:
//Set Test K
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 0);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
Disp ("Test_K\n");
uTemp = Inp32(DCTL);
uTemp = uTemp & ~(TEST_CONTROL_FIELD) | (TEST_K_MODE);
Outp32(DCTL,uTemp);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case TEST_SE0_NAK:
//Set Test SE0_NAK
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 0);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
Disp ("Test_SE0_NAK\n");
uTemp = Inp32(DCTL);
uTemp = uTemp & ~(TEST_CONTROL_FIELD) | (TEST_SE0_NAK_MODE);
Outp32(DCTL,uTemp);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case TEST_PACKET:
//Set Test Packet
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 0);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, TEST_PKT_SIZE);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
OTGDEV_WrPktEp0(TestPkt, TEST_PKT_SIZE);
Disp ("Test_Packet\n");
uTemp = Inp32(DCTL);
uTemp = uTemp & ~(TEST_CONTROL_FIELD) | (TEST_PACKET_MODE);
Outp32(DCTL,uTemp);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
case TEST_FORCE_ENABLE:
//Set Test Force Enable
OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 0);
Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0)); //ep0 enable, clear nak, next ep0, 64byte
Disp ("Test_Force_Enable\n");
uTemp = Inp32(DCTL);
uTemp = uTemp & ~(TEST_CONTROL_FIELD) | (TEST_FORCE_ENABLE_MODE);
Outp32(DCTL,uTemp);
oOtgDev.m_uEp0State = EP0_STATE_INIT;
break;
}
default:
break;
}
}
//////////
// Function Name : OTGDEV_HandleEvent_BulkIn
// Function Desctiption : This function handles bulk in transfer in CPU mode.
// Input : NONE
// Output : NONE
// Version :
void OTGDEV_HandleEvent_BulkIn(void)
{
u8* BulkInBuf;
u32 uRemainCnt;
DbgUsb("CPU_MODE Bulk In Function\n");
// Delay(1);
BulkInBuf = oOtgDev.m_pUpPt;
uRemainCnt = oOtgDev.m_uUploadSize- ((u32)oOtgDev.m_pUpPt - oOtgDev.m_uUploadAddr);
if (uRemainCnt > oOtgDev.m_uBulkInEPMaxPktSize)
{
g_usUploadPktLength = oOtgDev.m_uBulkInEPMaxPktSize;
OTGDEV_SetInEpXferSize(EP_TYPE_BULK, 1, g_usUploadPktLength);
Outp32(bulkIn_DIEPCTL, 1u<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkInEPMaxPktSize<<0); //ep3 enable, clear nak, bulk, usb active, next ep3, max pkt 64
OTGDEV_WrPktBulkInEp(BulkInBuf, g_usUploadPktLength);
}
else if(uRemainCnt > 0)
{
g_usUploadPktLength = uRemainCnt;
OTGDEV_SetInEpXferSize(EP_TYPE_BULK, 1, g_usUploadPktLength);
Outp32(bulkIn_DIEPCTL, 1u<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkInEPMaxPktSize<<0); //ep3 enable, clear nak, bulk, usb active, next ep3, max pkt 64
OTGDEV_WrPktBulkInEp(BulkInBuf, g_usUploadPktLength);
}
else
{
g_usUploadPktLength = 0;
}
}
//////////
// Function Name : OTGDEV_HandleEvent_BulkOut
// Function Desctiption : This function handles bulk out transfer.
// Input : NONE
// Output : NONE
// Version :
void OTGDEV_HandleEvent_BulkOut(u32 fifoCntByte)
{
u8 TempBuf[16];
u32 uCheck;
if (oOtgDev.m_uDownloadFileSize==0)
{
if (fifoCntByte == 10)
{
OTGDEV_RdPktBulkOutEp((u8 *)TempBuf, 10);
uCheck = *((u8 *)(TempBuf+8)) + (*((u8 *)(TempBuf+9))<<8);
if (uCheck==0x1)
{
oOtgDev.m_uUploadAddr =
*((u8 *)(TempBuf+0))+
(*((u8 *)(TempBuf+1))<<8)+
(*((u8 *)(TempBuf+2))<<16)+
(*((u8 *)(TempBuf+3))<<24);
oOtgDev.m_uUploadSize =
*((u8 *)(TempBuf+4))+
(*((u8 *)(TempBuf+5))<<8)+
(*((u8 *)(TempBuf+6))<<16)+
(*((u8 *)(TempBuf+7))<<24);
oOtgDev.m_pUpPt=(u8 *)oOtgDev.m_uUploadAddr;
DbgUsb("UploadAddress : 0x%x, UploadSize: %d\n", oOtgDev.m_uUploadAddr, oOtgDev.m_uUploadSize);
if (oOtgDev.m_eOpMode == USB_DMA)
{
if (oOtgDev.m_uUploadSize>0)
{
u32 uPktCnt, uRemainder;
DbgUsb("Dma Start for IN PKT \n");
Outp32(GAHBCFG, MODE_DMA|BURST_INCR4|GBL_INT_UNMASK);
Outp32(GINTMSK, INT_RESUME|INT_OUT_EP|INT_IN_EP|INT_ENUMDONE|INT_RESET|INT_SUSPEND); //gint unmask
Outp32(bulkIn_DIEPDMA, (u32)oOtgDev.m_pUpPt);
uPktCnt = (u32)(oOtgDev.m_uUploadSize/oOtgDev.m_uBulkInEPMaxPktSize);
uRemainder = (u32)(oOtgDev.m_uUploadSize%oOtgDev.m_uBulkInEPMaxPktSize);
if(uRemainder != 0)
{
uPktCnt += 1;
}
if (uPktCnt > 1023)
{
OTGDEV_SetInEpXferSize(EP_TYPE_BULK, 1023, (oOtgDev.m_uBulkInEPMaxPktSize*1023));
}
else
{
OTGDEV_SetInEpXferSize(EP_TYPE_BULK, uPktCnt, oOtgDev.m_uUploadSize);
}
Outp32(bulkIn_DIEPCTL, 1u<<31|1<<26|2<<18|1<<15|BULK_IN_EP<<11|oOtgDev.m_uBulkInEPMaxPktSize<<0); //ep1 enable, clear nak, bulk, usb active, next ep1, max pkt
}
}
else //CPU_MODE
{
OTGDEV_HandleEvent_BulkIn();
}
}
oOtgDev.m_uDownloadFileSize=0;
return;
}
else
{
OTGDEV_RdPktBulkOutEp((u8 *)TempBuf, 8);
DbgUsb("downloadFileSize==0, 1'st BYTE_READ_CNT_REG : %x\n", fifoCntByte);
if(download_run==true)
{
oOtgDev.m_uDownloadAddress=
*((u8 *)(TempBuf+0))+
(*((u8 *)(TempBuf+1))<<8)+
(*((u8 *)(TempBuf+2))<<16)+
(*((u8 *)(TempBuf+3))<<24);
}
else
{
oOtgDev.m_uDownloadAddress=tempDownloadAddress;
}
oOtgDev.m_uDownloadFileSize=
*((u8 *)(TempBuf+4))+
(*((u8 *)(TempBuf+5))<<8)+
(*((u8 *)(TempBuf+6))<<16)+
(*((u8 *)(TempBuf+7))<<24);
oOtgDev.m_pDownPt=(u8 *)oOtgDev.m_uDownloadAddress;
DbgUsb("downloadAddress : 0x%x, downloadFileSize: %d\n", oOtgDev.m_uDownloadAddress, oOtgDev.m_uDownloadFileSize);
OTGDEV_RdPktBulkOutEp((u8 *)oOtgDev.m_pDownPt, fifoCntByte-8); // The first 8-bytes are deleted.
oOtgDev.m_pDownPt += fifoCntByte-8;
if (oOtgDev.m_eOpMode == USB_CPU)
{
OTGDEV_SetOutEpXferSize(EP_TYPE_BULK, 1, oOtgDev.m_uBulkOutEPMaxPktSize);
Outp32(bulkOut_DOEPCTL, 1u<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkOutEPMaxPktSize<<0); //ep3 enable, clear nak, bulk, usb active, next ep3, max pkt 64
}
else
{
if (oOtgDev.m_uDownloadFileSize>oOtgDev.m_uBulkOutEPMaxPktSize)
{
u32 uPktCnt, uRemainder;
DbgUsb("downloadFileSize!=0, Dma Start for 2nd OUT PKT \n");
Outp32(GINTMSK, INT_RESUME|INT_OUT_EP|INT_IN_EP|INT_ENUMDONE|INT_RESET|INT_SUSPEND); //gint unmask
Outp32(GAHBCFG, MODE_DMA|BURST_INCR4|GBL_INT_UNMASK);
Outp32(bulkOut_DOEPDMA, (u32)oOtgDev.m_pDownPt);
uPktCnt = (u32)(oOtgDev.m_uDownloadFileSize-oOtgDev.m_uBulkOutEPMaxPktSize)/oOtgDev.m_uBulkOutEPMaxPktSize;
uRemainder = (u32)((oOtgDev.m_uDownloadFileSize-oOtgDev.m_uBulkOutEPMaxPktSize)%oOtgDev.m_uBulkOutEPMaxPktSize);
if(uRemainder != 0)
{
uPktCnt += 1;
}
if (uPktCnt > 1023)
{
OTGDEV_SetOutEpXferSize(EP_TYPE_BULK, 1023, (oOtgDev.m_uBulkOutEPMaxPktSize*1023));
}
else
{
OTGDEV_SetOutEpXferSize(EP_TYPE_BULK, uPktCnt, (oOtgDev.m_uDownloadFileSize-oOtgDev.m_uBulkOutEPMaxPktSize));
}
Outp32(bulkOut_DOEPCTL, 1u<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkOutEPMaxPktSize<<0); //ep3 enable, clear nak, bulk, usb active, next ep3, max pkt 64
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -