]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Add sendchar with Generic HID to support debug print.
authortmk <nobody@nowhere>
Wed, 27 Jun 2012 09:31:33 +0000 (18:31 +0900)
committertmk <nobody@nowhere>
Wed, 27 Jun 2012 09:31:33 +0000 (18:31 +0900)
keyboard/lufa/Descriptors.c
keyboard/lufa/Descriptors.h
keyboard/lufa/Makefile
keyboard/lufa/lufa.c
keyboard/lufa/lufa.h

index 3195aa77a6a89b68bf426fc46c62223225ee1a73..a4e9defab448b62228bbf23eb9ad64c4a17ec8d3 100644 (file)
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2012.\r
-\r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this\r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in\r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special\r
- *  computer-readable structures which the host requests upon device enumeration, to determine\r
- *  the device's capabilities and functions.\r
- */\r
-\r
-#include "Descriptors.h"\r
-\r
-/** HID class report descriptor. This is a special descriptor constructed with values from the\r
- *  USBIF HID class specification to describe the reports and capabilities of the HID device. This\r
- *  descriptor is parsed by the host and its contents used to determine what data (and in what encoding)\r
- *  the device will send, and what it may be sent back from the host. Refer to the HID specification for\r
- *  more details on HID report descriptors.\r
- *\r
- *  This descriptor describes the mouse HID interface's report structure.\r
- */\r
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =\r
-{\r
-       HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */\r
-       HID_RI_USAGE(8, 0x02), /* Mouse */\r
-       HID_RI_COLLECTION(8, 0x01), /* Application */\r
-           HID_RI_USAGE(8, 0x01), /* Pointer */\r
-           HID_RI_COLLECTION(8, 0x00), /* Physical */\r
-               HID_RI_USAGE_PAGE(8, 0x09), /* Button */\r
-               HID_RI_USAGE_MINIMUM(8, 0x01),\r
-               HID_RI_USAGE_MAXIMUM(8, 0x03),\r
-               HID_RI_LOGICAL_MINIMUM(8, 0x00),\r
-               HID_RI_LOGICAL_MAXIMUM(8, 0x01),\r
-               HID_RI_REPORT_COUNT(8, 0x03),\r
-               HID_RI_REPORT_SIZE(8, 0x01),\r
-               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),\r
-               HID_RI_REPORT_COUNT(8, 0x01),\r
-               HID_RI_REPORT_SIZE(8, 0x05),\r
-               HID_RI_INPUT(8, HID_IOF_CONSTANT),\r
-               HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */\r
-               HID_RI_USAGE(8, 0x30), /* Usage X */\r
-               HID_RI_USAGE(8, 0x31), /* Usage Y */\r
-               HID_RI_LOGICAL_MINIMUM(8, -1),\r
-               HID_RI_LOGICAL_MAXIMUM(8, 1),\r
-               HID_RI_PHYSICAL_MINIMUM(8, -1),\r
-               HID_RI_PHYSICAL_MAXIMUM(8, 1),\r
-               HID_RI_REPORT_COUNT(8, 0x02),\r
-               HID_RI_REPORT_SIZE(8, 0x08),\r
-               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),\r
-           HID_RI_END_COLLECTION(0),\r
-       HID_RI_END_COLLECTION(0),\r
-};\r
-\r
-/** Same as the MouseReport structure, but defines the keyboard HID interface's report structure. */\r
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =\r
-{\r
-       HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */\r
-       HID_RI_USAGE(8, 0x06), /* Keyboard */\r
-       HID_RI_COLLECTION(8, 0x01), /* Application */\r
-           HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */\r
-           HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */\r
-           HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */\r
-           HID_RI_LOGICAL_MINIMUM(8, 0x00),\r
-           HID_RI_LOGICAL_MAXIMUM(8, 0x01),\r
-           HID_RI_REPORT_SIZE(8, 0x01),\r
-           HID_RI_REPORT_COUNT(8, 0x08),\r
-           HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),\r
-           HID_RI_REPORT_COUNT(8, 0x01),\r
-           HID_RI_REPORT_SIZE(8, 0x08),\r
-           HID_RI_INPUT(8, HID_IOF_CONSTANT),\r
-           HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */\r
-           HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */\r
-           HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */\r
-           HID_RI_REPORT_COUNT(8, 0x05),\r
-           HID_RI_REPORT_SIZE(8, 0x01),\r
-           HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),\r
-           HID_RI_REPORT_COUNT(8, 0x01),\r
-           HID_RI_REPORT_SIZE(8, 0x03),\r
-           HID_RI_OUTPUT(8, HID_IOF_CONSTANT),\r
-           HID_RI_LOGICAL_MINIMUM(8, 0x00),\r
-           HID_RI_LOGICAL_MAXIMUM(8, 0x65),\r
-           HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */\r
-           HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */\r
-           HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */\r
-           HID_RI_REPORT_COUNT(8, 0x06),\r
-           HID_RI_REPORT_SIZE(8, 0x08),\r
-           HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),\r
-       HID_RI_END_COLLECTION(0),\r
-};\r
-\r
-/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall\r
- *  device characteristics, including the supported USB version, control endpoint size and the\r
- *  number of device configurations. The descriptor is read out by the USB host when the enumeration\r
- *  process begins.\r
- */\r
-const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =\r
-{\r
-       .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},\r
-\r
-       .USBSpecification       = VERSION_BCD(01.10),\r
-       .Class                  = USB_CSCP_NoDeviceClass,\r
-       .SubClass               = USB_CSCP_NoDeviceSubclass,\r
-       .Protocol               = USB_CSCP_NoDeviceProtocol,\r
-\r
-       .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,\r
-\r
-       .VendorID               = 0x03EB,\r
-       .ProductID              = 0x204D,\r
-       .ReleaseNumber          = VERSION_BCD(00.01),\r
-\r
-       .ManufacturerStrIndex   = 0x01,\r
-       .ProductStrIndex        = 0x02,\r
-       .SerialNumStrIndex      = NO_DESCRIPTOR,\r
-\r
-       .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS\r
-};\r
-\r
-/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage\r
- *  of the device in one of its supported configurations, including information about any device interfaces\r
- *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting\r
- *  a configuration so that the host may correctly communicate with the USB device.\r
- */\r
-const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =\r
-{\r
-       .Config =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},\r
-\r
-                       .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),\r
-                       .TotalInterfaces        = 2,\r
-\r
-                       .ConfigurationNumber    = 1,\r
-                       .ConfigurationStrIndex  = NO_DESCRIPTOR,\r
-\r
-                       .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED),\r
-\r
-                       .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)\r
-               },\r
-\r
-       .HID1_KeyboardInterface =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},\r
-\r
-                       .InterfaceNumber        = 0x00,\r
-                       .AlternateSetting       = 0x00,\r
-\r
-                       .TotalEndpoints         = 2,\r
-\r
-                       .Class                  = HID_CSCP_HIDClass,\r
-                       .SubClass               = HID_CSCP_BootSubclass,\r
-                       .Protocol               = HID_CSCP_KeyboardBootProtocol,\r
-\r
-                       .InterfaceStrIndex      = NO_DESCRIPTOR\r
-               },\r
-\r
-       .HID1_KeyboardHID =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},\r
-\r
-                       .HIDSpec                = VERSION_BCD(01.11),\r
-                       .CountryCode            = 0x00,\r
-                       .TotalReportDescriptors = 1,\r
-                       .HIDReportType          = HID_DTYPE_Report,\r
-                       .HIDReportLength        = sizeof(KeyboardReport)\r
-               },\r
-\r
-       .HID1_ReportINEndpoint =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},\r
-\r
-                       .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),\r
-                       .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
-                       .EndpointSize           = HID_EPSIZE,\r
-                       .PollingIntervalMS      = 0x01\r
-               },\r
-\r
-       .HID1_ReportOUTEndpoint =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},\r
-\r
-                       .EndpointAddress        = (ENDPOINT_DIR_OUT | KEYBOARD_OUT_EPNUM),\r
-                       .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
-                       .EndpointSize           = HID_EPSIZE,\r
-                       .PollingIntervalMS      = 0x01\r
-               },\r
-\r
-       .HID2_MouseInterface =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},\r
-\r
-                       .InterfaceNumber        = 0x01,\r
-                       .AlternateSetting       = 0x00,\r
-\r
-                       .TotalEndpoints         = 1,\r
-\r
-                       .Class                  = HID_CSCP_HIDClass,\r
-                       .SubClass               = HID_CSCP_BootSubclass,\r
-                       .Protocol               = HID_CSCP_MouseBootProtocol,\r
-\r
-                       .InterfaceStrIndex      = NO_DESCRIPTOR\r
-               },\r
-\r
-       .HID2_MouseHID =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},\r
-\r
-                       .HIDSpec                = VERSION_BCD(01.11),\r
-                       .CountryCode            = 0x00,\r
-                       .TotalReportDescriptors = 1,\r
-                       .HIDReportType          = HID_DTYPE_Report,\r
-                       .HIDReportLength        = sizeof(MouseReport)\r
-               },\r
-\r
-       .HID2_ReportINEndpoint =\r
-               {\r
-                       .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},\r
-\r
-                       .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),\r
-                       .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
-                       .EndpointSize           = HID_EPSIZE,\r
-                       .PollingIntervalMS      = 0x01\r
-               }\r
-};\r
-\r
-/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests\r
- *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate\r
- *  via the language ID table available at USB.org what languages the device supports for its string descriptors.\r
- */\r
-const USB_Descriptor_String_t PROGMEM LanguageString =\r
-{\r
-       .Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},\r
-\r
-       .UnicodeString          = {LANGUAGE_ID_ENG}\r
-};\r
-\r
-/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable\r
- *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device\r
- *  Descriptor.\r
- */\r
-const USB_Descriptor_String_t PROGMEM ManufacturerString =\r
-{\r
-       .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},\r
-\r
-       .UnicodeString          = L"Dean Camera"\r
-};\r
-\r
-/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,\r
- *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device\r
- *  Descriptor.\r
- */\r
-const USB_Descriptor_String_t PROGMEM ProductString =\r
-{\r
-       .Header                 = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},\r
-\r
-       .UnicodeString          = L"LUFA Mouse and Keyboard Demo"\r
-};\r
-\r
-/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"\r
- *  documentation) by the application code so that the address and size of a requested descriptor can be given\r
- *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function\r
- *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the\r
- *  USB host.\r
- */\r
-uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
-                                    const uint8_t wIndex,\r
-                                    const void** const DescriptorAddress)\r
-{\r
-       const uint8_t  DescriptorType   = (wValue >> 8);\r
-       const uint8_t  DescriptorNumber = (wValue & 0xFF);\r
-\r
-       const void* Address = NULL;\r
-       uint16_t    Size    = NO_DESCRIPTOR;\r
-\r
-       switch (DescriptorType)\r
-       {\r
-               case DTYPE_Device:\r
-                       Address = &DeviceDescriptor;\r
-                       Size    = sizeof(USB_Descriptor_Device_t);\r
-                       break;\r
-               case DTYPE_Configuration:\r
-                       Address = &ConfigurationDescriptor;\r
-                       Size    = sizeof(USB_Descriptor_Configuration_t);\r
-                       break;\r
-               case DTYPE_String:\r
-                       switch (DescriptorNumber)\r
-                       {\r
-                               case 0x00:\r
-                                       Address = &LanguageString;\r
-                                       Size    = pgm_read_byte(&LanguageString.Header.Size);\r
-                                       break;\r
-                               case 0x01:\r
-                                       Address = &ManufacturerString;\r
-                                       Size    = pgm_read_byte(&ManufacturerString.Header.Size);\r
-                                       break;\r
-                               case 0x02:\r
-                                       Address = &ProductString;\r
-                                       Size    = pgm_read_byte(&ProductString.Header.Size);\r
-                                       break;\r
-                       }\r
-\r
-                       break;\r
-               case HID_DTYPE_HID:\r
-                       if (!(wIndex))\r
-                       {\r
-                               Address = &ConfigurationDescriptor.HID1_KeyboardHID;\r
-                               Size    = sizeof(USB_HID_Descriptor_HID_t);\r
-                       }\r
-                       else\r
-                       {\r
-                               Address = &ConfigurationDescriptor.HID2_MouseHID;\r
-                               Size    = sizeof(USB_HID_Descriptor_HID_t);\r
-                       }\r
-                       break;\r
-               case HID_DTYPE_Report:\r
-                       if (!(wIndex))\r
-                       {\r
-                               Address = &KeyboardReport;\r
-                               Size    = sizeof(KeyboardReport);\r
-                       }\r
-                       else\r
-                       {\r
-                               Address = &MouseReport;\r
-                               Size    = sizeof(MouseReport);\r
-                       }\r
-\r
-                       break;\r
-       }\r
-\r
-       *DescriptorAddress = Address;\r
-       return Size;\r
-}\r
-\r
+/* 
+ * Copyright 2012 Jun Wako <wakojun@gmail.com>
+ * This file is based on:
+ *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
+ */
+
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2012.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *
+ *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special
+ *  computer-readable structures which the host requests upon device enumeration, to determine
+ *  the device's capabilities and functions.
+ */
+
+#include "Descriptors.h"
+
+
+/*******************************************************************************
+ * HID Report Descriptors
+ ******************************************************************************/
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x06), /* Keyboard */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
+        HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
+        HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+        HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_REPORT_COUNT(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_REPORT_COUNT(8, 0x01),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_CONSTANT),
+        HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
+        HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
+        HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
+        HID_RI_REPORT_COUNT(8, 0x05),
+        HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+        HID_RI_REPORT_COUNT(8, 0x01),
+        HID_RI_REPORT_SIZE(8, 0x03),
+        HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0x65),
+        HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
+        HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
+        HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
+        HID_RI_REPORT_COUNT(8, 0x06),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x02), /* Mouse */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE(8, 0x01), /* Pointer */
+        HID_RI_COLLECTION(8, 0x00), /* Physical */
+            HID_RI_USAGE_PAGE(8, 0x09), /* Button */
+            HID_RI_USAGE_MINIMUM(8, 0x01),
+            HID_RI_USAGE_MAXIMUM(8, 0x03),
+            HID_RI_LOGICAL_MINIMUM(8, 0x00),
+            HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+            HID_RI_REPORT_COUNT(8, 0x03),
+            HID_RI_REPORT_SIZE(8, 0x01),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+            HID_RI_REPORT_COUNT(8, 0x01),
+            HID_RI_REPORT_SIZE(8, 0x05),
+            HID_RI_INPUT(8, HID_IOF_CONSTANT),
+            HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+            HID_RI_USAGE(8, 0x30), /* Usage X */
+            HID_RI_USAGE(8, 0x31), /* Usage Y */
+            HID_RI_LOGICAL_MINIMUM(8, -1),
+            HID_RI_LOGICAL_MAXIMUM(8, 1),
+            HID_RI_PHYSICAL_MINIMUM(8, -1),
+            HID_RI_PHYSICAL_MAXIMUM(8, 1),
+            HID_RI_REPORT_COUNT(8, 0x02),
+            HID_RI_REPORT_SIZE(8, 0x08),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+        HID_RI_END_COLLECTION(0),
+    HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
+{
+    HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
+    HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
+    HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
+        HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+    HID_RI_END_COLLECTION(0),
+};
+
+
+/*******************************************************************************
+ * Device Descriptors
+ ******************************************************************************/
+const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
+{
+    .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
+
+    .USBSpecification       = VERSION_BCD(01.10),
+    .Class                  = USB_CSCP_NoDeviceClass,
+    .SubClass               = USB_CSCP_NoDeviceSubclass,
+    .Protocol               = USB_CSCP_NoDeviceProtocol,
+
+    .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
+
+    .VendorID               = 0xFEED,
+    .ProductID              = 0x204D,
+    .ReleaseNumber          = VERSION_BCD(00.02),
+
+    .ManufacturerStrIndex   = 0x01,
+    .ProductStrIndex        = 0x02,
+    .SerialNumStrIndex      = NO_DESCRIPTOR,
+
+    .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
+};
+
+/*******************************************************************************
+ * Configuration Descriptors
+ ******************************************************************************/
+const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
+{
+    .Config =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
+
+            .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
+            .TotalInterfaces        = 3,
+
+            .ConfigurationNumber    = 1,
+            .ConfigurationStrIndex  = NO_DESCRIPTOR,
+
+            .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), //TODO: bus powered?
+
+            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
+        },
+
+        /*
+         * Keyboard
+         */
+    .HID1_KeyboardInterface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = 0x00,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 2,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_BootSubclass,
+            .Protocol               = HID_CSCP_KeyboardBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .HID1_KeyboardHID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(KeyboardReport)
+        },
+
+    .HID1_ReportINEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = HID_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    .HID1_ReportOUTEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_OUT | KEYBOARD_OUT_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = HID_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    /*
+     * Mouse
+     */
+    .HID2_MouseInterface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = 0x01,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 1,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_BootSubclass,
+            .Protocol               = HID_CSCP_MouseBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .HID2_MouseHID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(MouseReport)
+        },
+
+    .HID2_ReportINEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = HID_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    /*
+     * Generic
+     */
+    .HID3_GenericInterface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = 0x02,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 2,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_NonBootSubclass,
+            .Protocol               = HID_CSCP_NonBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .HID3_GenericHID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(GenericReport)
+        },
+
+    .HID3_ReportINEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = GENERIC_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    .HID3_ReportOUTEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_OUT | GENERIC_OUT_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = GENERIC_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        }
+};
+
+
+/*******************************************************************************
+ * String Descriptors
+ ******************************************************************************/
+const USB_Descriptor_String_t PROGMEM LanguageString =
+{
+    .Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
+
+    .UnicodeString          = {LANGUAGE_ID_ENG}
+};
+
+const USB_Descriptor_String_t PROGMEM ManufacturerString =
+{
+    .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
+
+    .UnicodeString          = L"Dean Camera"    // TODO:
+};
+
+const USB_Descriptor_String_t PROGMEM ProductString =
+{
+    .Header                 = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},
+
+    .UnicodeString          = L"LUFA Mouse and Keyboard Demo"   // TODO:
+};
+
+
+/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
+ *  documentation) by the application code so that the address and size of a requested descriptor can be given
+ *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
+ *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
+ *  USB host.
+ */
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+                                    const uint8_t wIndex,
+                                    const void** const DescriptorAddress)
+{
+    const uint8_t  DescriptorType   = (wValue >> 8);
+    const uint8_t  DescriptorIndex  = (wValue & 0xFF);
+
+    const void* Address = NULL;
+    uint16_t    Size    = NO_DESCRIPTOR;
+
+    switch (DescriptorType)
+    {
+        case DTYPE_Device:
+            Address = &DeviceDescriptor;
+            Size    = sizeof(USB_Descriptor_Device_t);
+            break;
+        case DTYPE_Configuration:
+            Address = &ConfigurationDescriptor;
+            Size    = sizeof(USB_Descriptor_Configuration_t);
+            break;
+        case DTYPE_String:
+            switch (DescriptorIndex )
+            {
+                case 0x00:
+                    Address = &LanguageString;
+                    Size    = pgm_read_byte(&LanguageString.Header.Size);
+                    break;
+                case 0x01:
+                    Address = &ManufacturerString;
+                    Size    = pgm_read_byte(&ManufacturerString.Header.Size);
+                    break;
+                case 0x02:
+                    Address = &ProductString;
+                    Size    = pgm_read_byte(&ProductString.Header.Size);
+                    break;
+            }
+            break;
+        case HID_DTYPE_HID:
+            switch (wIndex) {
+            case 0:
+                Address = &ConfigurationDescriptor.HID1_KeyboardHID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+            case 1:
+                Address = &ConfigurationDescriptor.HID2_MouseHID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+            case 2:
+                Address = &ConfigurationDescriptor.HID3_GenericHID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+            }
+            break;
+        case HID_DTYPE_Report:
+            switch (wIndex) {
+            case 0:
+                Address = &KeyboardReport;
+                Size    = sizeof(KeyboardReport);
+                break;
+            case 1:
+                Address = &MouseReport;
+                Size    = sizeof(MouseReport);
+                break;
+            case 2:
+                Address = &GenericReport;
+                Size    = sizeof(GenericReport);
+                break;
+            }
+            break;
+    }
+
+    *DescriptorAddress = Address;
+    return Size;
+}
index 05b2035bb19756d2db62c582e15b05a79109b073..03e2426a379893982a494b8c92dc0ba44a639b5a 100644 (file)
 #ifndef _DESCRIPTORS_H_\r
 #define _DESCRIPTORS_H_\r
 \r
-       /* Includes: */\r
-               #include <LUFA/Drivers/USB/USB.h>\r
-\r
-               #include <avr/pgmspace.h>\r
-\r
-       /* Type Defines: */\r
-               /** Type define for the device configuration descriptor structure. This must be defined in the\r
-                *  application code, as the configuration descriptor contains several sub-descriptors which\r
-                *  vary between devices, and which describe the device's usage to the host.\r
-                */\r
-               typedef struct\r
-               {\r
-                       USB_Descriptor_Configuration_Header_t Config;\r
-\r
-                       // Keyboard HID Interface\r
-                       USB_Descriptor_Interface_t            HID1_KeyboardInterface;\r
-                       USB_HID_Descriptor_HID_t              HID1_KeyboardHID;\r
-                       USB_Descriptor_Endpoint_t             HID1_ReportINEndpoint;\r
-                       USB_Descriptor_Endpoint_t             HID1_ReportOUTEndpoint;\r
-\r
-                       // Mouse HID Interface\r
-                       USB_Descriptor_Interface_t            HID2_MouseInterface;\r
-                       USB_HID_Descriptor_HID_t              HID2_MouseHID;\r
-                       USB_Descriptor_Endpoint_t             HID2_ReportINEndpoint;\r
-                       USB_Descriptor_Endpoint_t             HID2_ReportOUTEndpoint;\r
-               } USB_Descriptor_Configuration_t;\r
-\r
-       /* Macros: */\r
-               /** Endpoint number of the Keyboard HID reporting IN endpoint. */\r
-               #define KEYBOARD_IN_EPNUM         1\r
-\r
-               /** Endpoint number of the Keyboard HID reporting OUT endpoint. */\r
-               #define KEYBOARD_OUT_EPNUM        2\r
-\r
-               /** Endpoint number of the Mouse HID reporting IN endpoint. */\r
-               #define MOUSE_IN_EPNUM            3\r
-\r
-               /** Size in bytes of each of the HID reporting IN and OUT endpoints. */\r
-               #define HID_EPSIZE                8\r
-\r
-       /* Function Prototypes: */\r
-               uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
-                                                   const uint8_t wIndex,\r
-                                                   const void** const DescriptorAddress)\r
-                                                   ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);\r
+#include <LUFA/Drivers/USB/USB.h>\r
+#include <avr/pgmspace.h>\r
+\r
+\r
+typedef struct\r
+{\r
+    USB_Descriptor_Configuration_Header_t Config;\r
+\r
+    // Keyboard HID Interface\r
+    USB_Descriptor_Interface_t            HID1_KeyboardInterface;\r
+    USB_HID_Descriptor_HID_t              HID1_KeyboardHID;\r
+    USB_Descriptor_Endpoint_t             HID1_ReportINEndpoint;\r
+    USB_Descriptor_Endpoint_t             HID1_ReportOUTEndpoint;\r
+\r
+    // Mouse HID Interface\r
+    USB_Descriptor_Interface_t            HID2_MouseInterface;\r
+    USB_HID_Descriptor_HID_t              HID2_MouseHID;\r
+    USB_Descriptor_Endpoint_t             HID2_ReportINEndpoint;\r
+\r
+    // Generic HID Interface\r
+    USB_Descriptor_Interface_t            HID3_GenericInterface;\r
+    USB_HID_Descriptor_HID_t              HID3_GenericHID;\r
+    USB_Descriptor_Endpoint_t             HID3_ReportINEndpoint;\r
+    USB_Descriptor_Endpoint_t             HID3_ReportOUTEndpoint;\r
+} USB_Descriptor_Configuration_t;\r
 \r
-#endif\r
 \r
+// Endopoint number/size\r
+#define KEYBOARD_IN_EPNUM         1\r
+#define KEYBOARD_OUT_EPNUM        2\r
+#define MOUSE_IN_EPNUM            3\r
+#define GENERIC_IN_EPNUM          4\r
+#define GENERIC_OUT_EPNUM         5\r
+\r
+#define HID_EPSIZE                8\r
+#define GENERIC_EPSIZE            8\r
+#define GENERIC_REPORT_SIZE       8\r
+\r
+\r
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
+                                    const uint8_t wIndex,\r
+                                    const void** const DescriptorAddress)\r
+                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);\r
+\r
+#endif\r
index 1d2f712d4a74904a76d716d8b1d7099f4d8e9242..115c7e6ec689aeb90bf407518b92006f77a506b7 100644 (file)
@@ -128,8 +128,7 @@ LSRC = $(TARGET).c                                                 \
 SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LSRC))\r
 SRC += keymap.c \\r
        matrix.c \\r
-       led.c \\r
-       sendchar_null.c\r
+       led.c\r
 CONFIG_H = config.h\r
 \r
 \r
index d7e7c1654dcfc1d5e52cfc5e2bf437ed7c00e11a..d841f45c6aaa8cea7b30411b22a01cf6154d6014 100644 (file)
@@ -1,6 +1,8 @@
 /* 
  * Copyright 2012 Jun Wako <wakojun@gmail.com>
- * This file is based on LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse.
+ * This file is based on:
+ *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
  */
 
 /*
@@ -38,6 +40,8 @@
 #include "host.h"
 #include "host_driver.h"
 #include "keyboard.h"
+#include "sendchar.h"
+#include "debug.h"
 #include "lufa.h"
 
 static uint8_t keyboard_led_stats = 0;
@@ -64,11 +68,21 @@ int main(void)
     SetupHardware();
     sei();
 
+    print_enable = true;
+    debug_enable = true;
+    debug_matrix = true;
+    debug_keyboard = true;
+    debug_mouse = true;
+
+    _delay_ms(3000);
+    print("abcdefg\n");
+
     keyboard_init();
     host_set_driver(&lufa_driver);
     while (1) {
         keyboard_proc();
         Keyboard_HID_Task();
+        Generic_HID_Task();
         USB_USBTask();
     }
 }
@@ -112,6 +126,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
     /* Setup Mouse HID Report Endpoint */
     ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
                                                 HID_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+       /* Setup Generic HID Report Endpoints */
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                   GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+                                                   GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
 }
 
 /** Event handler for the USB_ControlRequest event.
@@ -119,8 +139,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
  */
 void EVENT_USB_Device_ControlRequest(void)
 {
-    uint8_t* ReportData;
-    uint8_t  ReportSize;
+    uint8_t* ReportData = NULL;
+    uint8_t  ReportSize = 0;
 
     /* Handle HID Class specific requests */
     switch (USB_ControlRequest.bRequest)
@@ -130,16 +150,18 @@ void EVENT_USB_Device_ControlRequest(void)
             {
                 Endpoint_ClearSETUP();
 
-                /* Determine if it is the mouse or the keyboard data that is being requested */
-                if (!(USB_ControlRequest.wIndex))
-                {
+                // Interface
+                switch (USB_ControlRequest.wIndex) {
+                case 1: // Keyboard
                     ReportData = (uint8_t*)&keyboard_report_sent;
                     ReportSize = sizeof(keyboard_report_sent);
-                }
-                else
-                {
+                    break;
+                case 2: // Mouse
                     ReportData = (uint8_t*)&mouse_report_sent;
                     ReportSize = sizeof(mouse_report_sent);
+                    break;
+                case 3: // Generic
+                    break;
                 }
 
                 /* Write the report data to the control endpoint */
@@ -160,8 +182,17 @@ void EVENT_USB_Device_ControlRequest(void)
                       return;
                 }
 
-                /* Read in the LED report from the host */
-                keyboard_led_stats = Endpoint_Read_8();
+                // Interface
+                switch (USB_ControlRequest.wIndex) {
+                case 1: // Keyboard
+                    /* Read in the LED report from the host */
+                    keyboard_led_stats = Endpoint_Read_8();
+                    break;
+                case 2: // Mouse
+                    break;
+                case 3: // Generic
+                    break;
+                }
 
                 Endpoint_ClearOUT();
                 Endpoint_ClearStatusStage();
@@ -176,6 +207,10 @@ void EVENT_USB_Device_ControlRequest(void)
  */
 void Keyboard_HID_Task(void)
 {
+       /* Device must be connected and configured for the task to run */
+       if (USB_DeviceState != DEVICE_STATE_Configured)
+         return;
+
     /* Select the Keyboard LED Report Endpoint */
     Endpoint_SelectEndpoint(KEYBOARD_OUT_EPNUM);
 
@@ -190,6 +225,40 @@ void Keyboard_HID_Task(void)
     }
 }
 
+void Generic_HID_Task(void)
+{
+       /* Device must be connected and configured for the task to run */
+       if (USB_DeviceState != DEVICE_STATE_Configured)
+         return;
+
+       Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
+
+       /* Check to see if a packet has been sent from the host */
+       if (Endpoint_IsOUTReceived())
+       {
+               /* Check to see if the packet contains data */
+               if (Endpoint_IsReadWriteAllowed())
+               {
+                       /* Create a temporary buffer to hold the read in report from the host */
+                       uint8_t GenericData[GENERIC_REPORT_SIZE];
+
+                       /* Read Generic Report Data */
+                       Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
+
+                       /* Process Generic Report Data */
+                       //TODO: ProcessGenericHIDReport(GenericData);
+               }
+
+               /* Finalize the stream transfer to send the last packet */
+               Endpoint_ClearOUT();
+       }
+
+        /* IN packet */
+       Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+        // send IN packet
+       if (Endpoint_IsINReady())
+            Endpoint_ClearIN();
+}
 
 /*******************************************************************************
  * Host driver 
@@ -241,3 +310,41 @@ static void send_system(uint16_t data)
 static void send_consumer(uint16_t data)
 {
 }
+
+
+/*******************************************************************************
+ * sendchar
+ ******************************************************************************/
+int8_t sendchar(uint8_t c)
+{
+    if (USB_DeviceState != DEVICE_STATE_Configured)
+      return -1;
+
+    Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+
+    uint8_t timeout = 10;
+    uint16_t prevFN = USB_Device_GetFrameNumber();
+    while (!Endpoint_IsINReady()) {
+        switch (USB_DeviceState) {
+        case DEVICE_STATE_Unattached:
+        case DEVICE_STATE_Suspended:
+            return -1;
+        }
+        if (Endpoint_IsStalled())
+            return -1;
+        uint16_t currFN = USB_Device_GetFrameNumber();
+        if (prevFN != USB_Device_GetFrameNumber()) {
+            if (!(timeout--))
+                return -1;
+            prevFN = USB_Device_GetFrameNumber();
+        }
+    }
+
+    Endpoint_Write_8(c);
+
+    // send when packet is full
+    if (!Endpoint_IsReadWriteAllowed())
+        Endpoint_ClearIN();
+
+    return 0;
+}
index 74fe0b72f1670968384d9beb809d6c0a153b48af..3ba14b360b05490cc0c0f17ee61a6f9f6edd0f30 100644 (file)
@@ -65,7 +65,7 @@
                void SetupHardware(void);\r
                void Keyboard_ProcessLEDReport(const uint8_t LEDStatus);\r
                void Keyboard_HID_Task(void);\r
-               void Mouse_HID_Task(void);\r
+               void Generic_HID_Task(void);\r
 \r
                void EVENT_USB_Device_Connect(void);\r
                void EVENT_USB_Device_Disconnect(void);\r