📄 usb.c
字号:
DbgPrintf( "GT_EP0\n" );
pBuffer = ( U8 * )&DescriptorEndpoint_0;
uSize = sizeof( DescriptorEndpoint_0 );
uPos = 0;
rEP0_CSR |= BIT_EP0_CSR_SERVICED_OUT_PKT_RDY;
break;
case 1:
DbgPrintf( "GT_EP1\n" );
pBuffer = ( U8 * )&DescriptorEndpoint_1;
uSize = sizeof( DescriptorEndpoint_1 );
uPos = 0;
rEP0_CSR |= BIT_EP0_CSR_SERVICED_OUT_PKT_RDY;
break;
default:
DbgPrintf( "GT_EP_DEF\n" );
pBuffer = 0;
break;
}
uPos = 0;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
break;
case TYPE_STRING:
DbgPrintf( "GT_ST\n" );
switch( SetupData.bValueL )
{
case 0:
DbgPrintf( "GT_ST0\n" );
pBuffer = ( U8 * )&DescriptorString0;
uSize = sizeof( DescriptorString0 );
uPos = 0;
break;
case 1:
DbgPrintf( "GT_ST1\n" );
pBuffer = ( U8 * )&DescriptorString1;
uSize = sizeof( DescriptorString1 );
uPos = 0;
break;
case 2:
DbgPrintf( "GT_ST2\n" );
pBuffer = ( U8 * )&DescriptorString2;
uSize = sizeof( DescriptorString2 );
uPos = 0;
break;
default:
DbgPrintf( "GT_ST_DEF\n" );
pBuffer = 0;
break;
}
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
break;
default:
DbgPrintf( "GT_DF\x0d\x0a" );
pBuffer = 0;
break;
}
break;
case SET_ADDRESS:
DbgPrintf( "ST_AD, %d\n", SetupData.bValueL );
rFUNC_ADDR_REG = SetupData.bValueL | 0x80;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
pBuffer = 0;
break;
case SET_CONFIGURATION:
DbgPrintf( "ST_CF\n" );
ConfiguratioSet = SetupData.bValueL;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
pBuffer = 0;
break;
///////////////////////////////////////////////////////////////////////////////////
case SET_DESCRIPTOR:
DbgPrintf( "ST_DE\n" );
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
pBuffer = 0;
break;
case GET_CONFIGURATION:
DbgPrintf( "GT_CF\n" );
pBuffer = ( U8 * )&ConfiguratioSet;
uSize = sizeof( ConfiguratioSet );
uPos = 0;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
break;
case SET_INTERFACE:
DbgPrintf( "ST_IF\n" );
InterfaceSet = SetupData.bValueL;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
pBuffer = 0;
break;
case GET_INTERFACE:
DbgPrintf( "GT_IF\n" );
pBuffer = ( U8 * )&InterfaceSet;
uSize = sizeof( InterfaceSet );
uPos = 0;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
break;
case SET_FEATURE:
DbgPrintf("ST_FT\n");
switch( SetupData.bmRequestType )
{
case RECIPIENT_DEVICE:
if ( SetupData.bValueL == 1 );
//Rwuen = TRUE;
break;
case RECIPIENT_ENDPOINT:
if ( SetupData.bValueL == 0)
{
if( ( SetupData.bIndexL & 0x7F ) == 0x00 )
{
StatusGet.Endpoint0 = 1;
}
if( ( SetupData.bIndexL & 0x8F ) == 0x81 )
{
StatusGet.Endpoint1 = 1;
}
if( ( SetupData.bIndexL & 0x8F ) == 0x03 )
{
StatusGet.Endpoint3 = 1;
}
}
break;
default:
break;
}
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
pBuffer = 0;
break;
//////////////////////////////////////////////////////////////////////////////////
default:
DbgPrintf( "Req_def\n" );
pBuffer = 0;
break;
}
}
if ( pBuffer !=0 )
{
if ( ( uSize - uPos ) >= EP0_PKT_SIZE )
{
USBD_WriteFIFO( pBuffer, &rEP0_FIFO, EP0_PKT_SIZE );
pBuffer += EP0_PKT_SIZE;
uPos += EP0_PKT_SIZE;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_IN_PKT_RDY );
DbgPrintf("if\x0d\x0a");
}
else
{
USBD_WriteFIFO( pBuffer, &rEP0_FIFO, uSize - uPos );
pBuffer = 0;
uPos = 0;
rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS )
| BIT_EP0_IN_PKT_RDY | BIT_EP0_DATA_END );
DbgPrintf("else\x0d\x0a");
}
}
else
{
DbgPrintf("EP0_UD\n");
}
rINDEX_REG = ubakup_rINDEX_REG;
}
void __irq USBDIsr( void )
{
U8 ustatus_EP_INT_REG;
U8 ustatus_USB_INT_REG;
U8 uBakIndexReg;
ustatus_EP_INT_REG = rEP_INT_REG;
ustatus_USB_INT_REG = rUSB_INT_REG;
uBakIndexReg = rINDEX_REG;
if ( ustatus_USB_INT_REG & BIT_USBD_SUSPEND_INT )
{
rUSB_INT_REG = BIT_USBD_SUSPEND_INT;
DbgPrintf( "SUSPEND\n" );
}
if ( ustatus_USB_INT_REG & BIT_USBD_RESUME_INT )
{
rUSB_INT_REG = BIT_USBD_RESUME_INT;
DbgPrintf( "RESUME\n" );
}
if ( ustatus_USB_INT_REG & BIT_USBD_RESET_INT )
{
ResetUsbdReg();
rUSB_INT_REG = BIT_USBD_RESET_INT;
DbgPrintf( "RESET\n" );
}
if ( ustatus_EP_INT_REG & BIT_USBD_EP0_INT )
{
rEP_INT_REG = BIT_USBD_EP0_INT;
Handler_Ep0();
}
if ( ustatus_EP_INT_REG & BIT_USBD_EP1_INT )
{
rEP_INT_REG = BIT_USBD_EP1_INT;
Handler_Ep1();
DbgPrintf( "EP1\n" );
}
if ( ustatus_EP_INT_REG & BIT_USBD_EP2_INT )
{
rEP_INT_REG = BIT_USBD_EP2_INT;
DbgPrintf( "EP2\n" );
}
if ( ustatus_EP_INT_REG & BIT_USBD_EP3_INT )
{
rEP_INT_REG = BIT_USBD_EP3_INT;
Handler_Ep3();
//DbgPrintf( "EP3\n" );
}
if ( ustatus_EP_INT_REG & BIT_USBD_EP4_INT )
{
rEP_INT_REG = BIT_USBD_EP4_INT;
DbgPrintf( "EP4\n" );
}
ClearPending( BIT_USBD );
rINDEX_REG = uBakIndexReg;
}
void __irq IsrDma2( void )
{
DbgPrintf( "DMA\n" );
}
void Handler_Ep1( void )
{
}
void Handler_Ep3( void )
{
U8 ustatus_EP3_OUT_CSR1;
U8 ubakup_rINDEX_REG = rINDEX_REG;
U8 buffTemp[16];
rINDEX_REG = 3;
ustatus_EP3_OUT_CSR1 = rOUT_CSR1_REG;
// exception, host end the control transfer befor DATA_END is set
if ( ustatus_EP3_OUT_CSR1 & BIT_EPOUT1_SENT_STALL )
{
rOUT_CSR1_REG = ( ustatus_EP3_OUT_CSR1 & ~( BIT_EPOUT1_WR_BITS ) &
~( BIT_EPOUT1_SENT_STALL ) );
if ( ustatus_EP3_OUT_CSR1 & BIT_EPOUT1_OUT_PKT_READY )
{
rOUT_CSR1_REG = ( ustatus_EP3_OUT_CSR1 & ~( BIT_EPOUT1_WR_BITS ) &
~( BIT_EPOUT1_OUT_PKT_READY ) );
DbgPrintf("STALL if\n");
}
else
{
DbgPrintf("STALL else\n");
}
}
else if ( ustatus_EP3_OUT_CSR1 & BIT_EPOUT1_OUT_PKT_READY )
{
U8 fifoCount;
fifoCount = rOUT_FIFO_CNT1_REG;
if ( uDownSize == 0 )
{
USBD_ReadFIFO( buffTemp, &rEP3_FIFO, 8);
uDownAddr = buffTemp[0]
+ ( buffTemp[1] << 8 )
+ ( buffTemp[2] << 16 )
+ ( buffTemp[3] << 24 );
uDownSize = buffTemp[4]
+ ( buffTemp[5] << 8 )
+ ( buffTemp[6] << 16 )
+ ( buffTemp[7] << 24 );
pDownAddr = ( U8 * )uDownAddr;
DbgPrintf( "Addr:%X,Size:%X\n", uDownAddr, uDownSize);
uCheckSum = USBD_ReadFIFO_WithChecksumReturn( ( U8 * )pDownAddr,
&rEP3_FIFO, fifoCount - 8 );
pDownAddr += ( fifoCount - 8 );
uTempDownSize = fifoCount;
}
else
{
uCheckSum += USBD_ReadFIFO_WithChecksumReturn( ( U8 * )pDownAddr,
&rEP3_FIFO, fifoCount);
pDownAddr += fifoCount;
uTempDownSize += fifoCount;
if ( uTempDownSize == uDownSize )
{
U16 uChecksumInPacket;
DbgPrintf( "Download Fininshed, Addr:%X,Size:%X\n", uDownAddr, uDownSize);
uChecksumInPacket = *( ( U8 *)( uDownAddr+uDownSize - 8 - 2 ) ) +
( *( ( U8 * )( uDownAddr+uDownSize - 8 - 1 ) ) << 8 );
uChecksumInPacket += ( U8 )( uChecksumInPacket ) + ( U8 )( uChecksumInPacket >> 8 );
if ( uChecksumInPacket == uCheckSum )
{
DbgPrintf( "Checksum is correct! 0x%X\n", uCheckSum );
DownStatus = 1;
}
else
{
DbgPrintf( "Checksum isnot correct! 0x%X, 0x%X\n", uCheckSum, uChecksumInPacket );
DownStatus = 0;
}
}
}
rOUT_CSR1_REG = ( ustatus_EP3_OUT_CSR1 & ~( BIT_EPOUT1_WR_BITS ) &
~( BIT_EPOUT1_OUT_PKT_READY ) );
}
rINDEX_REG = ubakup_rINDEX_REG;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -