📄 ctrlreq.c
字号:
case GD_DEVICE_QUALIFIER:
GD_DeviceQualDscr();
break;
case GD_OTHER_SPEED_CONFIGURATION:
if (!HighSpeed)
{
GD_ConfigDscr();
}
else
{
GD_OtherConfigDscr();
}
break;
default:
USB_STALL_EP0();
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* DR_GETCONFIGURATION
*
* Description: Get configuration
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void DR_GetConfiguration (void)
{
EP0TXDAT = Configuration;
EP0TXCNT = 1;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/
/*
*********************************************************************************************************
* DR_SETCONFIGURATION
*
* Description: Set configuration
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void DR_SetConfiguration (void)
{
Configuration = SetupData[2];
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/
/*
*********************************************************************************************************
* DR_GETINTERFACE
*
* Description: Get interface
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void DR_GetInterface (void)
{
EP0TXDAT = AlternateSetting; // Write data
EP0TXCNT = 1; // Write data length
EP0TXCS = EP0TXCS | bmTX0_EN; // Enable TX
while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/
/*
*********************************************************************************************************
* DR_SETINTERFACE
*
* Description: Set interface
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void DR_SetInterface (void)
{
AlternateSetting = SetupData[2];
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/
/*
*********************************************************************************************************
* GD_DEVICEDSCR
*
* Description: Get device descriptor
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void GD_DeviceDscr (void)
{
BOOLEAN ShortPacket;
INT8U i = 0, j, count, SendSize;
count = SetupData[6];
ShortPacket = FALSE;
if (count > DSCR_DEVICE_LEN)
{
count = DSCR_DEVICE_LEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = DeviceDscr[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
if (ShortPacket && (SendSize == PacketSize))
{
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* GD_DEVICEQUALDSCR
*
* Description: Get device qualifier descriptor
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void GD_DeviceQualDscr (void)
{
BOOLEAN ShortPacket;
INT8U i = 0, j, count, SendSize;
count = SetupData[6];
ShortPacket = FALSE;
if (count > DSCR_DEVICE_QUALIFIER_LEN)
{
count = DSCR_DEVICE_QUALIFIER_LEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = DeviceQualDscr[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
if (ShortPacket && (SendSize == PacketSize))
{
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* GD_CONFIGDSCR
*
* Description: Get config descriptor
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void GD_ConfigDscr (void)
{
BOOLEAN ShortPacket;
INT8U i = 0, j, count, SendSize;
count = SetupData[6];
ShortPacket = FALSE;
if (count > DSCR_CONFIGURATION_TOTALLEN)
{
count = DSCR_CONFIGURATION_TOTALLEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = HighSpeedConfigDscr[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
if (ShortPacket && (SendSize == PacketSize))
{
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* GD_OTHERCONFIGDSCR
*
* Description: Get other configuration descriptor
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void GD_OtherConfigDscr (void)
{
BOOLEAN ShortPacket;
INT8U i = 0, j, count, SendSize;
count = SetupData[6];
ShortPacket = FALSE;
if (count > DSCR_CONFIGURATION_TOTALLEN)
{
count = DSCR_CONFIGURATION_TOTALLEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = FullSpeedConfigDscr[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
if (ShortPacket && (SendSize == PacketSize))
{
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* GD_STRING
*
* Description: Get string
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/
void GD_String (void)
{
BOOLEAN ShortPacket;
INT8U i = 0, j, count, SendSize;
count = SetupData[6];
ShortPacket = FALSE;
switch (SetupData[2])
{
case 0:
if (count > DSCR_STRING0_LEN)
{
count = DSCR_STRING0_LEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = StringDscr0[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
break;
case 1:
if (count > DSCR_STRING1_LEN)
{
count = DSCR_STRING1_LEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = StringDscr1[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
break;
case 2:
if (count > DSCR_STRING2_LEN)
{
count = DSCR_STRING2_LEN;
ShortPacket = TRUE;
}
while (count)
{
if (count < PacketSize)
{
SendSize = count;
}
else
{
SendSize = PacketSize;
}
count = count - SendSize;
for (j = 0; j < SendSize; j++)
{
EP0TXDAT = StringDscr2[i++];
}
EP0TXCNT = SendSize;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
break;
default:
USB_STALL_EP0();
return;
}
if (ShortPacket && (SendSize == PacketSize))
{
EP0TXCNT = 0;
EP0TXCS = EP0TXCS | bmTX0_EN;
while (EP0TXCS & bmTX0_EN);
}
}
/*$PAGE*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -