Commit d860e9e8 authored by Dean Camera's avatar Dean Camera
Browse files

USB_HostRequest renamed to USB_ControlRequest, entire control request header...

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.
parent e5e7eaee
...@@ -152,13 +152,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -152,13 +152,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
uint8_t* LineCodingData = (uint8_t*)&LineCoding; uint8_t* LineCodingData = (uint8_t*)&LineCoding;
Endpoint_Discard_Word();
/* Process CDC specific control requests */ /* Process CDC specific control requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetLineEncoding: case REQ_GetLineEncoding:
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -174,7 +172,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -174,7 +172,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetLineEncoding: case REQ_SetLineEncoding:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -192,7 +190,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -192,7 +190,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetControlLineState: case REQ_SetControlLineState:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -151,16 +151,10 @@ EVENT_HANDLER(USB_Disconnect) ...@@ -151,16 +151,10 @@ EVENT_HANDLER(USB_Disconnect)
*/ */
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Discard unused wIndex value */
Endpoint_Discard_Word();
/* Discard unused wValue value */
Endpoint_Discard_Word();
/* Get the size of the command and data from the wLength value */ /* Get the size of the command and data from the wLength value */
SentCommand.DataSize = Endpoint_Read_Word_LE(); SentCommand.DataSize = USB_ControlRequest.wLength;
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case DFU_DNLOAD: case DFU_DNLOAD:
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -96,10 +96,10 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -96,10 +96,10 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Handle HID Class specific requests */ /* Handle HID Class specific requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_SetReport: case REQ_SetReport:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -131,18 +131,16 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -131,18 +131,16 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Process General and Audio specific control requests */ /* Process General and Audio specific control requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_SetInterface: case REQ_SetInterface:
/* Set Interface is not handled by the library, as its function is application-specific */ /* 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(); Endpoint_ClearSETUP();
/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */ /* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
if (wValue) if (USB_ControlRequest.wValue)
{ {
/* Start audio task */ /* Start audio task */
Scheduler_SetTaskMode(USB_Audio_Task, TASK_RUN); Scheduler_SetTaskMode(USB_Audio_Task, TASK_RUN);
......
...@@ -158,18 +158,16 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -158,18 +158,16 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Process General and Audio specific control requests */ /* Process General and Audio specific control requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_SetInterface: case REQ_SetInterface:
/* Set Interface is not handled by the library, as its function is application-specific */ /* 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(); Endpoint_ClearSETUP();
/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */ /* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
if (wValue) if (USB_ControlRequest.wValue)
{ {
/* Start audio task */ /* Start audio task */
Scheduler_SetTaskMode(USB_Audio_Task, TASK_RUN); Scheduler_SetTaskMode(USB_Audio_Task, TASK_RUN);
......
...@@ -160,10 +160,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -160,10 +160,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
uint8_t* LineCodingData = (uint8_t*)&LineCoding; uint8_t* LineCodingData = (uint8_t*)&LineCoding;
/* Process CDC specific control requests */ /* Process CDC specific control requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetLineEncoding: 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 */ /* Acknowledge the SETUP packet, ready for data transfer */
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -177,7 +177,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -177,7 +177,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetLineEncoding: 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 */ /* Acknowledge the SETUP packet, ready for data transfer */
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -191,18 +191,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -191,18 +191,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetControlLineState: 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 /* 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 lines. The mask is read in from the wValue parameter in USB_ControlRequest, and can be masked against the
to determine the RTS and DTR line states using the following code: 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 */ /* Acknowledge the SETUP packet, ready for data transfer */
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -198,10 +198,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -198,10 +198,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
LineCodingData = (wIndex == 0) ? (uint8_t*)&LineCoding1 : (uint8_t*)&LineCoding2; LineCodingData = (wIndex == 0) ? (uint8_t*)&LineCoding1 : (uint8_t*)&LineCoding2;
/* Process CDC specific control requests */ /* Process CDC specific control requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetLineEncoding: 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 */ /* Acknowledge the SETUP packet, ready for data transfer */
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -215,7 +215,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -215,7 +215,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetLineEncoding: 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 */ /* Acknowledge the SETUP packet, ready for data transfer */
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -229,7 +229,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -229,7 +229,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetControlLineState: 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 */ /* Acknowledge the SETUP packet, ready for data transfer */
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -160,10 +160,10 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -160,10 +160,10 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Handle HID Class specific requests */ /* Handle HID Class specific requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetReport: case REQ_GetReport:
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -180,7 +180,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -180,7 +180,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetReport: case REQ_SetReport:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -122,33 +122,20 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -122,33 +122,20 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Handle HID Class specific requests */ /* Handle HID Class specific requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetReport: 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; USB_JoystickReport_Data_t JoystickReportData;
/* Create the next HID report to send to the host */ /* Create the next HID report to send to the host */
GetNextReport(&JoystickReportData); 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(); Endpoint_ClearSETUP();
/* Write the report data to the control endpoint */ /* 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 */ /* Finalize the stream transfer to send the last packet or clear the host abort */
Endpoint_ClearOUT(); Endpoint_ClearOUT();
......
...@@ -193,33 +193,20 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -193,33 +193,20 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Handle HID Class specific requests */ /* Handle HID Class specific requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetReport: 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; USB_KeyboardReport_Data_t KeyboardReportData;
/* Create the next keyboard report for transmission to the host */ /* Create the next keyboard report for transmission to the host */
CreateKeyboardReport(&KeyboardReportData); 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(); Endpoint_ClearSETUP();
/* Write the report data to the control endpoint */ /* 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 */ /* Finalize the stream transfer to send the last packet or clear the host abort */
Endpoint_ClearOUT(); Endpoint_ClearOUT();
...@@ -227,7 +214,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -227,7 +214,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetReport: case REQ_SetReport:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -250,7 +237,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -250,7 +237,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_GetProtocol: case REQ_GetProtocol:
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -267,15 +254,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -267,15 +254,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetProtocol: 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(); Endpoint_ClearSETUP();
/* Set or clear the flag depending on what the host indicates that the current Protocol should be */ /* 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 */ /* Acknowledge status stage */
while (!(Endpoint_IsINReady())); while (!(Endpoint_IsINReady()));
...@@ -284,15 +268,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -284,15 +268,12 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetIdle: 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(); Endpoint_ClearSETUP();
/* Get idle period in MSB */ /* Get idle period in MSB */
IdleCount = (wValue >> 8); IdleCount = (USB_ControlRequest.wValue >> 8);
/* Acknowledge status stage */ /* Acknowledge status stage */
while (!(Endpoint_IsINReady())); while (!(Endpoint_IsINReady()));
...@@ -301,7 +282,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -301,7 +282,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_GetIdle: case REQ_GetIdle:
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -139,17 +139,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -139,17 +139,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
uint8_t ReportSize; uint8_t ReportSize;
/* Handle HID Class specific requests */ /* Handle HID Class specific requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetReport: 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 */ /* Determine if it is the mouse or the keyboard data that is being requested */
if (!(wIndex)) if (!(USB_ControlRequest.wIndex))
{ {
ReportData = (uint8_t*)&KeyboardReportData; ReportData = (uint8_t*)&KeyboardReportData;
ReportSize = sizeof(KeyboardReportData); ReportSize = sizeof(KeyboardReportData);
...@@ -160,17 +156,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -160,17 +156,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
ReportSize = sizeof(MouseReportData); 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(); Endpoint_ClearSETUP();
/* Write the report data to the control endpoint */ /* 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 */ /* Clear the report data afterwards */
memset(ReportData, 0, ReportSize); memset(ReportData, 0, ReportSize);
...@@ -181,7 +170,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -181,7 +170,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_SetReport: case REQ_SetReport:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -148,10 +148,10 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -148,10 +148,10 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Process UFI specific control requests */ /* Process UFI specific control requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_MassStorageReset: case REQ_MassStorageReset:
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
...@@ -165,7 +165,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ...@@ -165,7 +165,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
break; break;
case REQ_GetMaxLUN: case REQ_GetMaxLUN:
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
......
...@@ -183,33 +183,20 @@ EVENT_HANDLER(USB_ConfigurationChanged) ...@@ -183,33 +183,20 @@ EVENT_HANDLER(USB_ConfigurationChanged)
EVENT_HANDLER(USB_UnhandledControlPacket) EVENT_HANDLER(USB_UnhandledControlPacket)
{ {
/* Handle HID Class specific requests */ /* Handle HID Class specific requests */
switch (bRequest) switch (USB_ControlRequest.bRequest)
{ {
case REQ_GetReport: 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;