Add new attributes to the HID Report Parser and HID Host Mode Class driver to keep...
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 21 Sep 2009 12:23:09 +0000 (12:23 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 21 Sep 2009 12:23:09 +0000 (12:23 +0000)
Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
LUFA/Drivers/USB/Class/Host/HID.c
LUFA/Drivers/USB/Class/Host/HID.h
LUFA/Drivers/USB/Class/Host/HIDParser.c
LUFA/Drivers/USB/Class/Host/HIDParser.h
LUFA/ManPages/ChangeLog.txt
LUFA/ManPages/CompileTimeTokens.txt
LUFA/ManPages/FutureChanges.txt

index d87c0e7..d898074 100644 (file)
@@ -120,7 +120,7 @@ int main(void)
                        case HOST_STATE_Configured:\r
                                if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))\r
                                {\r
-                                       uint8_t KeyboardReport[50];\r
+                                       uint8_t KeyboardReport[Keyboard_HID_Interface.State.LargestReportSize];\r
                                        HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);\r
                                        \r
                                        for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)\r
index 8133c87..c33b2eb 100644 (file)
@@ -120,7 +120,7 @@ int main(void)
                        case HOST_STATE_Configured:\r
                                if (HID_Host_IsReportReceived(&Mouse_HID_Interface))\r
                                {\r
-                                       uint8_t MouseReport[50];\r
+                                       uint8_t MouseReport[Keyboard_HID_Interface.State.LargestReportSize];\r
                                        HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport);\r
 \r
                                        uint8_t LEDMask = LEDS_NO_LEDS;\r
index 87d3793..b420a5b 100644 (file)
@@ -101,6 +101,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo
                }\r
        }\r
 \r
+       HIDInterfaceInfo->State.LargestReportSize = 8;\r
        HIDInterfaceInfo->State.IsActive = true;\r
        return HID_ENUMERROR_NoError;\r
 }\r
@@ -288,6 +289,7 @@ uint8_t USB_HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfac
        if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
          return ErrorCode;\r
 \r
+       HIDInterfaceInfo->State.LargestReportSize = 8;\r
        HIDInterfaceInfo->State.UsingBootProtocol = true;\r
        \r
        return HOST_SENDCONTROL_Successful;\r
@@ -339,6 +341,9 @@ uint8_t USB_HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterf
                return HID_ERROR_LOGICAL | ErrorCode;\r
        }\r
 \r
+       uint8_t LargestReportSizeBits = HIDInterfaceInfo->Config.HIDParserData->LargestReportSizeBits;\r
+       HIDInterfaceInfo->State.LargestReportSize = (LargestReportSizeBits >> 3) + ((LargestReportSizeBits & 0x07) != 0);\r
+\r
        return 0;\r
 }\r
 \r
index 8f80ea8..5526990 100644 (file)
                                                                 */\r
                                        bool UsingBootProtocol; /**< Indicates that the interface is currently initialised in Boot Protocol mode */\r
                                        uint16_t HIDReportSize; /**< Size in bytes of the HID report descriptor in the device */\r
+                                       \r
+                                       uint8_t LargestReportSize; /**< Largest report the device will send, in bytes */\r
                                } State; /**< State data for the USB class interface within the device. All elements in this section\r
                                                  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when\r
                                                  *   the interface is enumerated.\r
index b302a94..450f6af 100644 (file)
@@ -241,29 +241,36 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
                                        {\r
                                                NewReportItem.Attributes.Usage.Usage = 0;\r
                                        }\r
-                                                                                       \r
+\r
+                                       uint8_t ReportSizeIndex = 0;\r
+\r
                                        switch (HIDReportItem & TAG_MASK)\r
                                        {\r
                                                case TAG_MAIN_INPUT:\r
                                                        NewReportItem.ItemType  = REPORT_ITEM_TYPE_In;\r
                                                        NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_In];\r
                                                                \r
-                                                       CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_In] += CurrStateTable->Attributes.BitSize;\r
+                                                       ReportSizeIndex = REPORT_ITEM_TYPE_In;\r
                                                        break;\r
                                                case TAG_MAIN_OUTPUT:\r
                                                        NewReportItem.ItemType  = REPORT_ITEM_TYPE_Out;\r
                                                        NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Out];\r
                                                                \r
-                                                       CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Out] += CurrStateTable->Attributes.BitSize;\r
+                                                       ReportSizeIndex = REPORT_ITEM_TYPE_Out;\r
                                                        break;\r
                                                case TAG_MAIN_FEATURE:\r
                                                        NewReportItem.ItemType  = REPORT_ITEM_TYPE_Feature;                                             \r
                                                        NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Feature];\r
                                                                \r
-                                                       CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Feature] += CurrStateTable->Attributes.BitSize;\r
+                                                       ReportSizeIndex = REPORT_ITEM_TYPE_Feature;\r
                                                        break;\r
                                        }\r
+                                       \r
+                                       CurrReportIDInfo->ReportSizeBits[ReportSizeIndex] += CurrStateTable->Attributes.BitSize;\r
 \r
+                                       if (ParserData->LargestReportSizeBits < CurrReportIDInfo->ReportSizeBits[ReportSizeIndex])\r
+                                         ParserData->LargestReportSizeBits = CurrReportIDInfo->ReportSizeBits[ReportSizeIndex];\r
+                                       \r
                                        if (!(ReportItemData & IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&CurrStateTable->Attributes))\r
                                        {                                       \r
                                                if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS)\r
index f2cd35b..2ee3f70 100644 (file)
                                HID_CollectionPath_t         CollectionPaths[HID_MAX_COLLECTIONS]; /**< All collection items, referenced\r
                                                                                                    *   by the report items.\r
                                                                                                    */\r
-                               uint8_t                      TotalDeviceReports; /** Number of reports within the HID interface */\r
-                               HID_ReportSizeInfo_t         ReportIDSizes[HID_MAX_REPORT_IDS]; /** Report sizes for each report in the interface */\r
+                               uint8_t                      TotalDeviceReports; /**< Number of reports within the HID interface */\r
+                               HID_ReportSizeInfo_t         ReportIDSizes[HID_MAX_REPORT_IDS]; /**< Report sizes for each report in the interface */\r
+                               uint16_t                     LargestReportSizeBits; /**< Largest report that the attached device will generate, in bits */\r
                                bool                         UsingReportIDs; /**< Indicates if the device has at least one REPORT ID\r
                                                                              *   element in its HID report descriptor.\r
                                                                              */\r
index c8fe5b8..18b6090 100644 (file)
@@ -68,7 +68,7 @@
   *  - Re-add in missing flip, flip-ee, dfu and dfu-ee targets to project makefiles (thanks to Opendous Inc.)\r
   *  - Fix allowable F_CPU values comment in project makefiles to more accurately reflect the allowable values on the USB AVRs\r
   *  - Fixed DFU and CDC class bootloaders on the series 2 USB AVRs, corrected invalid signatures, added support for the new\r
-  *    ATMEGAxxx2 series 2 variant AVRs to the DFU bootloader\r
+  *    ATMEGAxx2 series 2 variant AVRs to the DFU bootloader\r
   *  - Fixed Low Level USBtoSerial demo not storing received characters (thanks to Michael Cooper)\r
   *  - Fixed MIDI Device Class driver not sending/receiving MIDI packets of the correct size (thanks to Thomas Bleeker)\r
   *\r
index 8213c67..3619ec4 100644 (file)
  *  \section Sec_SummaryUSBClassTokens USB Class Driver Related Tokens\r
  *  This section describes compile tokens which affect USB class-specific drivers in the LUFA library.\r
  *\r
- *  <b>HID_STATETABLE_STACK_DEPTH</b> - ( \ref Group_HIDParser ) \n\r
+ *  <b>HID_STATETABLE_STACK_DEPTH</b>=<i>x</i> - ( \ref Group_HIDParser ) \n\r
  *  HID reports may contain PUSH and POP elements, to store and retrieve the current HID state table onto a stack. This\r
  *  allows for reports to save the state table before modifying it slightly for a data item, and then restore the previous\r
  *  state table in a compact manner. This token may be defined to a non-zero 8-bit value to give the maximum depth of the state\r
  *  table stack. If not defined, this defaults to the value indicated in the HID.h file documentation.\r
  *\r
- *  <b>HID_USAGE_STACK_DEPTH</b> - ( \ref Group_HIDParser ) \n\r
+ *  <b>HID_USAGE_STACK_DEPTH</b>=<i>x</i> - ( \ref Group_HIDParser ) \n\r
  *  HID reports generally contain many USAGE elements, which are assigned to INPUT, OUTPUT and FEATURE items in succession\r
  *  when multiple items are defined at once (via REPORT COUNT elements). This allows for several items to be defined with\r
  *  different usages in a compact manner. This token may be defined to a non-zero 8-bit value to set the maximum depth of the\r
  *  usage stack, indicating the maximum number of USAGE items which can be stored temporarily until the next INPUT, OUTPUT\r
  *  and FEATURE item. If not defined, this defaults to the value indicated in the HID.h file documentation.\r
  *\r
- *  <b>HID_MAX_COLLECTIONS</b> - ( \ref Group_HIDParser ) \n\r
+ *  <b>HID_MAX_COLLECTIONS</b>=<i>x</i> - ( \ref Group_HIDParser ) \n\r
  *  HID reports generally contain several COLLECTION elements, used to group related data items together. Collection information\r
  *  is stored separately in the processed usage structure (and referred to by the data elements in the structure) to save space.\r
  *  This token may be defined to a non-zero 8-bit value to set the maximum number of COLLECTION items which can be processed by the\r
  *  parser into the resultant processed report structure. If not defined, this defaults to the value indicated in the HID.h file\r
  *  documentation.\r
  *\r
- *  <b>HID_MAX_REPORTITEMS</b> - ( \ref Group_HIDParser ) \n\r
+ *  <b>HID_MAX_REPORTITEMS</b>=<i>x</i> - ( \ref Group_HIDParser ) \n\r
  *  All HID reports contain one or more INPUT, OUTPUT and/or FEATURE items describing the data which can be sent to and from the HID\r
  *  device. Each item has associated usages, bit offsets in the item reports and other associated data indicating the manner in which\r
  *  the report data should be interpreted by the host. This token may be defined to a non-zero 8-bit value to set the maximum number of\r
@@ -51,7 +51,7 @@
  *  If a item has a multiple count (i.e. a REPORT COUNT of more than 1), each item in the report count is placed separately in the\r
  *  processed HID report table. If not defined, this defaults to the value indicated in the HID.h file documentation.\r
  *\r
- *  <b>HID_MAX_REPORT_IDS</b> - ( \ref Group_HIDParser ) \n\r
+ *  <b>HID_MAX_REPORT_IDS</b>=<i>x</i> - ( \ref Group_HIDParser ) \n\r
  *  HID reports may contain several report IDs, to logically distinguish grouped device data from one another - for example, a combination\r
  *  keyboard and mouse might use report IDs to seperate the keyboard reports from the mouse reports. In order to determine the size of each\r
  *  report, and thus know how many bytes must be read or written, the size of each report (IN, OUT and FEATURE) must be calculated and\r
@@ -78,7 +78,7 @@
  *  allocated resources (such as drivers, COM Port number allocations) to be preserved. This is not needed in many apps, and so the\r
  *  code that performs this task can be disabled by defining this option and passing it to the compiler via the -D switch.\r
  *\r
- *  <b>FIXED_CONTROL_ENDPOINT_SIZE</b> - ( \ref Group_EndpointManagement ) \n\r
+ *  <b>FIXED_CONTROL_ENDPOINT_SIZE</b>=<i>x</i> - ( \ref Group_EndpointManagement ) \n\r
  *  By default, the library determines the size of the control endpoint (when in device mode) by reading the device descriptor.\r
  *  Normally this reduces the amount of configuration required for the library, allows the value to change dynamically (if\r
  *  descriptors are stored in EEPROM or RAM rather than flash memory) and reduces code maintenance. However, this token can be\r
@@ -99,7 +99,7 @@
  *  reserved for application use. When defined, the corresponding GPIOR register should not be used within the user application except\r
  *  implicitly via the library APIs.\r
  *\r
- *  <b>FIXED_NUM_CONFIGURATIONS</b> - ( \ref Group_Device ) \n\r
+ *  <b>FIXED_NUM_CONFIGURATIONS</b>=<i>x</i> - ( \ref Group_Device ) \n\r
  *  By default, the library determines the number of configurations a USB device supports by reading the device descriptor. This reduces\r
  *  the amount of configuration required to set up the library, and allows the value to change dynamically (if descriptors are stored in\r
  *  EEPROM or RAM rather than flash memory) and reduces code maintenance. However, this value may be fixed via this token in the project\r
  *  used, bytes are sent or recevied in groups of 8 bytes at a time increasing performance at the expense of a larger flash memory consumption\r
  *  due to the extra code required to deal with byte alignment.\r
  *\r
- *  <b>USB_HOST_TIMEOUT_MS</b> - ( \ref Group_Host ) \n\r
+ *  <b>USB_HOST_TIMEOUT_MS</b>=<i>x</i> - ( \ref Group_Host ) \n\r
  *  When a control transfer is initiated in host mode to an attached device, a timeout is used to abort the transfer if the attached\r
  *  device fails to respond within the timeout period. This token may be defined to a non-zero 16-bit value to set the timeout period for\r
  *  control transfers, specified in milliseconds. If not defined, the default value specified in Host.h is used instead.\r
  *\r
- *  <b>HOST_DEVICE_SETTLE_DELAY_MS</b> - ( \ref Group_Host ) \n\r
+ *  <b>HOST_DEVICE_SETTLE_DELAY_MS</b>=<i>x</i> - ( \ref Group_Host ) \n\r
  *  Some devices require a delay of up to 5 seconds after they are connected to VBUS before the enumeration process can be started, or\r
  *  they will fail to enumerate correctly. By placing a delay before the enumeration process, it can be ensured that the bus has settled\r
  *  back to a known idle state before communications occur with the device. This token may be defined to a 16-bit value to set the device\r
  *  settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead.\r
  *\r
- *  <b>USE_STATIC_OPTIONS</b> - ( \ref Group_USBManagement ) \n\r
+ *  <b>USE_STATIC_OPTIONS</b>=<i>x</i> - ( \ref Group_USBManagement ) \n\r
  *  By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad\r
  *  voltage regulator is enabled, and the device speed when in device mode. By defining this token to a mask comprised of the USB options\r
  *  mask defines usually passed as the Options parameter to USB_Init(), the resulting compiled binary can be decreased in size by removing\r
  *  <b>USB_HOST_ONLY</b> - ( \ref Group_USBManagement ) \n\r
  *  Same as USB_DEVICE_ONLY, except the library is fixed to USB host mode rather than USB device mode. Not available on some USB AVR models.\r
  *\r
- *  <b>USB_STREAM_TIMEOUT_MS</b> - ( \ref Group_USBManagement ) \n\r
+ *  <b>USB_STREAM_TIMEOUT_MS</b>=<i>x</i> - ( \ref Group_USBManagement ) \n\r
  *  When endpoint and/or pipe stream functions are used, by default there is a timeout between each transfer which the connected device or host\r
  *  must satisfy, or the stream function aborts the remaining data transfer. This token may be defined to a non-zero 16-bit value to set the timeout\r
  *  period for stream transfers, specified in milliseconds. If not defined, the default value specified in LowLevel.h is used instead.\r
index 425dcb5..c5fcbc5 100644 (file)
@@ -11,8 +11,8 @@
   *  If you have an item to add to this list, please contact the library author via email, the LUFA mailing list,\r
   *  or post your suggestion as an enhancement request to the project bug tracker.\r
   *\r
-  *  <b>Targeted for This Release:</b>\r
-  *  - Finish HID Host Mode Class Driver, add demo summaries\r
+  *  <b>Targeted for This Release (SVN Development Only):</b>\r
+  *  - N/A\r
   *\r
   *  <b>Targeted for Future Releases:</b>\r
   *  - Add hub support to match Atmel's stack\r
   *  - Remake AVRStudio project files\r
   *  - Add detailed overviews of how each demo works\r
   *  - Master LUFA include file rather than per-module includes\r
-  *  - Add multiple-report HID device demo to the library\r
-  *  - Add dual role Mouse Host/Keyboard Device demo to the library\r
-  *  - Add Mouse/CDC dual class device demo to the library\r
   *  - Change makefiles to allow for absolute LUFA location to be used\r
+  *  - Make new demos\r
+  *      -# Multiple-report HID device\r
+  *      -# Dual Role Mouse Host/Keyboard Device\r
+  *      -# Mouse/CDC Dual ClassDevice\r
   *  - Port LUFA to other architectures\r
   *      -# AVR32 UC3B series microcontrollers\r
   *      -# Atmel ARM7 series microcontrollers\r