Added multiple Report ID support to the HID class driver. Removed OUT endpoint support from HID driver (all OUT reports are now processed through control requests) as a seperate endpoint had issues with determining the exact output report length.
This commit is contained in:
parent
7665bf323e
commit
3d1baa6f95
23 changed files with 96 additions and 128 deletions
|
|
@ -119,7 +119,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.InterfaceNumber = 0x00,
|
||||
.AlternateSetting = 0x00,
|
||||
|
||||
.TotalEndpoints = 2,
|
||||
.TotalEndpoints = 1,
|
||||
|
||||
.Class = 0x03,
|
||||
.SubClass = 0x00,
|
||||
|
|
@ -148,16 +148,6 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.EndpointSize = GENERIC_EPSIZE,
|
||||
.PollingIntervalMS = 0x02
|
||||
},
|
||||
|
||||
.GenericOUTEndpoint =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||
|
||||
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | GENERIC_OUT_EPNUM),
|
||||
.Attributes = EP_TYPE_INTERRUPT,
|
||||
.EndpointSize = GENERIC_EPSIZE,
|
||||
.PollingIntervalMS = 0x02
|
||||
}
|
||||
};
|
||||
|
||||
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
|
||||
|
|
|
|||
|
|
@ -53,16 +53,12 @@
|
|||
USB_Descriptor_Interface_t Interface;
|
||||
USB_Descriptor_HID_t GenericHID;
|
||||
USB_Descriptor_Endpoint_t GenericINEndpoint;
|
||||
USB_Descriptor_Endpoint_t GenericOUTEndpoint;
|
||||
} USB_Descriptor_Configuration_t;
|
||||
|
||||
/* Macros: */
|
||||
/** Endpoint number of the Generic HID reporting IN endpoint. */
|
||||
#define GENERIC_IN_EPNUM 1
|
||||
|
||||
/** Endpoint number of the Generic HID reporting OUT endpoint. */
|
||||
#define GENERIC_OUT_EPNUM 2
|
||||
|
||||
/** Size in bytes of the Generic HID reporting endpoint. */
|
||||
#define GENERIC_EPSIZE 8
|
||||
|
||||
|
|
|
|||
|
|
@ -47,9 +47,6 @@ USB_ClassInfo_HID_t Generic_HID_Interface =
|
|||
.ReportINEndpointNumber = GENERIC_IN_EPNUM,
|
||||
.ReportINEndpointSize = GENERIC_EPSIZE,
|
||||
|
||||
.ReportOUTEndpointNumber = GENERIC_OUT_EPNUM,
|
||||
.ReportOUTEndpointSize = GENERIC_EPSIZE,
|
||||
|
||||
.ReportINBufferSize = GENERIC_REPORT_SIZE,
|
||||
|
||||
.UsingReportProtocol = true,
|
||||
|
|
@ -133,7 +130,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|||
*
|
||||
* \return Number of bytes written in the report (or zero if no report is to be sent
|
||||
*/
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
|
||||
{
|
||||
// Create generic HID report here
|
||||
|
||||
|
|
@ -146,7 +143,8 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
|
|||
* \param ReportData Pointer to a buffer where the created report has been stored
|
||||
* \param ReportSize Size in bytes of the received HID report
|
||||
*/
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize)
|
||||
{
|
||||
// Process received generic HID report here
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,8 +72,8 @@
|
|||
void EVENT_USB_ConfigurationChanged(void);
|
||||
void EVENT_USB_UnhandledControlPacket(void);
|
||||
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|||
*
|
||||
* \return Number of bytes written in the report (or zero if no report is to be sent
|
||||
*/
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
|
||||
{
|
||||
USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
|
||||
|
||||
|
|
@ -164,7 +164,8 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
|
|||
* \param ReportData Pointer to a buffer where the created report has been stored
|
||||
* \param ReportSize Size in bytes of the received HID report
|
||||
*/
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize)
|
||||
{
|
||||
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,8 +83,8 @@
|
|||
void EVENT_USB_ConfigurationChanged(void);
|
||||
void EVENT_USB_UnhandledControlPacket(void);
|
||||
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.InterfaceNumber = 0x00,
|
||||
.AlternateSetting = 0x00,
|
||||
|
||||
.TotalEndpoints = 2,
|
||||
.TotalEndpoints = 1,
|
||||
|
||||
.Class = 0x03,
|
||||
.SubClass = 0x01,
|
||||
|
|
@ -165,16 +165,6 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.EndpointSize = KEYBOARD_EPSIZE,
|
||||
.PollingIntervalMS = 0x04
|
||||
},
|
||||
|
||||
.KeyboardLEDsEndpoint =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||
|
||||
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | KEYBOARD_LEDS_EPNUM),
|
||||
.Attributes = EP_TYPE_INTERRUPT,
|
||||
.EndpointSize = KEYBOARD_EPSIZE,
|
||||
.PollingIntervalMS = 0x04
|
||||
}
|
||||
};
|
||||
|
||||
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
|
||||
|
|
|
|||
|
|
@ -54,15 +54,11 @@
|
|||
USB_Descriptor_Interface_t Interface;
|
||||
USB_Descriptor_HID_t KeyboardHID;
|
||||
USB_Descriptor_Endpoint_t KeyboardEndpoint;
|
||||
USB_Descriptor_Endpoint_t KeyboardLEDsEndpoint;
|
||||
} USB_Descriptor_Configuration_t;
|
||||
|
||||
/* Macros: */
|
||||
/** Endpoint number of the Keyboard HID reporting IN endpoint. */
|
||||
#define KEYBOARD_EPNUM 1
|
||||
|
||||
/** Endpoint number of the Keyboard HID reporting OUT endpoint. */
|
||||
#define KEYBOARD_LEDS_EPNUM 2
|
||||
|
||||
/** Size in bytes of the Keyboard HID reporting IN and OUT endpoints. */
|
||||
#define KEYBOARD_EPSIZE 8
|
||||
|
|
|
|||
|
|
@ -48,9 +48,6 @@ USB_ClassInfo_HID_t Keyboard_HID_Interface =
|
|||
.ReportINEndpointNumber = KEYBOARD_EPNUM,
|
||||
.ReportINEndpointSize = KEYBOARD_EPSIZE,
|
||||
|
||||
.ReportOUTEndpointNumber = KEYBOARD_LEDS_EPNUM,
|
||||
.ReportOUTEndpointSize = KEYBOARD_EPSIZE,
|
||||
|
||||
.ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t),
|
||||
|
||||
.IdleCount = 500,
|
||||
|
|
@ -136,7 +133,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|||
*
|
||||
* \return Number of bytes written in the report (or zero if no report is to be sent
|
||||
*/
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
|
||||
{
|
||||
USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;
|
||||
|
||||
|
|
@ -168,7 +165,8 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
|
|||
* \param ReportData Pointer to a buffer where the created report has been stored
|
||||
* \param ReportSize Size in bytes of the received HID report
|
||||
*/
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize)
|
||||
{
|
||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
||||
uint8_t* LEDReport = (uint8_t*)ReportData;
|
||||
|
|
|
|||
|
|
@ -86,8 +86,8 @@
|
|||
void EVENT_USB_ConfigurationChanged(void);
|
||||
void EVENT_USB_UnhandledControlPacket(void);
|
||||
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.InterfaceNumber = 0x00,
|
||||
.AlternateSetting = 0x00,
|
||||
|
||||
.TotalEndpoints = 2,
|
||||
.TotalEndpoints = 1,
|
||||
|
||||
.Class = 0x03,
|
||||
.SubClass = 0x01,
|
||||
|
|
@ -199,16 +199,6 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||
.PollingIntervalMS = 0x02
|
||||
},
|
||||
|
||||
.KeyboardOutEndpoint =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||
|
||||
.EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | KEYBOARD_OUT_EPNUM),
|
||||
.Attributes = EP_TYPE_INTERRUPT,
|
||||
.EndpointSize = HID_EPSIZE,
|
||||
.PollingIntervalMS = 0x02
|
||||
},
|
||||
|
||||
.MouseInterface =
|
||||
{
|
||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@
|
|||
USB_Descriptor_Interface_t KeyboardInterface;
|
||||
USB_Descriptor_HID_t KeyboardHID;
|
||||
USB_Descriptor_Endpoint_t KeyboardInEndpoint;
|
||||
USB_Descriptor_Endpoint_t KeyboardOutEndpoint;
|
||||
USB_Descriptor_Interface_t MouseInterface;
|
||||
USB_Descriptor_HID_t MouseHID;
|
||||
USB_Descriptor_Endpoint_t MouseInEndpoint;
|
||||
|
|
@ -64,9 +63,6 @@
|
|||
/** Endpoint number of the Keyboard HID reporting IN endpoint. */
|
||||
#define KEYBOARD_IN_EPNUM 1
|
||||
|
||||
/** Endpoint number of the Keyboard HID reporting OUT endpoint. */
|
||||
#define KEYBOARD_OUT_EPNUM 2
|
||||
|
||||
/** Endpoint number of the Mouse HID reporting IN endpoint. */
|
||||
#define MOUSE_IN_EPNUM 3
|
||||
|
||||
|
|
|
|||
|
|
@ -48,9 +48,6 @@ USB_ClassInfo_HID_t Keyboard_HID_Interface =
|
|||
|
||||
.ReportINEndpointNumber = KEYBOARD_IN_EPNUM,
|
||||
.ReportINEndpointSize = HID_EPSIZE,
|
||||
|
||||
.ReportOUTEndpointNumber = KEYBOARD_OUT_EPNUM,
|
||||
.ReportOUTEndpointSize = HID_EPSIZE,
|
||||
|
||||
.ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t),
|
||||
|
||||
|
|
@ -70,9 +67,6 @@ USB_ClassInfo_HID_t Mouse_HID_Interface =
|
|||
.ReportINEndpointSize = HID_EPSIZE,
|
||||
|
||||
.ReportINBufferSize = sizeof(USB_MouseReport_Data_t),
|
||||
|
||||
.ReportOUTEndpointNumber = 0,
|
||||
.ReportOUTEndpointSize = 0,
|
||||
};
|
||||
|
||||
/** Main program entry point. This routine contains the overall program flow, including initial
|
||||
|
|
@ -162,7 +156,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|||
*
|
||||
* \return Number of bytes written in the report (or zero if no report is to be sent
|
||||
*/
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
|
||||
{
|
||||
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
||||
uint8_t ButtonStatus_LCL = Buttons_GetStatus();
|
||||
|
|
@ -221,7 +215,8 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
|
|||
* \param ReportData Pointer to a buffer where the created report has been stored
|
||||
* \param ReportSize Size in bytes of the received HID report
|
||||
*/
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize)
|
||||
{
|
||||
if (HIDInterfaceInfo == &Keyboard_HID_Interface)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -90,8 +90,8 @@
|
|||
void EVENT_USB_ConfigurationChanged(void);
|
||||
void EVENT_USB_UnhandledControlPacket(void);
|
||||
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|||
*
|
||||
* \return Number of bytes written in the report (or zero if no report is to be sent
|
||||
*/
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData)
|
||||
{
|
||||
USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData;
|
||||
|
||||
|
|
@ -162,7 +162,8 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
|
|||
* \param ReportData Pointer to a buffer where the created report has been stored
|
||||
* \param ReportSize Size in bytes of the received HID report
|
||||
*/
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize)
|
||||
{
|
||||
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
|
||||
}
|
||||
|
|
|
|||
|
|
@ -85,8 +85,8 @@
|
|||
void EVENT_USB_ConfigurationChanged(void);
|
||||
void EVENT_USB_UnhandledControlPacket(void);
|
||||
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo,
|
||||
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t* ReportID, void* ReportData);
|
||||
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, uint8_t ReportID,
|
||||
void* ReportData, uint16_t ReportSize);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue