mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Merge pull request #921 from Wilba6582/raw_hid
Initial version of Raw HID interface
This commit is contained in:
		
						commit
						c87d039839
					
				| @ -50,6 +50,10 @@ ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) | ||||
|     TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(strip $(RAW_ENABLE)), yes) | ||||
|     TMK_COMMON_DEFS += -DRAW_ENABLE | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(strip $(CONSOLE_ENABLE)), yes) | ||||
|     TMK_COMMON_DEFS += -DCONSOLE_ENABLE | ||||
| else | ||||
|  | ||||
							
								
								
									
										8
									
								
								tmk_core/common/raw_hid.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tmk_core/common/raw_hid.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| #ifndef _RAW_HID_H_ | ||||
| #define _RAW_HID_H_ | ||||
| 
 | ||||
| void raw_hid_receive( uint8_t *data, uint8_t length ); | ||||
| 
 | ||||
| void raw_hid_send( uint8_t *data, uint8_t length ); | ||||
| 
 | ||||
| #endif | ||||
| @ -164,6 +164,28 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RAW_ENABLE | ||||
| const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = | ||||
| { | ||||
|     HID_RI_USAGE_PAGE(16, 0xFF60), /* Vendor Page 0xFF60 */ | ||||
|     HID_RI_USAGE(8, 0x61), /* Vendor Usage 0x61 */ | ||||
|     HID_RI_COLLECTION(8, 0x01), /* Application */ | ||||
|         HID_RI_USAGE(8, 0x62), /* Vendor Usage 0x62 */ | ||||
|         HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||||
|         HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), | ||||
|         HID_RI_REPORT_COUNT(8, RAW_EPSIZE), | ||||
|         HID_RI_REPORT_SIZE(8, 0x08), | ||||
|         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||||
|         HID_RI_USAGE(8, 0x63), /* Vendor Usage 0x63 */ | ||||
|         HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||||
|         HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), | ||||
|         HID_RI_REPORT_COUNT(8, RAW_EPSIZE), | ||||
|         HID_RI_REPORT_SIZE(8, 0x08), | ||||
|         HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | ||||
|     HID_RI_END_COLLECTION(0), | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
| const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = | ||||
| { | ||||
| @ -400,6 +422,58 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | ||||
| #endif | ||||
| 
 | ||||
| 		/*
 | ||||
| 	     * Raw | ||||
| 	     */ | ||||
| 	#ifdef RAW_ENABLE | ||||
| 	    .Raw_Interface = | ||||
| 	        { | ||||
| 	            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 	            .InterfaceNumber        = RAW_INTERFACE, | ||||
| 	            .AlternateSetting       = 0x00, | ||||
| 
 | ||||
| 	            .TotalEndpoints         = 2, | ||||
| 
 | ||||
| 	            .Class                  = HID_CSCP_HIDClass, | ||||
| 	            .SubClass               = HID_CSCP_NonBootSubclass, | ||||
| 	            .Protocol               = HID_CSCP_NonBootProtocol, | ||||
| 
 | ||||
| 	            .InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 	        }, | ||||
| 
 | ||||
| 	    .Raw_HID = | ||||
| 	        { | ||||
| 	            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
| 
 | ||||
| 	            .HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 	            .CountryCode            = 0x00, | ||||
| 	            .TotalReportDescriptors = 1, | ||||
| 	            .HIDReportType          = HID_DTYPE_Report, | ||||
| 	            .HIDReportLength        = sizeof(RawReport) | ||||
| 	        }, | ||||
| 
 | ||||
| 	    .Raw_INEndpoint = | ||||
| 	        { | ||||
| 	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 	            .EndpointAddress        = (ENDPOINT_DIR_IN | RAW_IN_EPNUM), | ||||
| 	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 	            .EndpointSize           = RAW_EPSIZE, | ||||
| 	            .PollingIntervalMS      = 0x01 | ||||
| 	        }, | ||||
| 
 | ||||
| 	    .Raw_OUTEndpoint = | ||||
| 	        { | ||||
| 	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 	            .EndpointAddress        = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM), | ||||
| 	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 	            .EndpointSize           = RAW_EPSIZE, | ||||
| 	            .PollingIntervalMS      = 0x01 | ||||
| 	        }, | ||||
| 	#endif | ||||
| 
 | ||||
|     /*
 | ||||
|      * Console | ||||
|      */ | ||||
| #ifdef CONSOLE_ENABLE | ||||
| @ -754,7 +828,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | ||||
|                     .PollingIntervalMS      = 0x05 | ||||
|             }, | ||||
| #endif | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| @ -846,6 +919,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
|                 Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
|                 break; | ||||
| #endif | ||||
| #ifdef RAW_ENABLE | ||||
|             case RAW_INTERFACE: | ||||
|                 Address = &ConfigurationDescriptor.Raw_HID; | ||||
|                 Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
|                 break; | ||||
| #endif | ||||
| #ifdef CONSOLE_ENABLE | ||||
|             case CONSOLE_INTERFACE: | ||||
|                 Address = &ConfigurationDescriptor.Console_HID; | ||||
| @ -878,6 +957,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
|                 Size    = sizeof(ExtrakeyReport); | ||||
|                 break; | ||||
| #endif | ||||
| #ifdef RAW_ENABLE | ||||
|             case RAW_INTERFACE: | ||||
|                 Address = &RawReport; | ||||
|                 Size    = sizeof(RawReport); | ||||
|                 break; | ||||
| #endif | ||||
| #ifdef CONSOLE_ENABLE | ||||
|             case CONSOLE_INTERFACE: | ||||
|                 Address = &ConsoleReport; | ||||
|  | ||||
| @ -71,6 +71,14 @@ typedef struct | ||||
|     USB_Descriptor_Endpoint_t             Extrakey_INEndpoint; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RAW_ENABLE | ||||
|     // Raw HID Interface
 | ||||
|     USB_Descriptor_Interface_t            Raw_Interface; | ||||
|     USB_HID_Descriptor_HID_t              Raw_HID; | ||||
|     USB_Descriptor_Endpoint_t             Raw_INEndpoint; | ||||
|     USB_Descriptor_Endpoint_t             Raw_OUTEndpoint; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
|     // Console HID Interface
 | ||||
|     USB_Descriptor_Interface_t            Console_Interface; | ||||
| @ -137,10 +145,16 @@ typedef struct | ||||
| #   define EXTRAKEY_INTERFACE       MOUSE_INTERFACE | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
| #   define CONSOLE_INTERFACE        (EXTRAKEY_INTERFACE + 1) | ||||
| #ifdef RAW_ENABLE | ||||
| #   define RAW_INTERFACE        	(EXTRAKEY_INTERFACE + 1) | ||||
| #else | ||||
| #   define CONSOLE_INTERFACE        EXTRAKEY_INTERFACE | ||||
| #   define RAW_INTERFACE        	EXTRAKEY_INTERFACE | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
| #   define CONSOLE_INTERFACE        (RAW_INTERFACE + 1) | ||||
| #else | ||||
| #   define CONSOLE_INTERFACE        RAW_INTERFACE | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NKRO_ENABLE | ||||
| @ -182,12 +196,19 @@ typedef struct | ||||
| #   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
| #   define CONSOLE_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1) | ||||
| #   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 1) | ||||
| //#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
 | ||||
| #ifdef RAW_ENABLE | ||||
| #   define RAW_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1) | ||||
| #   define RAW_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2) | ||||
| #else | ||||
| #   define CONSOLE_OUT_EPNUM        EXTRAKEY_IN_EPNUM | ||||
| #   define RAW_OUT_EPNUM        EXTRAKEY_IN_EPNUM | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
| #   define CONSOLE_IN_EPNUM         (RAW_OUT_EPNUM + 1) | ||||
| //#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 2)
 | ||||
| #   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 1) | ||||
| #else | ||||
| #   define CONSOLE_OUT_EPNUM        RAW_OUT_EPNUM | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NKRO_ENABLE | ||||
| @ -217,7 +238,6 @@ typedef struct | ||||
| #   define CDC_OUT_EPNUM	MIDI_STREAM_OUT_EPNUM | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #if defined(__AVR_ATmega32U2__) && CDC_OUT_EPNUM > 4 | ||||
| # error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL)" | ||||
| #endif | ||||
| @ -225,6 +245,7 @@ typedef struct | ||||
| #define KEYBOARD_EPSIZE             8 | ||||
| #define MOUSE_EPSIZE                8 | ||||
| #define EXTRAKEY_EPSIZE             8 | ||||
| #define RAW_EPSIZE              	32 | ||||
| #define CONSOLE_EPSIZE              32 | ||||
| #define NKRO_EPSIZE                 32 | ||||
| #define MIDI_STREAM_EPSIZE          64 | ||||
|  | ||||
| @ -84,6 +84,10 @@ | ||||
|   #include "sysex_tools.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RAW_ENABLE | ||||
| 	#include "raw_hid.h" | ||||
| #endif | ||||
| 
 | ||||
| uint8_t keyboard_idle = 0; | ||||
| /* 0: Boot Protocol, 1: Report Protocol(default) */ | ||||
| uint8_t keyboard_protocol = 1; | ||||
| @ -179,6 +183,80 @@ USB_ClassInfo_CDC_Device_t cdc_device = | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RAW_ENABLE | ||||
| 
 | ||||
| void raw_hid_send( uint8_t *data, uint8_t length ) | ||||
| { | ||||
| 	// TODO: implement variable size packet
 | ||||
| 	if ( length != RAW_EPSIZE ) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (USB_DeviceState != DEVICE_STATE_Configured) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO: decide if we allow calls to raw_hid_send() in the middle
 | ||||
| 	// of other endpoint usage.
 | ||||
| 	uint8_t ep = Endpoint_GetCurrentEndpoint(); | ||||
| 
 | ||||
| 	Endpoint_SelectEndpoint(RAW_IN_EPNUM); | ||||
| 
 | ||||
| 	// Check to see if the host is ready to accept another packet
 | ||||
| 	if (Endpoint_IsINReady()) | ||||
| 	{ | ||||
| 		// Write data
 | ||||
| 		Endpoint_Write_Stream_LE(data, RAW_EPSIZE, NULL); | ||||
| 		// Finalize the stream transfer to send the last packet
 | ||||
| 		Endpoint_ClearIN(); | ||||
| 	} | ||||
| 
 | ||||
| 	Endpoint_SelectEndpoint(ep); | ||||
| } | ||||
| 
 | ||||
| __attribute__ ((weak)) | ||||
| void raw_hid_receive( uint8_t *data, uint8_t length ) | ||||
| { | ||||
| 	// Users should #include "raw_hid.h" in their own code
 | ||||
| 	// and implement this function there. Leave this as weak linkage
 | ||||
| 	// so users can opt to not handle data coming in.
 | ||||
| } | ||||
| 
 | ||||
| static void raw_hid_task(void) | ||||
| { | ||||
| 	// Create a temporary buffer to hold the read in data from the host
 | ||||
| 	uint8_t data[RAW_EPSIZE]; | ||||
| 	bool data_read = false; | ||||
| 
 | ||||
| 	// Device must be connected and configured for the task to run
 | ||||
| 	if (USB_DeviceState != DEVICE_STATE_Configured) | ||||
| 	return; | ||||
| 
 | ||||
| 	Endpoint_SelectEndpoint(RAW_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()) | ||||
| 		{ | ||||
| 			/* Read data */ | ||||
| 			Endpoint_Read_Stream_LE(data, sizeof(data), NULL); | ||||
| 			data_read = true; | ||||
| 		} | ||||
| 
 | ||||
| 		// Finalize the stream transfer to receive the last packet
 | ||||
| 		Endpoint_ClearOUT(); | ||||
| 
 | ||||
| 		if ( data_read ) | ||||
| 		{ | ||||
| 			raw_hid_receive( data, sizeof(data) ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|  * Console | ||||
| @ -298,6 +376,8 @@ void EVENT_USB_Device_WakeUp() | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
| static bool console_flush = false; | ||||
| #define CONSOLE_FLUSH_SET(b)   do { \ | ||||
| @ -317,6 +397,7 @@ void EVENT_USB_Device_StartOfFrame(void) | ||||
|     Console_Task(); | ||||
|     console_flush = false; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /** Event handler for the USB_ConfigurationChanged event.
 | ||||
| @ -345,6 +426,14 @@ void EVENT_USB_Device_ConfigurationChanged(void) | ||||
|                                      EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RAW_ENABLE | ||||
|     /* Setup Raw HID Report Endpoints */ | ||||
|     ConfigSuccess &= ENDPOINT_CONFIG(RAW_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ||||
| 									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE); | ||||
|     ConfigSuccess &= ENDPOINT_CONFIG(RAW_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, | ||||
| 									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONSOLE_ENABLE | ||||
|     /* Setup Console HID Report Endpoints */ | ||||
|     ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ||||
| @ -1124,9 +1213,14 @@ int main(void) | ||||
|         CDC_Device_USBTask(&cdc_device); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RAW_ENABLE | ||||
|         raw_hid_task(); | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(INTERRUPT_CONTROL_ENDPOINT) | ||||
|         USB_USBTask(); | ||||
| #endif | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jack Humbert
						Jack Humbert