forked from mirrors/qmk_userspace
		
	Add consumer/system control feature to LUFA.
This commit is contained in:
		
					parent
					
						
							
								a9a3610dd4
							
						
					
				
			
			
				commit
				
					
						3d81d5221e
					
				
			
		
					 10 changed files with 209 additions and 96 deletions
				
			
		| 
						 | 
					@ -49,6 +49,7 @@ void keyboard_proc(void)
 | 
				
			||||||
    uint8_t fn_bits = 0;
 | 
					    uint8_t fn_bits = 0;
 | 
				
			||||||
#ifdef EXTRAKEY_ENABLE
 | 
					#ifdef EXTRAKEY_ENABLE
 | 
				
			||||||
    uint16_t consumer_code = 0;
 | 
					    uint16_t consumer_code = 0;
 | 
				
			||||||
 | 
					    uint16_t system_code = 0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    matrix_scan();
 | 
					    matrix_scan();
 | 
				
			||||||
| 
						 | 
					@ -89,22 +90,13 @@ void keyboard_proc(void)
 | 
				
			||||||
#ifdef HOST_PJRC
 | 
					#ifdef HOST_PJRC
 | 
				
			||||||
                if (suspend && remote_wakeup) {
 | 
					                if (suspend && remote_wakeup) {
 | 
				
			||||||
                    usb_remote_wakeup();
 | 
					                    usb_remote_wakeup();
 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    host_system_send(SYSTEM_POWER_DOWN);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
                host_system_send(SYSTEM_POWER_DOWN);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
                host_system_send(0);
 | 
					                system_code = SYSTEM_POWER_DOWN;
 | 
				
			||||||
                _delay_ms(500);
 | 
					 | 
				
			||||||
            } else if (code == KB_SYSTEM_SLEEP) {
 | 
					            } else if (code == KB_SYSTEM_SLEEP) {
 | 
				
			||||||
                host_system_send(SYSTEM_SLEEP);
 | 
					                system_code = SYSTEM_SLEEP;
 | 
				
			||||||
                host_system_send(0);
 | 
					 | 
				
			||||||
                _delay_ms(500);
 | 
					 | 
				
			||||||
            } else if (code == KB_SYSTEM_WAKE) {
 | 
					            } else if (code == KB_SYSTEM_WAKE) {
 | 
				
			||||||
                host_system_send(SYSTEM_WAKE_UP);
 | 
					                system_code = SYSTEM_WAKE_UP;
 | 
				
			||||||
                host_system_send(0);
 | 
					 | 
				
			||||||
                _delay_ms(500);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // Consumer Page
 | 
					            // Consumer Page
 | 
				
			||||||
            else if (code == KB_AUDIO_MUTE) {
 | 
					            else if (code == KB_AUDIO_MUTE) {
 | 
				
			||||||
| 
						 | 
					@ -173,6 +165,7 @@ void keyboard_proc(void)
 | 
				
			||||||
        host_send_keyboard_report();
 | 
					        host_send_keyboard_report();
 | 
				
			||||||
#ifdef EXTRAKEY_ENABLE
 | 
					#ifdef EXTRAKEY_ENABLE
 | 
				
			||||||
        host_consumer_send(consumer_code);
 | 
					        host_consumer_send(consumer_code);
 | 
				
			||||||
 | 
					        host_system_send(system_code);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DEBUG_LED
 | 
					#ifdef DEBUG_LED
 | 
				
			||||||
        // LED flash for debug
 | 
					        // LED flash for debug
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,12 +121,12 @@ void mousekey_clear_report(void)
 | 
				
			||||||
static void mousekey_debug(void)
 | 
					static void mousekey_debug(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!debug_mouse) return;
 | 
					    if (!debug_mouse) return;
 | 
				
			||||||
    print("mousekey[btn|x y v h]: ");
 | 
					    print("mousekey [btn|x y v h]rep: [");
 | 
				
			||||||
    phex(report.buttons); print("|");
 | 
					    phex(report.buttons); print("|");
 | 
				
			||||||
    phex(report.x); print(" ");
 | 
					    phex(report.x); print(" ");
 | 
				
			||||||
    phex(report.y); print(" ");
 | 
					    phex(report.y); print(" ");
 | 
				
			||||||
    phex(report.v); print(" ");
 | 
					    phex(report.v); print(" ");
 | 
				
			||||||
    phex(report.h);
 | 
					    phex(report.h); print("]");
 | 
				
			||||||
    phex(mousekey_repeat);
 | 
					    phex(mousekey_repeat);
 | 
				
			||||||
    print("\n");
 | 
					    print("\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,7 +128,8 @@ LUFA_SRC = $(TARGET).c \
 | 
				
			||||||
SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LUFA_SRC))
 | 
					SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LUFA_SRC))
 | 
				
			||||||
SRC +=	keymap.c \
 | 
					SRC +=	keymap.c \
 | 
				
			||||||
	matrix.c \
 | 
						matrix.c \
 | 
				
			||||||
	led.c
 | 
						led.c \
 | 
				
			||||||
 | 
						pjrc/bootloader_teensy.c
 | 
				
			||||||
CONFIG_H = config.h
 | 
					CONFIG_H = config.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,7 +138,7 @@ CONFIG_H = config.h
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
MOUSEKEY_ENABLE = yes	# Mouse keys
 | 
					MOUSEKEY_ENABLE = yes	# Mouse keys
 | 
				
			||||||
#PS2_MOUSE_ENABLE = yes	# PS/2 mouse(TrackPoint) support
 | 
					#PS2_MOUSE_ENABLE = yes	# PS/2 mouse(TrackPoint) support
 | 
				
			||||||
#EXTRAKEY_ENABLE = yes	# Audio control and System control
 | 
					EXTRAKEY_ENABLE = yes	# Audio control and System control
 | 
				
			||||||
#NKRO_ENABLE = yes	# USB Nkey Rollover
 | 
					#NKRO_ENABLE = yes	# USB Nkey Rollover
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,8 +24,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* USB Device descriptor */
 | 
					/* USB Device descriptor */
 | 
				
			||||||
#define VENDOR_ID       0xFEED
 | 
					#define VENDOR_ID       0xFEED
 | 
				
			||||||
#define PRODUCT_ID      0xBEE1
 | 
					#define PRODUCT_ID      0xBEE6
 | 
				
			||||||
#define DEVICE_VER      0x0101
 | 
					#define DEVICE_VER      0x0202
 | 
				
			||||||
#define MANUFACTURER    t.m.k.
 | 
					#define MANUFACTURER    t.m.k.
 | 
				
			||||||
#define PRODUCT         Macway mod(LUFA)
 | 
					#define PRODUCT         Macway mod(LUFA)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "util.h"
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					#include "report.h"
 | 
				
			||||||
#include "descriptor.h"
 | 
					#include "descriptor.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,27 +87,43 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
 | 
				
			||||||
    HID_RI_COLLECTION(8, 0x01), /* Application */
 | 
					    HID_RI_COLLECTION(8, 0x01), /* Application */
 | 
				
			||||||
        HID_RI_USAGE(8, 0x01), /* Pointer */
 | 
					        HID_RI_USAGE(8, 0x01), /* Pointer */
 | 
				
			||||||
        HID_RI_COLLECTION(8, 0x00), /* Physical */
 | 
					        HID_RI_COLLECTION(8, 0x00), /* Physical */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            HID_RI_USAGE_PAGE(8, 0x09), /* Button */
 | 
					            HID_RI_USAGE_PAGE(8, 0x09), /* Button */
 | 
				
			||||||
            HID_RI_USAGE_MINIMUM(8, 0x01),
 | 
					            HID_RI_USAGE_MINIMUM(8, 0x01),  /* Button 1 */
 | 
				
			||||||
            HID_RI_USAGE_MAXIMUM(8, 0x03),
 | 
					            HID_RI_USAGE_MAXIMUM(8, 0x05),  /* Button 5 */
 | 
				
			||||||
            HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
					            HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
				
			||||||
            HID_RI_LOGICAL_MAXIMUM(8, 0x01),
 | 
					            HID_RI_LOGICAL_MAXIMUM(8, 0x01),
 | 
				
			||||||
            HID_RI_REPORT_COUNT(8, 0x03),
 | 
					            HID_RI_REPORT_COUNT(8, 0x05),
 | 
				
			||||||
            HID_RI_REPORT_SIZE(8, 0x01),
 | 
					            HID_RI_REPORT_SIZE(8, 0x01),
 | 
				
			||||||
            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
 | 
					            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
 | 
				
			||||||
            HID_RI_REPORT_COUNT(8, 0x01),
 | 
					            HID_RI_REPORT_COUNT(8, 0x01),
 | 
				
			||||||
            HID_RI_REPORT_SIZE(8, 0x05),
 | 
					            HID_RI_REPORT_SIZE(8, 0x03),
 | 
				
			||||||
            HID_RI_INPUT(8, HID_IOF_CONSTANT),
 | 
					            HID_RI_INPUT(8, HID_IOF_CONSTANT),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
 | 
					            HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
 | 
				
			||||||
            HID_RI_USAGE(8, 0x30), /* Usage X */
 | 
					            HID_RI_USAGE(8, 0x30), /* Usage X */
 | 
				
			||||||
            HID_RI_USAGE(8, 0x31), /* Usage Y */
 | 
					            HID_RI_USAGE(8, 0x31), /* Usage Y */
 | 
				
			||||||
            HID_RI_LOGICAL_MINIMUM(8, -1),
 | 
					            HID_RI_LOGICAL_MINIMUM(8, -127),
 | 
				
			||||||
            HID_RI_LOGICAL_MAXIMUM(8, 1),
 | 
					            HID_RI_LOGICAL_MAXIMUM(8, 127),
 | 
				
			||||||
            HID_RI_PHYSICAL_MINIMUM(8, -1),
 | 
					 | 
				
			||||||
            HID_RI_PHYSICAL_MAXIMUM(8, 1),
 | 
					 | 
				
			||||||
            HID_RI_REPORT_COUNT(8, 0x02),
 | 
					            HID_RI_REPORT_COUNT(8, 0x02),
 | 
				
			||||||
            HID_RI_REPORT_SIZE(8, 0x08),
 | 
					            HID_RI_REPORT_SIZE(8, 0x08),
 | 
				
			||||||
            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
 | 
					            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            HID_RI_USAGE(8, 0x38), /* Wheel */
 | 
				
			||||||
 | 
					            HID_RI_LOGICAL_MINIMUM(8, -127),
 | 
				
			||||||
 | 
					            HID_RI_LOGICAL_MAXIMUM(8, 127),
 | 
				
			||||||
 | 
					            HID_RI_REPORT_COUNT(8, 0x01),
 | 
				
			||||||
 | 
					            HID_RI_REPORT_SIZE(8, 0x08),
 | 
				
			||||||
 | 
					            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
 | 
				
			||||||
 | 
					            HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */
 | 
				
			||||||
 | 
					            HID_RI_LOGICAL_MINIMUM(8, -127),
 | 
				
			||||||
 | 
					            HID_RI_LOGICAL_MAXIMUM(8, 127),
 | 
				
			||||||
 | 
					            HID_RI_REPORT_COUNT(8, 0x01),
 | 
				
			||||||
 | 
					            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),
 | 
				
			||||||
    HID_RI_END_COLLECTION(0),
 | 
					    HID_RI_END_COLLECTION(0),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -115,22 +132,50 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
 | 
					    HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
 | 
				
			||||||
    HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
 | 
					    HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
 | 
				
			||||||
    HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
 | 
					    HID_RI_COLLECTION(8, 0x01), /* Application */
 | 
				
			||||||
        HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
 | 
					        HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
 | 
				
			||||||
        HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
					        HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
				
			||||||
        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
 | 
					        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
 | 
				
			||||||
        HID_RI_REPORT_SIZE(8, 0x08),
 | 
					        HID_RI_REPORT_SIZE(8, 0x08),
 | 
				
			||||||
        HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
 | 
					        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
 | 
				
			||||||
        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
 | 
					        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
 | 
				
			||||||
        HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
 | 
					        HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
 | 
				
			||||||
        HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
					        HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
				
			||||||
        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
 | 
					        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
 | 
				
			||||||
        HID_RI_REPORT_SIZE(8, 0x08),
 | 
					        HID_RI_REPORT_SIZE(8, 0x08),
 | 
				
			||||||
        HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
 | 
					        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
 | 
				
			||||||
        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
 | 
					        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
 | 
				
			||||||
    HID_RI_END_COLLECTION(0),
 | 
					    HID_RI_END_COLLECTION(0),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
 | 
				
			||||||
 | 
					    HID_RI_USAGE(8, 0x80), /* System Control */
 | 
				
			||||||
 | 
					    HID_RI_COLLECTION(8, 0x01), /* Application */
 | 
				
			||||||
 | 
					        HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
 | 
				
			||||||
 | 
					        HID_RI_LOGICAL_MINIMUM(16, 0x0081),
 | 
				
			||||||
 | 
					        HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
 | 
				
			||||||
 | 
					        HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
 | 
				
			||||||
 | 
					        HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
 | 
				
			||||||
 | 
					        HID_RI_REPORT_SIZE(8, 16),
 | 
				
			||||||
 | 
					        HID_RI_REPORT_COUNT(8, 1),
 | 
				
			||||||
 | 
					        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
 | 
				
			||||||
 | 
					    HID_RI_END_COLLECTION(0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
 | 
				
			||||||
 | 
					    HID_RI_USAGE(8, 0x01), /* Consumer Control */
 | 
				
			||||||
 | 
					    HID_RI_COLLECTION(8, 0x01), /* Application */
 | 
				
			||||||
 | 
					        HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
 | 
				
			||||||
 | 
					        HID_RI_LOGICAL_MINIMUM(16, 0x0010),
 | 
				
			||||||
 | 
					        HID_RI_LOGICAL_MAXIMUM(16, 0x029C),
 | 
				
			||||||
 | 
					        HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */
 | 
				
			||||||
 | 
					        HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */
 | 
				
			||||||
 | 
					        HID_RI_REPORT_SIZE(8, 16),
 | 
				
			||||||
 | 
					        HID_RI_REPORT_COUNT(8, 1),
 | 
				
			||||||
 | 
					        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
 | 
				
			||||||
 | 
					    HID_RI_END_COLLECTION(0),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
 * Device Descriptors
 | 
					 * Device Descriptors
 | 
				
			||||||
| 
						 | 
					@ -167,7 +212,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
            .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
 | 
					            .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
 | 
				
			||||||
            .TotalInterfaces        = 3,
 | 
					            .TotalInterfaces        = TOTAL_INTERFACES,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .ConfigurationNumber    = 1,
 | 
					            .ConfigurationNumber    = 1,
 | 
				
			||||||
            .ConfigurationStrIndex  = NO_DESCRIPTOR,
 | 
					            .ConfigurationStrIndex  = NO_DESCRIPTOR,
 | 
				
			||||||
| 
						 | 
					@ -177,9 +222,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
 | 
					            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /*
 | 
					    /*
 | 
				
			||||||
         * Keyboard
 | 
					     * Keyboard
 | 
				
			||||||
         */
 | 
					     */
 | 
				
			||||||
    .Keyboard_Interface =
 | 
					    .Keyboard_Interface =
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
				
			||||||
| 
						 | 
					@ -213,7 +258,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
 | 
					            .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
 | 
				
			||||||
            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
					            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
				
			||||||
            .EndpointSize           = HID_EPSIZE,
 | 
					            .EndpointSize           = KEYBOARD_EPSIZE,
 | 
				
			||||||
            .PollingIntervalMS      = 0x01
 | 
					            .PollingIntervalMS      = 0x01
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,7 +298,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
 | 
					            .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
 | 
				
			||||||
            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
					            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
				
			||||||
            .EndpointSize           = HID_EPSIZE,
 | 
					            .EndpointSize           = MOUSE_EPSIZE,
 | 
				
			||||||
            .PollingIntervalMS      = 0x01
 | 
					            .PollingIntervalMS      = 0x01
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -264,7 +309,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .InterfaceNumber        = GENERIC_INTERFACE,
 | 
					            .InterfaceNumber        = CONSOLE_INTERFACE,
 | 
				
			||||||
            .AlternateSetting       = 0x00,
 | 
					            .AlternateSetting       = 0x00,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .TotalEndpoints         = 2,
 | 
					            .TotalEndpoints         = 2,
 | 
				
			||||||
| 
						 | 
					@ -291,9 +336,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .EndpointAddress        = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM),
 | 
					            .EndpointAddress        = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
 | 
				
			||||||
            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
					            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
				
			||||||
            .EndpointSize           = GENERIC_EPSIZE,
 | 
					            .EndpointSize           = CONSOLE_EPSIZE,
 | 
				
			||||||
            .PollingIntervalMS      = 0x01
 | 
					            .PollingIntervalMS      = 0x01
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,11 +346,51 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            .EndpointAddress        = (ENDPOINT_DIR_OUT | GENERIC_OUT_EPNUM),
 | 
					            .EndpointAddress        = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM),
 | 
				
			||||||
            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
					            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
				
			||||||
            .EndpointSize           = GENERIC_EPSIZE,
 | 
					            .EndpointSize           = CONSOLE_EPSIZE,
 | 
				
			||||||
            .PollingIntervalMS      = 0x01
 | 
					            .PollingIntervalMS      = 0x01
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					     * Extra
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    .Extra_Interface =
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .InterfaceNumber        = EXTRA_INTERFACE,
 | 
				
			||||||
 | 
					            .AlternateSetting       = 0x00,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .TotalEndpoints         = 1,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .Class                  = HID_CSCP_HIDClass,
 | 
				
			||||||
 | 
					            .SubClass               = HID_CSCP_NonBootSubclass,
 | 
				
			||||||
 | 
					            .Protocol               = HID_CSCP_NonBootProtocol,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .InterfaceStrIndex      = NO_DESCRIPTOR
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .Extra_HID =
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            .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(ExtraReport)
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .Extra_INEndpoint =
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .EndpointAddress        = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM),
 | 
				
			||||||
 | 
					            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
				
			||||||
 | 
					            .EndpointSize           = EXTRA_EPSIZE,
 | 
				
			||||||
 | 
					            .PollingIntervalMS      = 0x01
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -387,10 +472,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
				
			||||||
                Address = &ConfigurationDescriptor.Mouse_HID;
 | 
					                Address = &ConfigurationDescriptor.Mouse_HID;
 | 
				
			||||||
                Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
					                Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case GENERIC_INTERFACE:
 | 
					            case CONSOLE_INTERFACE:
 | 
				
			||||||
                Address = &ConfigurationDescriptor.Console_HID;
 | 
					                Address = &ConfigurationDescriptor.Console_HID;
 | 
				
			||||||
                Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
					                Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					            case EXTRA_INTERFACE:
 | 
				
			||||||
 | 
					                Address = &ConfigurationDescriptor.Extra_HID;
 | 
				
			||||||
 | 
					                Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case HID_DTYPE_Report:
 | 
					        case HID_DTYPE_Report:
 | 
				
			||||||
| 
						 | 
					@ -403,10 +492,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
				
			||||||
                Address = &MouseReport;
 | 
					                Address = &MouseReport;
 | 
				
			||||||
                Size    = sizeof(MouseReport);
 | 
					                Size    = sizeof(MouseReport);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case GENERIC_INTERFACE:
 | 
					            case CONSOLE_INTERFACE:
 | 
				
			||||||
                Address = &ConsoleReport;
 | 
					                Address = &ConsoleReport;
 | 
				
			||||||
                Size    = sizeof(ConsoleReport);
 | 
					                Size    = sizeof(ConsoleReport);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					            case EXTRA_INTERFACE:
 | 
				
			||||||
 | 
					                Address = &ExtraReport;
 | 
				
			||||||
 | 
					                Size    = sizeof(ExtraReport);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,22 +60,34 @@ typedef struct
 | 
				
			||||||
    USB_HID_Descriptor_HID_t              Console_HID;
 | 
					    USB_HID_Descriptor_HID_t              Console_HID;
 | 
				
			||||||
    USB_Descriptor_Endpoint_t             Console_INEndpoint;
 | 
					    USB_Descriptor_Endpoint_t             Console_INEndpoint;
 | 
				
			||||||
    USB_Descriptor_Endpoint_t             Console_OUTEndpoint;
 | 
					    USB_Descriptor_Endpoint_t             Console_OUTEndpoint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Extra HID Interface
 | 
				
			||||||
 | 
					    USB_Descriptor_Interface_t            Extra_Interface;
 | 
				
			||||||
 | 
					    USB_HID_Descriptor_HID_t              Extra_HID;
 | 
				
			||||||
 | 
					    USB_Descriptor_Endpoint_t             Extra_INEndpoint;
 | 
				
			||||||
} USB_Descriptor_Configuration_t;
 | 
					} USB_Descriptor_Configuration_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* nubmer of interfaces */
 | 
				
			||||||
 | 
					#define TOTAL_INTERFACES            4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* index of interface */
 | 
				
			||||||
#define KEYBOARD_INTERFACE          0
 | 
					#define KEYBOARD_INTERFACE          0
 | 
				
			||||||
#define MOUSE_INTERFACE             1
 | 
					#define MOUSE_INTERFACE             1
 | 
				
			||||||
#define GENERIC_INTERFACE           2
 | 
					#define CONSOLE_INTERFACE           2
 | 
				
			||||||
 | 
					#define EXTRA_INTERFACE             3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Endopoint number/size
 | 
					// Endopoint number and size
 | 
				
			||||||
#define KEYBOARD_IN_EPNUM           1
 | 
					#define KEYBOARD_IN_EPNUM           1
 | 
				
			||||||
#define MOUSE_IN_EPNUM              2
 | 
					#define MOUSE_IN_EPNUM              2
 | 
				
			||||||
#define GENERIC_IN_EPNUM            3
 | 
					#define CONSOLE_IN_EPNUM            3
 | 
				
			||||||
#define GENERIC_OUT_EPNUM           4
 | 
					#define CONSOLE_OUT_EPNUM           4
 | 
				
			||||||
 | 
					#define EXTRA_IN_EPNUM              5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HID_EPSIZE                  8
 | 
					#define KEYBOARD_EPSIZE             8
 | 
				
			||||||
#define GENERIC_EPSIZE              8
 | 
					#define MOUSE_EPSIZE                8
 | 
				
			||||||
#define GENERIC_REPORT_SIZE         8
 | 
					#define CONSOLE_EPSIZE              8
 | 
				
			||||||
 | 
					#define EXTRA_EPSIZE                8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
					uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||||
     * |   |Gui |Alt  |                      |Alt  |Gui|   |   |Ctr|
 | 
					     * |   |Gui |Alt  |                      |Alt  |Gui|   |   |Ctr|
 | 
				
			||||||
     * `-----------------------------------------------------------'
 | 
					     * `-----------------------------------------------------------'
 | 
				
			||||||
     */ 
 | 
					     */ 
 | 
				
			||||||
    KEYMAP(ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, \
 | 
					    KEYMAP(PWR, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, \
 | 
				
			||||||
           CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NO,  \
 | 
					           CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NO,  \
 | 
				
			||||||
           LCTL,VOLD,VOLU,MUTE,NO,  NO,  PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
 | 
					           LCTL,VOLD,VOLU,MUTE,NO,  NO,  PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
 | 
				
			||||||
           LSFT,NO,  NO,  NO,  NO,  NO,  PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
 | 
					           LSFT,NO,  NO,  NO,  NO,  NO,  PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,7 +117,7 @@ static void Console_HID_Task(void)
 | 
				
			||||||
	  return;
 | 
						  return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO: impl receivechar()/recvchar()
 | 
					        // TODO: impl receivechar()/recvchar()
 | 
				
			||||||
	Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
 | 
						Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Check to see if a packet has been sent from the host */
 | 
						/* Check to see if a packet has been sent from the host */
 | 
				
			||||||
	if (Endpoint_IsOUTReceived())
 | 
						if (Endpoint_IsOUTReceived())
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,7 @@ static void Console_HID_Task(void)
 | 
				
			||||||
		if (Endpoint_IsReadWriteAllowed())
 | 
							if (Endpoint_IsReadWriteAllowed())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Create a temporary buffer to hold the read in report from the host */
 | 
								/* Create a temporary buffer to hold the read in report from the host */
 | 
				
			||||||
			uint8_t ConsoleData[GENERIC_REPORT_SIZE];
 | 
								uint8_t ConsoleData[CONSOLE_EPSIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Read Console Report Data */
 | 
								/* Read Console Report Data */
 | 
				
			||||||
			Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
 | 
								Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
 | 
				
			||||||
| 
						 | 
					@ -140,7 +140,7 @@ static void Console_HID_Task(void)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* IN packet */
 | 
					        /* IN packet */
 | 
				
			||||||
	Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
 | 
						Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
 | 
				
			||||||
        // send IN packet
 | 
					        // send IN packet
 | 
				
			||||||
	if (Endpoint_IsINReady())
 | 
						if (Endpoint_IsINReady())
 | 
				
			||||||
            Endpoint_ClearIN();
 | 
					            Endpoint_ClearIN();
 | 
				
			||||||
| 
						 | 
					@ -169,17 +169,21 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Setup Keyboard HID Report Endpoints */
 | 
					    /* Setup Keyboard HID Report Endpoints */
 | 
				
			||||||
    ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
					    ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
				
			||||||
                                                HID_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
					                                                KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Setup Mouse HID Report Endpoint */
 | 
					    /* Setup Mouse HID Report Endpoint */
 | 
				
			||||||
    ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
					    ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
				
			||||||
                                                HID_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
					                                                MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Setup Console HID Report Endpoints */
 | 
					    /* Setup Console HID Report Endpoints */
 | 
				
			||||||
    ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
					    ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
				
			||||||
                                                GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
					                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
				
			||||||
    ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
 | 
					    ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
 | 
				
			||||||
                                                GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
					                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Setup Extra HID Report Endpoint */
 | 
				
			||||||
 | 
					    ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
 | 
				
			||||||
 | 
					                                                EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -223,7 +227,9 @@ void EVENT_USB_Device_ControlRequest(void)
 | 
				
			||||||
                    ReportData = (uint8_t*)&mouse_report_sent;
 | 
					                    ReportData = (uint8_t*)&mouse_report_sent;
 | 
				
			||||||
                    ReportSize = sizeof(mouse_report_sent);
 | 
					                    ReportSize = sizeof(mouse_report_sent);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case GENERIC_INTERFACE:
 | 
					                case CONSOLE_INTERFACE:
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case EXTRA_INTERFACE:
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -254,7 +260,9 @@ void EVENT_USB_Device_ControlRequest(void)
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case MOUSE_INTERFACE:
 | 
					                case MOUSE_INTERFACE:
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case GENERIC_INTERFACE:
 | 
					                case CONSOLE_INTERFACE:
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case EXTRA_INTERFACE:
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,12 +309,7 @@ static void send_mouse(report_mouse_t *report)
 | 
				
			||||||
    if (Endpoint_IsReadWriteAllowed())
 | 
					    if (Endpoint_IsReadWriteAllowed())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        /* Write Mouse Report Data */
 | 
					        /* Write Mouse Report Data */
 | 
				
			||||||
        /* Mouse report data structure
 | 
					        Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);
 | 
				
			||||||
         * LUFA: { buttons, x, y }
 | 
					 | 
				
			||||||
         * tmk:  { buttons, x, y, v, h }
 | 
					 | 
				
			||||||
         */
 | 
					 | 
				
			||||||
        //Endpoint_Write_Stream_LE((uint8_t *)report+1, 3, NULL);
 | 
					 | 
				
			||||||
        Endpoint_Write_Stream_LE(report, 3, NULL);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Finalize the stream transfer to send the last packet */
 | 
					        /* Finalize the stream transfer to send the last packet */
 | 
				
			||||||
        Endpoint_ClearIN();
 | 
					        Endpoint_ClearIN();
 | 
				
			||||||
| 
						 | 
					@ -314,12 +317,35 @@ static void send_mouse(report_mouse_t *report)
 | 
				
			||||||
    mouse_report_sent = *report;
 | 
					    mouse_report_sent = *report;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    uint8_t  report_id;
 | 
				
			||||||
 | 
					    uint16_t usage;
 | 
				
			||||||
 | 
					} __attribute__ ((packed)) report_extra_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_system(uint16_t data)
 | 
					static void send_system(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
				
			||||||
 | 
					    if (Endpoint_IsReadWriteAllowed()) {
 | 
				
			||||||
 | 
					        report_extra_t r = {
 | 
				
			||||||
 | 
					            .report_id = REPORT_ID_SYSTEM,
 | 
				
			||||||
 | 
					            .usage = data
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
				
			||||||
 | 
					        Endpoint_ClearIN();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_consumer(uint16_t data)
 | 
					static void send_consumer(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
 | 
				
			||||||
 | 
					    if (Endpoint_IsReadWriteAllowed()) {
 | 
				
			||||||
 | 
					        report_extra_t r = {
 | 
				
			||||||
 | 
					            .report_id = REPORT_ID_CONSUMER,
 | 
				
			||||||
 | 
					            .usage = data
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
 | 
				
			||||||
 | 
					        Endpoint_ClearIN();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -331,7 +357,7 @@ int8_t sendchar(uint8_t c)
 | 
				
			||||||
    if (USB_DeviceState != DEVICE_STATE_Configured)
 | 
					    if (USB_DeviceState != DEVICE_STATE_Configured)
 | 
				
			||||||
      return -1;
 | 
					      return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
 | 
					    Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint8_t timeout = 10;
 | 
					    uint8_t timeout = 10;
 | 
				
			||||||
    uint16_t prevFN = USB_Device_GetFrameNumber();
 | 
					    uint16_t prevFN = USB_Device_GetFrameNumber();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,11 +62,6 @@ int main(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    debug("initForUsbConnectivity()\n");
 | 
					    debug("initForUsbConnectivity()\n");
 | 
				
			||||||
    initForUsbConnectivity();
 | 
					    initForUsbConnectivity();
 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
    while(--i){         /* To configured */
 | 
					 | 
				
			||||||
        usbPoll();
 | 
					 | 
				
			||||||
        _delay_ms(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    debug("main loop\n");
 | 
					    debug("main loop\n");
 | 
				
			||||||
    while (1) {
 | 
					    while (1) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,32 +107,25 @@ static void send_mouse(report_mouse_t *report)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    uint8_t report_id;
 | 
					    uint8_t  report_id;
 | 
				
			||||||
    uint8_t data0;
 | 
					    uint16_t usage;
 | 
				
			||||||
    uint8_t data1;
 | 
					} __attribute__ ((packed)) report_extra_t;
 | 
				
			||||||
} __attribute__ ((packed)) vusb_system_report_t;
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_system(uint16_t data)
 | 
					static void send_system(uint16_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
/*
 | 
					    static uint16_t last_data = 0;
 | 
				
			||||||
    // Not need static?
 | 
					    if (data == last_data) return;
 | 
				
			||||||
    static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
 | 
					    last_data = data;
 | 
				
			||||||
    report[1] = data&0xFF;
 | 
					
 | 
				
			||||||
    report[2] = (data>>8)&0xFF;
 | 
					    report_extra_t report = {
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
    vusb_system_report_t r = {
 | 
					 | 
				
			||||||
        .report_id = REPORT_ID_SYSTEM,
 | 
					        .report_id = REPORT_ID_SYSTEM,
 | 
				
			||||||
        .data0 = data&0xFF,
 | 
					        .usage = data
 | 
				
			||||||
        .data1 = (data>>8)&0xFF
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    if (usbInterruptIsReady3()) {
 | 
					    if (usbInterruptIsReady3()) {
 | 
				
			||||||
        usbSetInterrupt3((void *)&r, sizeof(vusb_system_report_t));
 | 
					        usbSetInterrupt3((void *)&report, sizeof(report));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_consumer(uint16_t data)
 | 
					static void send_consumer(uint16_t data)
 | 
				
			||||||
| 
						 | 
					@ -141,10 +134,10 @@ static void send_consumer(uint16_t data)
 | 
				
			||||||
    if (data == last_data) return;
 | 
					    if (data == last_data) return;
 | 
				
			||||||
    last_data = data;
 | 
					    last_data = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Not need static?
 | 
					    report_extra_t report = {
 | 
				
			||||||
    static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 };
 | 
					        .report_id = REPORT_ID_CONSUMER,
 | 
				
			||||||
    report[1] = data&0xFF;
 | 
					        .usage = data
 | 
				
			||||||
    report[2] = (data>>8)&0xFF;
 | 
					    };
 | 
				
			||||||
    if (usbInterruptIsReady3()) {
 | 
					    if (usbInterruptIsReady3()) {
 | 
				
			||||||
        usbSetInterrupt3((void *)&report, sizeof(report));
 | 
					        usbSetInterrupt3((void *)&report, sizeof(report));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue