USB_HostRequest renamed to USB_ControlRequest, entire control request header is now read into USB_ControlRequest in Device mode rather than having the library pass only partially read header data to the application.
The USB_UnhandledControlPacket event has had its parameters removed, in favour of accessing the new USB_ControlRequest structure. The Endpoint control stream functions now correctly send a ZLP to the host when less data than requested is sent.
This commit is contained in:
parent
e5e7eaee7a
commit
d860e9e842
43 changed files with 209 additions and 317 deletions
|
|
@ -131,18 +131,16 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Process General and Audio specific control requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_SetInterface:
|
||||
/* Set Interface is not handled by the library, as its function is application-specific */
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE))
|
||||
{
|
||||
uint16_t wValue = Endpoint_Read_Word_LE();
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
|
||||
if (wValue)
|
||||
if (USB_ControlRequest.wValue)
|
||||
{
|
||||
/* Start audio task */
|
||||
Scheduler_SetTaskMode(USB_Audio_Task, TASK_RUN);
|
||||
|
|
|
|||
|
|
@ -158,18 +158,16 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Process General and Audio specific control requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_SetInterface:
|
||||
/* Set Interface is not handled by the library, as its function is application-specific */
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE))
|
||||
{
|
||||
uint16_t wValue = Endpoint_Read_Word_LE();
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
|
||||
if (wValue)
|
||||
if (USB_ControlRequest.wValue)
|
||||
{
|
||||
/* Start audio task */
|
||||
Scheduler_SetTaskMode(USB_Audio_Task, TASK_RUN);
|
||||
|
|
|
|||
|
|
@ -160,10 +160,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
uint8_t* LineCodingData = (uint8_t*)&LineCoding;
|
||||
|
||||
/* Process CDC specific control requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -177,7 +177,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -191,18 +191,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetControlLineState:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
#if 0
|
||||
/* NOTE: Here you can read in the line state mask from the host, to get the current state of the output handshake
|
||||
lines. The mask is read in from the wValue parameter, and can be masked against the CONTROL_LINE_OUT_* masks
|
||||
to determine the RTS and DTR line states using the following code:
|
||||
lines. The mask is read in from the wValue parameter in USB_ControlRequest, and can be masked against the
|
||||
CONTROL_LINE_OUT_* masks to determine the RTS and DTR line states using the following code:
|
||||
*/
|
||||
|
||||
uint16_t wIndex = Endpoint_Read_Word_LE();
|
||||
|
||||
// Do something with the given line states in wIndex
|
||||
#endif
|
||||
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
|
|||
|
|
@ -198,10 +198,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
LineCodingData = (wIndex == 0) ? (uint8_t*)&LineCoding1 : (uint8_t*)&LineCoding2;
|
||||
|
||||
/* Process CDC specific control requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -215,7 +215,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -229,7 +229,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetControlLineState:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
|
|||
|
|
@ -160,10 +160,10 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Handle HID Class specific requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetReport:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
@ -180,7 +180,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetReport:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
|
|||
|
|
@ -122,33 +122,20 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Handle HID Class specific requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetReport:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
USB_JoystickReport_Data_t JoystickReportData;
|
||||
|
||||
/* Create the next HID report to send to the host */
|
||||
GetNextReport(&JoystickReportData);
|
||||
|
||||
/* Ignore report type and ID number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
/* Ignore unused Interface number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
/* Read in the number of bytes in the report to send to the host */
|
||||
uint16_t wLength = Endpoint_Read_Word_LE();
|
||||
|
||||
/* If trying to send more bytes than exist to the host, clamp the value at the report size */
|
||||
if (wLength > sizeof(JoystickReportData))
|
||||
wLength = sizeof(JoystickReportData);
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Write the report data to the control endpoint */
|
||||
Endpoint_Write_Control_Stream_LE(&JoystickReportData, wLength);
|
||||
Endpoint_Write_Control_Stream_LE(&JoystickReportData, sizeof(JoystickReportData));
|
||||
|
||||
/* Finalize the stream transfer to send the last packet or clear the host abort */
|
||||
Endpoint_ClearOUT();
|
||||
|
|
|
|||
|
|
@ -193,33 +193,20 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Handle HID Class specific requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetReport:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
USB_KeyboardReport_Data_t KeyboardReportData;
|
||||
|
||||
/* Create the next keyboard report for transmission to the host */
|
||||
CreateKeyboardReport(&KeyboardReportData);
|
||||
|
||||
/* Ignore report type and ID number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
/* Ignore unused Interface number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
/* Read in the number of bytes in the report to send to the host */
|
||||
uint16_t wLength = Endpoint_Read_Word_LE();
|
||||
|
||||
/* If trying to send more bytes than exist to the host, clamp the value at the report size */
|
||||
if (wLength > sizeof(KeyboardReportData))
|
||||
wLength = sizeof(KeyboardReportData);
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Write the report data to the control endpoint */
|
||||
Endpoint_Write_Control_Stream_LE(&KeyboardReportData, wLength);
|
||||
Endpoint_Write_Control_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));
|
||||
|
||||
/* Finalize the stream transfer to send the last packet or clear the host abort */
|
||||
Endpoint_ClearOUT();
|
||||
|
|
@ -227,7 +214,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetReport:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
@ -250,7 +237,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_GetProtocol:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
@ -267,15 +254,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetProtocol:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Read in the wValue parameter containing the new protocol mode */
|
||||
uint16_t wValue = Endpoint_Read_Word_LE();
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
|
||||
UsingReportProtocol = (wValue != 0x0000);
|
||||
UsingReportProtocol = (USB_ControlRequest.wValue != 0x0000);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
|
|
@ -284,15 +268,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetIdle:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Read in the wValue parameter containing the idle period */
|
||||
uint16_t wValue = Endpoint_Read_Word_LE();
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Get idle period in MSB */
|
||||
IdleCount = (wValue >> 8);
|
||||
IdleCount = (USB_ControlRequest.wValue >> 8);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
|
|
@ -301,7 +282,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_GetIdle:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
|
|||
|
|
@ -139,17 +139,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
uint8_t ReportSize;
|
||||
|
||||
/* Handle HID Class specific requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetReport:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
uint16_t wIndex = Endpoint_Read_Word_LE();
|
||||
|
||||
/* Determine if it is the mouse or the keyboard data that is being requested */
|
||||
if (!(wIndex))
|
||||
if (!(USB_ControlRequest.wIndex))
|
||||
{
|
||||
ReportData = (uint8_t*)&KeyboardReportData;
|
||||
ReportSize = sizeof(KeyboardReportData);
|
||||
|
|
@ -160,17 +156,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
ReportSize = sizeof(MouseReportData);
|
||||
}
|
||||
|
||||
/* Read in the number of bytes in the report to send to the host */
|
||||
uint16_t wLength = Endpoint_Read_Word_LE();
|
||||
|
||||
/* If trying to send more bytes than exist to the host, clamp the value at the report size */
|
||||
if (wLength > ReportSize)
|
||||
wLength = ReportSize;
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Write the report data to the control endpoint */
|
||||
Endpoint_Write_Control_Stream_LE(ReportData, wLength);
|
||||
Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
|
||||
|
||||
/* Clear the report data afterwards */
|
||||
memset(ReportData, 0, ReportSize);
|
||||
|
|
@ -181,7 +170,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetReport:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
|
|||
|
|
@ -148,10 +148,10 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Process UFI specific control requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_MassStorageReset:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
@ -165,7 +165,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_GetMaxLUN:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
|
|||
|
|
@ -183,33 +183,20 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
/* Handle HID Class specific requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetReport:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
USB_MouseReport_Data_t MouseReportData;
|
||||
|
||||
/* Create the next mouse report for transmission to the host */
|
||||
CreateMouseReport(&MouseReportData);
|
||||
|
||||
/* Ignore report type and ID number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
/* Ignore unused Interface number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
||||
/* Read in the number of bytes in the report to send to the host */
|
||||
uint16_t wLength = Endpoint_Read_Word_LE();
|
||||
|
||||
/* If trying to send more bytes than exist to the host, clamp the value at the report size */
|
||||
if (wLength > sizeof(MouseReportData))
|
||||
wLength = sizeof(MouseReportData);
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Write the report data to the control endpoint */
|
||||
Endpoint_Write_Control_Stream_LE(&MouseReportData, wLength);
|
||||
Endpoint_Write_Control_Stream_LE(&MouseReportData, sizeof(MouseReportData));
|
||||
|
||||
/* Clear the report data afterwards */
|
||||
memset(&MouseReportData, 0, sizeof(MouseReportData));
|
||||
|
|
@ -220,7 +207,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_GetProtocol:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
@ -237,15 +224,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetProtocol:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Read in the wValue parameter containing the new protocol mode */
|
||||
uint16_t wValue = Endpoint_Read_Word_LE();
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
|
||||
UsingReportProtocol = (wValue != 0x0000);
|
||||
UsingReportProtocol = (USB_ControlRequest.wValue != 0x0000);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
|
|
@ -254,15 +238,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetIdle:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Read in the wValue parameter containing the idle period */
|
||||
uint16_t wValue = Endpoint_Read_Word_LE();
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Get idle period in MSB */
|
||||
IdleCount = (wValue >> 8);
|
||||
IdleCount = (USB_ControlRequest.wValue >> 8);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
|
|
@ -271,7 +252,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_GetIdle:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
|
|
|
|||
|
|
@ -150,10 +150,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
uint16_t wLength = Endpoint_Read_Word_LE();
|
||||
|
||||
/* Process RNDIS class commands */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_SendEncapsulatedCommand:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Clear the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -170,7 +170,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_GetEncapsulatedResponse:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Check if a response to the last message is ready */
|
||||
if (!(MessageHeader->MessageLength))
|
||||
|
|
@ -180,15 +180,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
MessageHeader->MessageLength = 1;
|
||||
}
|
||||
|
||||
/* Check if less than the requested number of bytes to transfer */
|
||||
if (MessageHeader->MessageLength < wLength)
|
||||
wLength = MessageHeader->MessageLength;
|
||||
|
||||
/* Clear the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Write the message response data to the endpoint */
|
||||
Endpoint_Write_Control_Stream_LE(RNDISMessageBuffer, wLength);
|
||||
Endpoint_Write_Control_Stream_LE(RNDISMessageBuffer, MessageHeader->MessageLength);
|
||||
|
||||
/* Finalize the stream transfer to send the last packet or clear the host abort */
|
||||
Endpoint_ClearOUT();
|
||||
|
|
|
|||
|
|
@ -153,10 +153,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
uint8_t* LineCodingData = (uint8_t*)&LineCoding;
|
||||
|
||||
/* Process CDC specific control requests */
|
||||
switch (bRequest)
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -170,7 +170,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
@ -187,18 +187,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
|
||||
break;
|
||||
case REQ_SetControlLineState:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
#if 0
|
||||
/* NOTE: Here you can read in the line state mask from the host, to get the current state of the output handshake
|
||||
lines. The mask is read in from the wValue parameter, and can be masked against the CONTROL_LINE_OUT_* masks
|
||||
to determine the RTS and DTR line states using the following code:
|
||||
lines. The mask is read in from the wValue parameter in USB_ControlRequest, and can be masked against the
|
||||
CONTROL_LINE_OUT_* masks to determine the RTS and DTR line states using the following code:
|
||||
*/
|
||||
|
||||
uint16_t wIndex = Endpoint_Read_Word_LE();
|
||||
|
||||
// Do something with the given line states in wIndex
|
||||
#endif
|
||||
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ TASK(USB_CDC_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t Report
|
|||
else
|
||||
{
|
||||
/* Class specific request to send a HID report to the device */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
|
||||
.bRequest = REQ_SetReport,
|
||||
|
|
@ -286,7 +286,7 @@ TASK(USB_HID_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ TASK(USB_Keyboard_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
@ -303,7 +303,7 @@ TASK(USB_Keyboard_Host)
|
|||
}
|
||||
|
||||
/* HID class request to set the keyboard protocol to the Boot Protocol */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
|
||||
.bRequest = REQ_SetProtocol,
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ uint8_t GetHIDReportData(void)
|
|||
/* Create a buffer big enough to hold the entire returned HID report */
|
||||
uint8_t HIDReportData[HIDReportSize];
|
||||
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE),
|
||||
.bRequest = REQ_GetDescriptor,
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ TASK(USB_Keyboard_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ TASK(USB_MassStore_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ static uint8_t MassStore_GetReturnedStatus(void)
|
|||
*/
|
||||
uint8_t MassStore_ClearPipeStall(const uint8_t EndpointNum)
|
||||
{
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),
|
||||
.bRequest = REQ_ClearFeature,
|
||||
|
|
@ -272,7 +272,7 @@ uint8_t MassStore_ClearPipeStall(const uint8_t EndpointNum)
|
|||
*/
|
||||
uint8_t MassStore_MassStorageReset(void)
|
||||
{
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
|
||||
.bRequest = REQ_MassStorageReset,
|
||||
|
|
@ -298,7 +298,7 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
|
|||
{
|
||||
uint8_t ErrorCode;
|
||||
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
|
||||
.bRequest = REQ_GetMaxLUN,
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ TASK(USB_Mouse_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
@ -298,7 +298,7 @@ TASK(USB_Mouse_Host)
|
|||
}
|
||||
|
||||
/* HID class request to set the mouse protocol to the Boot Protocol */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
|
||||
.bRequest = REQ_SetProtocol,
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ uint8_t GetHIDReportData(void)
|
|||
/* Create a buffer big enough to hold the entire returned HID report */
|
||||
uint8_t HIDReportData[HIDReportSize];
|
||||
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE),
|
||||
.bRequest = REQ_GetDescriptor,
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ TASK(USB_Mouse_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
|
|||
|
|
@ -263,7 +263,7 @@ bool SImage_IsEventReceived(void)
|
|||
*/
|
||||
uint8_t SImage_ClearPipeStall(const uint8_t EndpointNum)
|
||||
{
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),
|
||||
.bRequest = REQ_ClearFeature,
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ TASK(USB_SImage_Host)
|
|||
{
|
||||
case HOST_STATE_Addressed:
|
||||
/* Standard request to set the device configuration to configuration 1 */
|
||||
USB_HostRequest = (USB_Host_Request_Header_t)
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
|
||||
.bRequest = REQ_SetConfiguration,
|
||||
|
|
|
|||
|
|
@ -193,8 +193,9 @@ EVENT_HANDLER(USB_DeviceError)
|
|||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
puts_P(PSTR(EVENT_PREFIX "Ctrl Request\r\n"));
|
||||
printf_P(PSTR(" -- Req Data %d\r\n"), bRequest);
|
||||
printf_P(PSTR(" -- Req Type %d\r\n"), bmRequestType);
|
||||
printf_P(PSTR(" -- Req Data %d\r\n"), USB_ControlRequest.bRequest);
|
||||
printf_P(PSTR(" -- Req Type %d\r\n"), USB_ControlRequest.bmRequestType);
|
||||
printf_P(PSTR(" -- Req Length %d\r\n"), USB_ControlRequest.wLength);
|
||||
}
|
||||
|
||||
/** Event handler for the USB_ConfigurationChanged event. When fired, the event is logged to the USART. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue