mirror of
https://github.com/qmk/qmk_firmware.git
synced 2026-09-30 05:50:43 +02:00
Initial PoC for Dynamic lighting support
This commit is contained in:
@@ -51,6 +51,10 @@
|
||||
extern keymap_config_t keymap_config;
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
# include "lamparray.h"
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
* Global interface variables and declarations
|
||||
* ---------------------------------------------------------
|
||||
@@ -217,6 +221,24 @@ static const USBEndpointConfig digitizer_ep_config = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
/* LampArray endpoint state structure */
|
||||
static USBInEndpointState lamparray_ep_state;
|
||||
|
||||
/* LampArray endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
|
||||
static const USBEndpointConfig lamparray_ep_config = {
|
||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||
NULL, /* SETUP packet notification callback */
|
||||
dummy_usb_cb, /* IN notification callback */
|
||||
NULL, /* OUT notification callback */
|
||||
LAMPARRAY_EPSIZE, /* IN maximum packet size */
|
||||
0, /* OUT maximum packet size */
|
||||
&lamparray_ep_state, /* IN Endpoint state */
|
||||
NULL, /* OUT endpoint state */
|
||||
usb_lld_endpoint_fields /* USB driver specific endpoint fields */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef USB_ENDPOINTS_ARE_REORDERABLE
|
||||
typedef struct {
|
||||
size_t queue_capacity_in;
|
||||
@@ -509,6 +531,9 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
|
||||
#endif
|
||||
#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
|
||||
usbInitEndpointI(usbp, DIGITIZER_IN_EPNUM, &digitizer_ep_config);
|
||||
#endif
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
usbInitEndpointI(usbp, LAMPARRAY_IN_EPNUM, &lamparray_ep_config);
|
||||
#endif
|
||||
for (int i = 0; i < NUM_USB_DRIVERS; i++) {
|
||||
#ifdef USB_ENDPOINTS_ARE_REORDERABLE
|
||||
@@ -586,6 +611,19 @@ static void set_led_transfer_cb(USBDriver *usbp) {
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
static universal_lamparray_response_t universal_lamparray_report_buf;
|
||||
|
||||
static void set_lamparray_transfer_cb(USBDriver *usbp) {
|
||||
// handle directly to avoid sync issues with get
|
||||
if (universal_lamparray_report_buf.report_id == LAMPARRAY_REPORT_ID_ATTRIBUTES_REQUEST) {
|
||||
lamparray_set_attributes_response(universal_lamparray_report_buf.lamp_id);
|
||||
} else {
|
||||
lamparray_queue_request(&universal_lamparray_report_buf);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool usb_requests_hook_cb(USBDriver *usbp) {
|
||||
usb_control_request_t *setup = (usb_control_request_t *)usbp->setup;
|
||||
|
||||
@@ -623,6 +661,24 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
|
||||
}
|
||||
# endif
|
||||
#endif /* SHARED_EP_ENABLE */
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
case LAMPARRAY_INTERFACE:
|
||||
switch (setup->wValue.lbyte) {
|
||||
case LAMPARRAY_REPORT_ID_ATTRIBUTES:
|
||||
static lamparray_attributes_report_t ret = {.report_id = LAMPARRAY_REPORT_ID_ATTRIBUTES};
|
||||
lamparray_get_attributes(&ret.attributes);
|
||||
|
||||
usbSetupTransfer(usbp, (uint8_t *)&ret, sizeof(ret), NULL);
|
||||
return TRUE;
|
||||
case LAMPARRAY_REPORT_ID_ATTRIBUTES_RESPONSE:
|
||||
static lamparray_attributes_response_report_t res = {.report_id = LAMPARRAY_REPORT_ID_ATTRIBUTES_RESPONSE};
|
||||
lamparray_get_attributes_response(&res.attributes_response);
|
||||
|
||||
usbSetupTransfer(usbp, (uint8_t *)&res, sizeof(res), NULL);
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
universal_report_blank.report_id = setup->wValue.lbyte;
|
||||
usbSetupTransfer(usbp, (uint8_t *)&universal_report_blank, setup->wLength, NULL);
|
||||
@@ -653,6 +709,18 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
|
||||
#endif
|
||||
usbSetupTransfer(usbp, set_report_buf, sizeof(set_report_buf), set_led_transfer_cb);
|
||||
return true;
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
case LAMPARRAY_INTERFACE:
|
||||
switch (setup->wValue.lbyte) {
|
||||
case LAMPARRAY_REPORT_ID_ATTRIBUTES_REQUEST:
|
||||
case LAMPARRAY_REPORT_ID_RANGE_UPDATE:
|
||||
case LAMPARRAY_REPORT_ID_MULTI_UPDATE:
|
||||
case LAMPARRAY_REPORT_ID_CONTROL:
|
||||
usbSetupTransfer(usbp, (uint8_t *)&universal_lamparray_report_buf, sizeof(universal_lamparray_report_buf), set_lamparray_transfer_cb);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -67,6 +67,10 @@
|
||||
# include "raw_hid.h"
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
# include "lamparray.h"
|
||||
#endif
|
||||
|
||||
uint8_t keyboard_idle = 0;
|
||||
/* 0: Boot Protocol, 1: Report Protocol(default) */
|
||||
uint8_t keyboard_protocol = 1;
|
||||
@@ -409,6 +413,11 @@ void EVENT_USB_Device_ConfigurationChanged(void) {
|
||||
ConfigSuccess &= Endpoint_ConfigureEndpoint((DIGITIZER_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, DIGITIZER_EPSIZE, 1);
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
/* Setup LampArray endpoint */
|
||||
ConfigSuccess &= Endpoint_ConfigureEndpoint((LAMPARRAY_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, LAMPARRAY_EPSIZE, 1);
|
||||
#endif
|
||||
|
||||
usb_device_state_set_configuration(USB_DeviceState == DEVICE_STATE_Configured, USB_Device_ConfigurationNumber);
|
||||
}
|
||||
|
||||
@@ -446,6 +455,26 @@ void EVENT_USB_Device_ControlRequest(void) {
|
||||
ReportData = (uint8_t *)&keyboard_report_sent;
|
||||
ReportSize = sizeof(keyboard_report_sent);
|
||||
break;
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
case LAMPARRAY_INTERFACE:
|
||||
switch ((USB_ControlRequest.wValue & 0xFF)) {
|
||||
case LAMPARRAY_REPORT_ID_ATTRIBUTES:
|
||||
static lamparray_attributes_report_t ret = {.report_id = LAMPARRAY_REPORT_ID_ATTRIBUTES};
|
||||
lamparray_get_attributes(&ret.attributes);
|
||||
|
||||
ReportData = (uint8_t *)&ret;
|
||||
ReportSize = sizeof(ret);
|
||||
break;
|
||||
case LAMPARRAY_REPORT_ID_ATTRIBUTES_RESPONSE:
|
||||
static lamparray_attributes_response_report_t res = {.report_id = LAMPARRAY_REPORT_ID_ATTRIBUTES_RESPONSE};
|
||||
lamparray_get_attributes_response(&res.attributes_response);
|
||||
|
||||
ReportData = (uint8_t *)&res;
|
||||
ReportSize = sizeof(res);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Write the report data to the control endpoint */
|
||||
@@ -481,6 +510,26 @@ void EVENT_USB_Device_ControlRequest(void) {
|
||||
Endpoint_ClearOUT();
|
||||
Endpoint_ClearStatusStage();
|
||||
break;
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
case LAMPARRAY_INTERFACE:
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
while (!(Endpoint_IsINReady()))
|
||||
;
|
||||
|
||||
static universal_lamparray_response_t universal_lamparray_report_buf;
|
||||
|
||||
Endpoint_Read_Control_Stream_LE(&universal_lamparray_report_buf, USB_ControlRequest.wLength);
|
||||
Endpoint_ClearIN();
|
||||
|
||||
// handle directly to avoid sync issues with get
|
||||
if (universal_lamparray_report_buf.report_id == LAMPARRAY_REPORT_ID_ATTRIBUTES_REQUEST) {
|
||||
lamparray_set_attributes_response(universal_lamparray_report_buf.lamp_id);
|
||||
} else {
|
||||
lamparray_queue_request(&universal_lamparray_report_buf);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -432,6 +432,173 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
const USB_Descriptor_HIDReport_Datatype_t PROGMEM LampArrayReport[] = {
|
||||
HID_RI_USAGE_PAGE(8, 0x59), // Usage Page (Lighting and Illumination)
|
||||
HID_RI_USAGE(8, 0x01), // Usage (Lamp Array)
|
||||
HID_RI_COLLECTION(8, 0x01), // Collection (Application)
|
||||
HID_RI_REPORT_ID(8, 1), // Report ID (1)
|
||||
HID_RI_USAGE(8, 0x02), // Usage (Lamp Array Attributes Report)
|
||||
HID_RI_COLLECTION(8, 0x02), // Collection (Logical)
|
||||
HID_RI_USAGE(8, 0x03), // Usage (Lamp Count)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, (uint32_t)0xFFFF), // Logical Maximum (65535)
|
||||
HID_RI_REPORT_SIZE(8, 0x10), // Report Size (16)
|
||||
HID_RI_REPORT_COUNT(8, 0x01), // Report Count (1)
|
||||
HID_RI_FEATURE(8, 0x03), // Feature (Cnst,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x04), // Usage (Bounding Box Width In Micrometers)
|
||||
HID_RI_USAGE(8, 0x05), // Usage (Bounding Box Height In Micrometers)
|
||||
HID_RI_USAGE(8, 0x06), // Usage (Bounding Box Depth In Micrometers)
|
||||
HID_RI_USAGE(8, 0x07), // Usage (Lamp Array Kind)
|
||||
HID_RI_USAGE(8, 0x08), // Usage (Min Update Interval In Microseconds)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, 0x7FFFFFFF), // Logical Maximum (2147483647)
|
||||
HID_RI_REPORT_SIZE(8, 0x20), // Report Size (32)
|
||||
HID_RI_REPORT_COUNT(8, 0x05), // Report Count (5)
|
||||
HID_RI_FEATURE(8, 0x03), // Feature (Cnst,Var,Abs)
|
||||
HID_RI_END_COLLECTION(0), // End Collection
|
||||
HID_RI_REPORT_ID(8, 2), // Report ID (2)
|
||||
HID_RI_USAGE(8, 0x20), // Usage (Lamp Attributes Request Report)
|
||||
HID_RI_COLLECTION(8, 0x02), // Collection (Logical)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, (uint32_t)0xFFFF), // Logical Maximum (65535)
|
||||
HID_RI_REPORT_SIZE(8, 0x10), // Report Size (16)
|
||||
HID_RI_REPORT_COUNT(8, 0x01), // Report Count (1)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_END_COLLECTION(0), // End Collection
|
||||
HID_RI_REPORT_ID(8, 3), // Report ID (3)
|
||||
HID_RI_USAGE(8, 0x22), // Usage (Lamp Attributes Response Report)
|
||||
HID_RI_COLLECTION(8, 0x02), // Collection (Logical)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, (uint32_t)0xFFFF), // Logical Maximum (65535)
|
||||
HID_RI_REPORT_SIZE(8, 0x10), // Report Size (16)
|
||||
HID_RI_REPORT_COUNT(8, 0x01), // Report Count (1)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x23), // Usage (Position X In Micrometers)
|
||||
HID_RI_USAGE(8, 0x24), // Usage (Position Y In Micrometers)
|
||||
HID_RI_USAGE(8, 0x25), // Usage (Position Z In Micrometers)
|
||||
HID_RI_USAGE(8, 0x27), // Usage (Update Latency In Microseconds)
|
||||
HID_RI_USAGE(8, 0x26), // Usage (Lamp Purposes)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, 0x7FFFFFFF), // Logical Maximum (2147483647)
|
||||
HID_RI_REPORT_SIZE(8, 0x20), // Report Size (32)
|
||||
HID_RI_REPORT_COUNT(8, 0x05), // Report Count (5)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x28), // Usage (Red Level Count)
|
||||
HID_RI_USAGE(8, 0x29), // Usage (Green Level Count)
|
||||
HID_RI_USAGE(8, 0x2a), // Usage (Blue Level Count)
|
||||
HID_RI_USAGE(8, 0x2b), // Usage (Intensity Level Count)
|
||||
HID_RI_USAGE(8, 0x2c), // Usage (Is Programmable)
|
||||
HID_RI_USAGE(8, 0x2d), // Usage (Input Binding)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), // Logical Maximum (255)
|
||||
HID_RI_REPORT_SIZE(8, 0x08), // Report Size (8)
|
||||
HID_RI_REPORT_COUNT(8, 0x06), // Report Count (6)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_END_COLLECTION(0), // End Collection
|
||||
HID_RI_REPORT_ID(8, 4), // Report ID (4)
|
||||
HID_RI_USAGE(8, 0x50), // Usage (Lamp Multi Update Report)
|
||||
HID_RI_COLLECTION(8, 0x02), // Collection (Logical)
|
||||
HID_RI_USAGE(8, 0x03), // Usage (Lamp Count)
|
||||
HID_RI_USAGE(8, 0x55), // Usage (Lamp Update Flags)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0x08), // Logical Maximum (8)
|
||||
HID_RI_REPORT_SIZE(8, 0x08), // Report Size (8)
|
||||
HID_RI_REPORT_COUNT(8, 0x02), // Report Count (2)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_USAGE(8, 0x21), // Usage (Lamp Id)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, (uint32_t)0xFFFF), // Logical Maximum (65535)
|
||||
HID_RI_REPORT_SIZE(8, 0x10), // Report Size (16)
|
||||
HID_RI_REPORT_COUNT(8, 0x08), // Report Count (8)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), // Logical Maximum (255)
|
||||
HID_RI_REPORT_SIZE(8, 0x08), // Report Size (8)
|
||||
HID_RI_REPORT_COUNT(8, 0x20), // Report Count (32)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_END_COLLECTION(0), // End Collection
|
||||
HID_RI_REPORT_ID(8, 5), // Report ID (5)
|
||||
HID_RI_USAGE(8, 0x60), // Usage (Lamp Range Update Report)
|
||||
HID_RI_COLLECTION(8, 0x02), // Collection (Logical)
|
||||
HID_RI_USAGE(8, 0x55), // Usage (Lamp Update Flags)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0x08), // Logical Maximum (8)
|
||||
HID_RI_REPORT_SIZE(8, 0x08), // Report Size (8)
|
||||
HID_RI_REPORT_COUNT(8, 0x01), // Report Count (1)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x61), // Usage (Lamp Id Start)
|
||||
HID_RI_USAGE(8, 0x62), // Usage (Lamp Id End)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(32, (uint32_t)0xFFFF), // Logical Maximum (65535)
|
||||
HID_RI_REPORT_SIZE(8, 0x10), // Report Size (16)
|
||||
HID_RI_REPORT_COUNT(8, 0x02), // Report Count (2)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_USAGE(8, 0x51), // Usage (Red Update Channel)
|
||||
HID_RI_USAGE(8, 0x52), // Usage (Green Update Channel)
|
||||
HID_RI_USAGE(8, 0x53), // Usage (Blue Update Channel)
|
||||
HID_RI_USAGE(8, 0x54), // Usage (Intensity Update Channel)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), // Logical Maximum (255)
|
||||
HID_RI_REPORT_SIZE(8, 0x08), // Report Size (8)
|
||||
HID_RI_REPORT_COUNT(8, 0x04), // Report Count (4)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_END_COLLECTION(0), // End Collection
|
||||
HID_RI_REPORT_ID(8, 6), // Report ID (6)
|
||||
HID_RI_USAGE(8, 0x70), // Usage (Lamp Array Control Report)
|
||||
HID_RI_COLLECTION(8, 0x02), // Collection (Logical)
|
||||
HID_RI_USAGE(8, 0x71), // Usage (Autonomous Mode)
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), // Logical Minimum (0)
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01), // Logical Maximum (1)
|
||||
HID_RI_REPORT_SIZE(8, 0x08), // Report Size (8)
|
||||
HID_RI_REPORT_COUNT(8, 0x01), // Report Count (1)
|
||||
HID_RI_FEATURE(8, 0x02), // Feature (Data,Var,Abs)
|
||||
HID_RI_END_COLLECTION(0), // End Collection
|
||||
HID_RI_END_COLLECTION(0) // End Collection
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Device descriptor
|
||||
*/
|
||||
@@ -1050,6 +1217,46 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = {
|
||||
.PollingIntervalMS = USB_POLLING_INTERVAL_MS
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
/*
|
||||
* LampArray
|
||||
*/
|
||||
.LampArray_Interface = {
|
||||
.Header = {
|
||||
.Size = sizeof(USB_Descriptor_Interface_t),
|
||||
.Type = DTYPE_Interface
|
||||
},
|
||||
.InterfaceNumber = LAMPARRAY_INTERFACE,
|
||||
.AlternateSetting = 0x00,
|
||||
.TotalEndpoints = 1,
|
||||
.Class = HID_CSCP_HIDClass,
|
||||
.SubClass = HID_CSCP_NonBootSubclass,
|
||||
.Protocol = HID_CSCP_NonBootProtocol,
|
||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||
},
|
||||
.LampArray_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(LampArrayReport)
|
||||
},
|
||||
.LampArray_INEndpoint = {
|
||||
.Header = {
|
||||
.Size = sizeof(USB_Descriptor_Endpoint_t),
|
||||
.Type = DTYPE_Endpoint
|
||||
},
|
||||
.EndpointAddress = (ENDPOINT_DIR_IN | LAMPARRAY_IN_EPNUM),
|
||||
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
|
||||
.EndpointSize = LAMPARRAY_EPSIZE,
|
||||
.PollingIntervalMS = 0x01
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -1198,6 +1405,13 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
|
||||
|
||||
break;
|
||||
#endif
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
case LAMPARRAY_INTERFACE:
|
||||
Address = &ConfigurationDescriptor.LampArray_HID;
|
||||
Size = sizeof(USB_HID_Descriptor_HID_t);
|
||||
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1254,6 +1468,13 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
|
||||
Size = sizeof(DigitizerReport);
|
||||
break;
|
||||
#endif
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
case LAMPARRAY_INTERFACE:
|
||||
Address = &LampArrayReport;
|
||||
Size = sizeof(LampArrayReport);
|
||||
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -145,6 +145,13 @@ typedef struct {
|
||||
USB_HID_Descriptor_HID_t Digitizer_HID;
|
||||
USB_Descriptor_Endpoint_t Digitizer_INEndpoint;
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
// HID LampArray Interface
|
||||
USB_Descriptor_Interface_t LampArray_Interface;
|
||||
USB_HID_Descriptor_HID_t LampArray_HID;
|
||||
USB_Descriptor_Endpoint_t LampArray_INEndpoint;
|
||||
#endif
|
||||
} USB_Descriptor_Configuration_t;
|
||||
|
||||
/*
|
||||
@@ -194,6 +201,11 @@ enum usb_interfaces {
|
||||
#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
|
||||
DIGITIZER_INTERFACE,
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
LAMPARRAY_INTERFACE,
|
||||
#endif
|
||||
|
||||
TOTAL_INTERFACES
|
||||
};
|
||||
|
||||
@@ -281,6 +293,10 @@ enum usb_endpoints {
|
||||
# define DIGITIZER_IN_EPNUM SHARED_IN_EPNUM
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef LAMPARRAY_ENABLE
|
||||
LAMPARRAY_IN_EPNUM = NEXT_EPNUM,
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef PROTOCOL_LUFA
|
||||
@@ -307,5 +323,6 @@ enum usb_endpoints {
|
||||
#define CDC_EPSIZE 16
|
||||
#define JOYSTICK_EPSIZE 8
|
||||
#define DIGITIZER_EPSIZE 8
|
||||
#define LAMPARRAY_EPSIZE 8
|
||||
|
||||
uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const uint16_t wLength, const void** const DescriptorAddress);
|
||||
|
||||
Reference in New Issue
Block a user