diff options
Diffstat (limited to 'protocol/lufa')
-rw-r--r-- | protocol/lufa/descriptor.c | 130 | ||||
-rw-r--r-- | protocol/lufa/descriptor.h | 50 | ||||
-rw-r--r-- | protocol/lufa/lufa.c | 47 |
3 files changed, 139 insertions, 88 deletions
diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c index 3c98819ff7..ff98d88769 100644 --- a/protocol/lufa/descriptor.c +++ b/protocol/lufa/descriptor.c @@ -80,6 +80,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = HID_RI_END_COLLECTION(0), }; +#ifdef MOUSE_ENABLE const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = { HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ @@ -127,29 +128,10 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0), }; - -const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = -{ - HID_RI_USAGE_PAGE(16, 0xFF31), /* Vendor Page(PJRC Teensy compatible) */ - HID_RI_USAGE(8, 0x74), /* Vendor Usage(PJRC Teensy compatible) */ - HID_RI_COLLECTION(8, 0x01), /* Application */ - HID_RI_USAGE(8, 0x75), /* Vendor Usage 0x75 */ - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), - HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), - HID_RI_REPORT_SIZE(8, 0x08), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_RI_USAGE(8, 0x76), /* Vendor Usage 0x76 */ - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), - HID_RI_REPORT_COUNT(8, CONSOLE_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 EXTRAKEY_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] = +const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = { HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x80), /* System Control */ @@ -179,6 +161,28 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] = }; #endif +#ifdef CONSOLE_ENABLE +const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = +{ + HID_RI_USAGE_PAGE(16, 0xFF31), /* Vendor Page(PJRC Teensy compatible) */ + HID_RI_USAGE(8, 0x74), /* Vendor Usage(PJRC Teensy compatible) */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_USAGE(8, 0x75), /* Vendor Usage 0x75 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), + HID_RI_REPORT_SIZE(8, 0x08), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_USAGE(8, 0x76), /* Vendor Usage 0x76 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_REPORT_COUNT(8, CONSOLE_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 NKRO_ENABLE const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = { @@ -342,16 +346,17 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = #endif /* - * Console + * Extra */ - .Console_Interface = +#ifdef EXTRAKEY_ENABLE + .Extrakey_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = CONSOLE_INTERFACE, + .InterfaceNumber = EXTRAKEY_INTERFACE, .AlternateSetting = 0x00, - .TotalEndpoints = 2, + .TotalEndpoints = 1, .Class = HID_CSCP_HIDClass, .SubClass = HID_CSCP_NonBootSubclass, @@ -360,7 +365,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .InterfaceStrIndex = NO_DESCRIPTOR }, - .Console_HID = + .Extrakey_HID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -368,41 +373,32 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .CountryCode = 0x00, .TotalReportDescriptors = 1, .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(ConsoleReport) + .HIDReportLength = sizeof(ExtrakeyReport) }, - .Console_INEndpoint = + .Extrakey_INEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM), + .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CONSOLE_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .Console_OUTEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CONSOLE_EPSIZE, + .EndpointSize = EXTRAKEY_EPSIZE, .PollingIntervalMS = 0x01 }, +#endif /* - * Extra + * Console */ -#ifdef EXTRAKEY_ENABLE - .Extra_Interface = +#ifdef CONSOLE_ENABLE + .Console_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = EXTRA_INTERFACE, + .InterfaceNumber = CONSOLE_INTERFACE, .AlternateSetting = 0x00, - .TotalEndpoints = 1, + .TotalEndpoints = 2, .Class = HID_CSCP_HIDClass, .SubClass = HID_CSCP_NonBootSubclass, @@ -411,7 +407,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .InterfaceStrIndex = NO_DESCRIPTOR }, - .Extra_HID = + .Console_HID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -419,16 +415,26 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .CountryCode = 0x00, .TotalReportDescriptors = 1, .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(ExtraReport) + .HIDReportLength = sizeof(ConsoleReport) }, - .Extra_INEndpoint = + .Console_INEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - .EndpointAddress = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM), + .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = EXTRA_EPSIZE, + .EndpointSize = CONSOLE_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .Console_OUTEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CONSOLE_EPSIZE, .PollingIntervalMS = 0x01 }, #endif @@ -515,13 +521,15 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif - case CONSOLE_INTERFACE: - Address = &ConfigurationDescriptor.Console_HID; +#ifdef EXTRAKEY_ENABLE + case EXTRAKEY_INTERFACE: + Address = &ConfigurationDescriptor.Extrakey_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; -#ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: - Address = &ConfigurationDescriptor.Extra_HID; +#endif +#ifdef CONSOLE_ENABLE + case CONSOLE_INTERFACE: + Address = &ConfigurationDescriptor.Console_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif @@ -539,15 +547,17 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(MouseReport); break; #endif +#ifdef EXTRAKEY_ENABLE + case EXTRAKEY_INTERFACE: + Address = &ExtrakeyReport; + Size = sizeof(ExtrakeyReport); + break; +#endif +#ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConsoleReport; Size = sizeof(ConsoleReport); break; -#ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: - Address = &ExtraReport; - Size = sizeof(ExtraReport); - break; #endif } break; diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h index 09fb24acc1..44f20d5a26 100644 --- a/protocol/lufa/descriptor.h +++ b/protocol/lufa/descriptor.h @@ -57,24 +57,26 @@ typedef struct USB_HID_Descriptor_HID_t Keyboard_HID; USB_Descriptor_Endpoint_t Keyboard_INEndpoint; - // Mouse HID Interface #ifdef MOUSE_ENABLE + // Mouse HID Interface USB_Descriptor_Interface_t Mouse_Interface; USB_HID_Descriptor_HID_t Mouse_HID; USB_Descriptor_Endpoint_t Mouse_INEndpoint; #endif +#ifdef EXTRAKEY_ENABLE + // Extrakey HID Interface + USB_Descriptor_Interface_t Extrakey_Interface; + USB_HID_Descriptor_HID_t Extrakey_HID; + USB_Descriptor_Endpoint_t Extrakey_INEndpoint; +#endif + +#ifdef CONSOLE_ENABLE // Console HID Interface USB_Descriptor_Interface_t Console_Interface; USB_HID_Descriptor_HID_t Console_HID; USB_Descriptor_Endpoint_t Console_INEndpoint; USB_Descriptor_Endpoint_t Console_OUTEndpoint; - - // Extra HID Interface -#ifdef EXTRAKEY_ENABLE - USB_Descriptor_Interface_t Extra_Interface; - USB_HID_Descriptor_HID_t Extra_HID; - USB_Descriptor_Endpoint_t Extra_INEndpoint; #endif } USB_Descriptor_Configuration_t; @@ -89,12 +91,16 @@ typedef struct #endif #ifdef EXTRAKEY_ENABLE -# define EXTRA_INTERFACE (MOUSE_INTERFACE + 1) +# define EXTRAKEY_INTERFACE (MOUSE_INTERFACE + 1) #else -# define EXTRA_INTERFACE MOUSE_INTERFACE +# define EXTRAKEY_INTERFACE MOUSE_INTERFACE #endif -#define CONSOLE_INTERFACE (EXTRA_INTERFACE + 1) +#ifdef CONSOLE_ENABLE +# define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1) +#else +# define CONSOLE_INTERFACE EXTRAKEY_INTERFACE +#endif /* nubmer of interfaces */ @@ -103,15 +109,29 @@ typedef struct // Endopoint number and size #define KEYBOARD_IN_EPNUM 1 -#define MOUSE_IN_EPNUM 2 -#define CONSOLE_IN_EPNUM 3 -#define CONSOLE_OUT_EPNUM 4 -#define EXTRA_IN_EPNUM 5 + +#ifdef MOUSE_ENABLE +# define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1) +#else +# define MOUSE_IN_EPNUM KEYBOARD_IN_EPNUM +#endif + +#ifdef EXTRAKEY_ENABLE +# define EXTRAKEY_IN_EPNUM (MOUSE_IN_EPNUM + 1) +#else +# 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 + 2) +#endif + #define KEYBOARD_EPSIZE 8 #define MOUSE_EPSIZE 8 +#define EXTRAKEY_EPSIZE 8 #define CONSOLE_EPSIZE 32 -#define EXTRA_EPSIZE 8 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 10511ba67b..99d241ded0 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -111,6 +111,7 @@ void SetupHardware(void) USB_Device_EnableSOFEvents(); } +#ifdef CONSOLE_ENABLE static void Console_Task(void) { /* Device must be connected and configured for the task to run */ @@ -146,6 +147,11 @@ static void Console_Task(void) /* IN packet */ Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); + + // fill empty bank + while (Endpoint_IsReadWriteAllowed()) + Endpoint_Write_8(0); + // flash senchar packet if (Endpoint_IsINReady()) { Endpoint_ClearIN(); @@ -153,6 +159,11 @@ static void Console_Task(void) Endpoint_SelectEndpoint(ep); } +#else +static void Console_Task(void) +{ +} +#endif /******************************************************************************* @@ -168,14 +179,9 @@ void EVENT_USB_Device_Disconnect(void) { } -#define CONSOLE_TASK_INTERVAL 50 void EVENT_USB_Device_StartOfFrame(void) { - static uint8_t interval; - if (++interval == CONSOLE_TASK_INTERVAL) { - Console_Task(); - interval = 0; - } + Console_Task(); } /** Event handler for the USB_ConfigurationChanged event. @@ -197,15 +203,17 @@ void EVENT_USB_Device_ConfigurationChanged(void) #ifdef EXTRAKEY_ENABLE /* Setup Extra HID Report Endpoint */ - ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); #endif +#ifdef CONSOLE_ENABLE /* Setup Console HID Report Endpoints */ ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE); ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); +#endif } /* @@ -371,7 +379,7 @@ static void send_system(uint16_t data) .report_id = REPORT_ID_SYSTEM, .usage = data }; - Endpoint_SelectEndpoint(EXTRA_IN_EPNUM); + Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); if (Endpoint_IsReadWriteAllowed()) { Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); @@ -384,7 +392,7 @@ static void send_consumer(uint16_t data) .report_id = REPORT_ID_CONSUMER, .usage = data }; - Endpoint_SelectEndpoint(EXTRA_IN_EPNUM); + Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); if (Endpoint_IsReadWriteAllowed()) { Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); @@ -395,12 +403,14 @@ static void send_consumer(uint16_t data) /******************************************************************************* * sendchar ******************************************************************************/ -#define SEND_TIMEOUT 10 +#ifdef CONSOLE_ENABLE +#define SEND_TIMEOUT 5 int8_t sendchar(uint8_t c) { if (USB_DeviceState != DEVICE_STATE_Configured) return -1; + uint8_t ep = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); uint8_t timeout = SEND_TIMEOUT; @@ -411,11 +421,15 @@ int8_t sendchar(uint8_t c) case DEVICE_STATE_Suspended: return -1; } - if (Endpoint_IsStalled()) + if (Endpoint_IsStalled()) { + Endpoint_SelectEndpoint(ep); return -1; + } if (prevFN != USB_Device_GetFrameNumber()) { - if (!(timeout--)) + if (!(timeout--)) { + Endpoint_SelectEndpoint(ep); return -1; + } prevFN = USB_Device_GetFrameNumber(); } } @@ -426,5 +440,12 @@ int8_t sendchar(uint8_t c) if (!Endpoint_IsReadWriteAllowed()) Endpoint_ClearIN(); + Endpoint_SelectEndpoint(ep); + return 0; +} +#else +int8_t sendchar(uint8_t c) +{ return 0; } +#endif |