\r
#include "GenericHIDHost.h"\r
\r
-/* Project Tags, for reading out using the ButtLoad project */\r
-BUTTLOADTAG(ProjName, "LUFA GenHid Host App");\r
-BUTTLOADTAG(BuildTime, __TIME__);\r
-BUTTLOADTAG(BuildDate, __DATE__);\r
-BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);\r
-\r
/* Scheduler Task List */\r
TASK_LIST\r
{\r
- { Task: USB_USBTask , TaskStatus: TASK_STOP },\r
- { Task: USB_HID_Host , TaskStatus: TASK_STOP },\r
+ { .Task = USB_USBTask , .TaskStatus = TASK_STOP },\r
+ { .Task = USB_HID_Host , .TaskStatus = TASK_STOP },\r
};\r
\r
\r
/* Initialize USB Subsystem */\r
USB_Init();\r
\r
- /* Startup message */\r
+ /* Start-up message */\r
puts_P(PSTR(ESC_RESET ESC_BG_WHITE ESC_INVERSE_ON ESC_ERASE_DISPLAY\r
"Generic HID Host Demo running.\r\n" ESC_INVERSE_OFF));\r
\r
for(;;);\r
}\r
\r
-/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occured while\r
+/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while\r
* enumerating an attached USB device.\r
*/\r
EVENT_HANDLER(USB_DeviceEnumerationFailed)\r
Pipe_SelectPipe(HID_DATA_IN_PIPE);\r
Pipe_Unfreeze();\r
\r
- /* Ensure pipe contains data and is ready to be read before continuing */\r
- if (!(Pipe_ReadWriteAllowed()))\r
+ /* Check to see if a packet has been received */\r
+ if (!(Pipe_IsINReceived()))\r
{\r
#if !defined(INTERRUPT_DATA_PIPE)\r
/* Refreeze HID data IN pipe */\r
Pipe_Freeze();\r
#endif\r
- \r
+ \r
return;\r
}\r
\r
- uint8_t ReportINData[Pipe_BytesInPipe()];\r
+ /* Ensure pipe contains data before trying to read from it */\r
+ if (Pipe_IsReadWriteAllowed())\r
+ {\r
+ uint8_t ReportINData[Pipe_BytesInPipe()];\r
\r
- /* Read in HID report data */\r
- Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData)); \r
+ /* Read in HID report data */\r
+ Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData));\r
+ \r
+ /* Print report data through the serial port */\r
+ for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++)\r
+ printf_P(PSTR("0x%02X "), ReportINData[CurrByte]);\r
+ \r
+ puts_P(PSTR("\r\n"));\r
+ }\r
\r
/* Clear the IN endpoint, ready for next data packet */\r
- Pipe_ClearCurrentBank();\r
- \r
- /* Print report data through the serial port */\r
- for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++)\r
- printf_P(PSTR("0x%02X "), ReportINData[CurrByte]);\r
- \r
- puts_P(PSTR("\r\n"));\r
+ Pipe_ClearIN();\r
\r
#if !defined(INTERRUPT_DATA_PIPE)\r
/* Refreeze HID data IN pipe */\r
/** Writes a report to the attached device.\r
*\r
* \param ReportOUTData Buffer containing the report to send to the device\r
+ * \param ReportIndex Index of the report in the device (zero if the device does not use multiple reports)\r
+ * \param ReportType Type of report to send, either HID_REPORTTYPE_OUTPUT or HID_REPORTTYPE_FEATURE\r
* \param ReportLength Length of the report to send\r
*/\r
-void WriteNextReport(uint8_t ReportOUTData, uint16_t ReportLength)\r
+void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t ReportType, uint16_t ReportLength)\r
{\r
/* Select and unfreeze HID data OUT pipe */\r
- Pipe_SelectPipe(HID_DATA_IN_PIPE);\r
+ Pipe_SelectPipe(HID_DATA_OUT_PIPE);\r
\r
/* Not all HID devices have an OUT endpoint (some require OUT reports to be sent over the\r
* control endpoint instead) - check to see if the OUT endpoint has been initialized */\r
Pipe_Unfreeze();\r
\r
/* Ensure pipe is ready to be written to before continuing */\r
- if (!(Pipe_ReadWriteAllowed()))\r
+ if (!(Pipe_IsOUTReady()))\r
{\r
/* Refreeze the data OUT pipe */\r
Pipe_Freeze();\r
\r
return;\r
}\r
+ \r
+ /* If the report index is used, send it before the report data */\r
+ if (ReportIndex)\r
+ Pipe_Write_Byte(ReportIndex);\r
\r
- /* Read in HID report data */\r
- Pipe_Write_Stream_LE(&ReportOUTData, ReportLength); \r
+ /* Write out HID report data */\r
+ Pipe_Write_Stream_LE(ReportOUTData, ReportLength); \r
\r
/* Clear the OUT endpoint, send last data packet */\r
- Pipe_ClearCurrentBank();\r
+ Pipe_ClearOUT();\r
\r
/* Refreeze the data OUT pipe */\r
Pipe_Freeze();\r
else\r
{\r
/* Class specific request to send a HID report to the device */\r
- USB_HostRequest = (USB_Host_Request_Header_t)\r
+ USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
- bRequest: REQ_SetReport,\r
- wValue: 0,\r
- wIndex: 0,\r
- wLength: ReportLength,\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = REQ_SetReport,\r
+ .wValue = ((ReportType << 8) | ReportIndex),\r
+ .wIndex = 0,\r
+ .wLength = ReportLength,\r
};\r
\r
+ /* Select the control pipe for the request transfer */\r
+ Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+\r
/* Send the request to the device */\r
USB_Host_SendControlRequest(ReportOUTData);\r
}\r
{\r
case HOST_STATE_Addressed:\r
/* Standard request to set the device configuration to configuration 1 */\r
- USB_HostRequest = (USB_Host_Request_Header_t)\r
+ USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
- bRequest: REQ_SetConfiguration,\r
- wValue: 1,\r
- wIndex: 0,\r
- wLength: 0,\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
+ .bRequest = REQ_SetConfiguration,\r
+ .wValue = 1,\r
+ .wIndex = 0,\r
+ .wLength = 0,\r
};\r
\r
- /* Send the request, display error and wait for device detatch if request fails */\r
+ /* Select the control pipe for the request transfer */\r
+ Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+\r
+ /* Send the request, display error and wait for device detach if request fails */\r
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
{\r
puts_P(PSTR("Control Error (Set Configuration).\r\n"));\r
*/\r
ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
{\r
+ /* Save previously selected pipe before selecting a new pipe */\r
+ uint8_t PrevSelectedPipe = Pipe_GetCurrentPipe();\r
+\r
/* Check to see if the HID data IN pipe has caused the interrupt */\r
if (Pipe_HasPipeInterrupted(HID_DATA_IN_PIPE))\r
{\r
ReadNextReport();\r
}\r
}\r
+\r
+ /* Restore previously selected pipe */\r
+ Pipe_SelectPipe(PrevSelectedPipe);\r
}\r
#endif\r