Skip to content

Commit 3e8cf3e

Browse files
Add HID Lighting and Illumination functionality
1 parent 46f7cf4 commit 3e8cf3e

File tree

2 files changed

+231
-30
lines changed

2 files changed

+231
-30
lines changed

src/class/hid/hid.h

+66-30
Original file line numberDiff line numberDiff line change
@@ -684,32 +684,33 @@ enum {
684684

685685
/// HID Usage Table - Table 1: Usage Page Summary
686686
enum {
687-
HID_USAGE_PAGE_DESKTOP = 0x01,
688-
HID_USAGE_PAGE_SIMULATE = 0x02,
689-
HID_USAGE_PAGE_VIRTUAL_REALITY = 0x03,
690-
HID_USAGE_PAGE_SPORT = 0x04,
691-
HID_USAGE_PAGE_GAME = 0x05,
692-
HID_USAGE_PAGE_GENERIC_DEVICE = 0x06,
693-
HID_USAGE_PAGE_KEYBOARD = 0x07,
694-
HID_USAGE_PAGE_LED = 0x08,
695-
HID_USAGE_PAGE_BUTTON = 0x09,
696-
HID_USAGE_PAGE_ORDINAL = 0x0a,
697-
HID_USAGE_PAGE_TELEPHONY = 0x0b,
698-
HID_USAGE_PAGE_CONSUMER = 0x0c,
699-
HID_USAGE_PAGE_DIGITIZER = 0x0d,
700-
HID_USAGE_PAGE_PID = 0x0f,
701-
HID_USAGE_PAGE_UNICODE = 0x10,
702-
HID_USAGE_PAGE_ALPHA_DISPLAY = 0x14,
703-
HID_USAGE_PAGE_MEDICAL = 0x40,
704-
HID_USAGE_PAGE_MONITOR = 0x80, //0x80 - 0x83
705-
HID_USAGE_PAGE_POWER = 0x84, // 0x084 - 0x87
706-
HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c,
707-
HID_USAGE_PAGE_SCALE = 0x8d,
708-
HID_USAGE_PAGE_MSR = 0x8e,
709-
HID_USAGE_PAGE_CAMERA = 0x90,
710-
HID_USAGE_PAGE_ARCADE = 0x91,
711-
HID_USAGE_PAGE_FIDO = 0xF1D0, // FIDO alliance HID usage page
712-
HID_USAGE_PAGE_VENDOR = 0xFF00 // 0xFF00 - 0xFFFF
687+
HID_USAGE_PAGE_DESKTOP = 0x01,
688+
HID_USAGE_PAGE_SIMULATE = 0x02,
689+
HID_USAGE_PAGE_VIRTUAL_REALITY = 0x03,
690+
HID_USAGE_PAGE_SPORT = 0x04,
691+
HID_USAGE_PAGE_GAME = 0x05,
692+
HID_USAGE_PAGE_GENERIC_DEVICE = 0x06,
693+
HID_USAGE_PAGE_KEYBOARD = 0x07,
694+
HID_USAGE_PAGE_LED = 0x08,
695+
HID_USAGE_PAGE_BUTTON = 0x09,
696+
HID_USAGE_PAGE_ORDINAL = 0x0a,
697+
HID_USAGE_PAGE_TELEPHONY = 0x0b,
698+
HID_USAGE_PAGE_CONSUMER = 0x0c,
699+
HID_USAGE_PAGE_DIGITIZER = 0x0d,
700+
HID_USAGE_PAGE_PID = 0x0f,
701+
HID_USAGE_PAGE_UNICODE = 0x10,
702+
HID_USAGE_PAGE_ALPHA_DISPLAY = 0x14,
703+
HID_USAGE_PAGE_MEDICAL = 0x40,
704+
HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION = 0x59,
705+
HID_USAGE_PAGE_MONITOR = 0x80, //0x80 - 0x83
706+
HID_USAGE_PAGE_POWER = 0x84, // 0x084 - 0x87
707+
HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c,
708+
HID_USAGE_PAGE_SCALE = 0x8d,
709+
HID_USAGE_PAGE_MSR = 0x8e,
710+
HID_USAGE_PAGE_CAMERA = 0x90,
711+
HID_USAGE_PAGE_ARCADE = 0x91,
712+
HID_USAGE_PAGE_FIDO = 0xF1D0, // FIDO alliance HID usage page
713+
HID_USAGE_PAGE_VENDOR = 0xFF00 // 0xFF00 - 0xFFFF
713714
};
714715

715716
/// HID Usage Table - Table 6: Generic Desktop Page
@@ -788,8 +789,7 @@ enum {
788789

789790
/// HID Usage Table: Consumer Page (0x0C)
790791
/// Only contains controls that supported by Windows (whole list is too long)
791-
enum
792-
{
792+
enum {
793793
// Generic Control
794794
HID_USAGE_CONSUMER_CONTROL = 0x0001,
795795

@@ -845,9 +845,45 @@ enum
845845
HID_USAGE_CONSUMER_AC_PAN = 0x0238,
846846
};
847847

848+
/// HID Usage Table - Lighting And Illumination Page (0x59)
849+
enum {
850+
HID_USAGE_LIGHTING_LAMP_ARRAY = 0x01,
851+
HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT = 0x02,
852+
HID_USAGE_LIGHTING_LAMP_COUNT = 0x03,
853+
HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS = 0x04,
854+
HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS = 0x05,
855+
HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS = 0x06,
856+
HID_USAGE_LIGHTING_LAMP_ARRAY_KIND = 0x07,
857+
HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,
858+
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT = 0x20,
859+
HID_USAGE_LIGHTING_LAMP_ID = 0x21,
860+
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT = 0x22,
861+
HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS = 0x23,
862+
HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS = 0x24,
863+
HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS = 0x25,
864+
HID_USAGE_LIGHTING_LAMP_PURPOSES = 0x26,
865+
HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS = 0x27,
866+
HID_USAGE_LIGHTING_RED_LEVEL_COUNT = 0x28,
867+
HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT = 0x29,
868+
HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT = 0x2A,
869+
HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT = 0x2B,
870+
HID_USAGE_LIGHTING_IS_PROGRAMMABLE = 0x2C,
871+
HID_USAGE_LIGHTING_INPUT_BINDING = 0x2D,
872+
HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT = 0x50,
873+
HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL = 0x51,
874+
HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL = 0x52,
875+
HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL = 0x53,
876+
HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL = 0x54,
877+
HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS = 0x55,
878+
HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT = 0x60,
879+
HID_USAGE_LIGHTING_LAMP_ID_START = 0x61,
880+
HID_USAGE_LIGHTING_LAMP_ID_END = 0x62,
881+
HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT = 0x70,
882+
HID_USAGE_LIGHTING_AUTONOMOUS_MODE = 0x71,
883+
};
884+
848885
/// HID Usage Table: FIDO Alliance Page (0xF1D0)
849-
enum
850-
{
886+
enum {
851887
HID_USAGE_FIDO_U2FHID = 0x01, // U2FHID usage for top-level collection
852888
HID_USAGE_FIDO_DATA_IN = 0x20, // Raw IN data report
853889
HID_USAGE_FIDO_DATA_OUT = 0x21 // Raw OUT data report

src/class/hid/hid_device.h

+165
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,171 @@ static inline bool tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y
402402
HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
403403
HID_COLLECTION_END \
404404

405+
// HID Lighting and Illumination Report Descriptor Template
406+
// - 1st parameter is report id HID_REPORT_ID(n) (optional)
407+
#define TUD_HID_REPORT_DESC_LIGHTING(report_id) \
408+
HID_USAGE_PAGE ( HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION ),\
409+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY ),\
410+
HID_COLLECTION ( HID_COLLECTION_APPLICATION ),\
411+
/* Lamp Array Attributes Report */ \
412+
HID_REPORT_ID (report_id ) \
413+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT ),\
414+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
415+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
416+
HID_LOGICAL_MIN ( 0 ),\
417+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
418+
HID_REPORT_SIZE ( 16 ),\
419+
HID_REPORT_COUNT ( 1 ),\
420+
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
421+
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS ),\
422+
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS ),\
423+
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS ),\
424+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_KIND ),\
425+
HID_USAGE ( HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS ),\
426+
HID_LOGICAL_MIN ( 0 ),\
427+
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
428+
HID_REPORT_SIZE ( 32 ),\
429+
HID_REPORT_COUNT ( 5 ),\
430+
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
431+
HID_COLLECTION_END ,\
432+
/* Lamp Attributes Request Report */ \
433+
HID_REPORT_ID ( report_id + 1 ) \
434+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT ),\
435+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
436+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
437+
HID_LOGICAL_MIN ( 0 ),\
438+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
439+
HID_REPORT_SIZE ( 16 ),\
440+
HID_REPORT_COUNT ( 1 ),\
441+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
442+
HID_COLLECTION_END ,\
443+
/* Lamp Attributes Response Report */ \
444+
HID_REPORT_ID ( report_id + 2 ) \
445+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT ),\
446+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
447+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
448+
HID_LOGICAL_MIN ( 0 ),\
449+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
450+
HID_REPORT_SIZE ( 16 ),\
451+
HID_REPORT_COUNT ( 1 ),\
452+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
453+
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS ),\
454+
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS ),\
455+
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS ),\
456+
HID_USAGE ( HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS ),\
457+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_PURPOSES ),\
458+
HID_LOGICAL_MIN ( 0 ),\
459+
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
460+
HID_REPORT_SIZE ( 32 ),\
461+
HID_REPORT_COUNT ( 5 ),\
462+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
463+
HID_USAGE ( HID_USAGE_LIGHTING_RED_LEVEL_COUNT ),\
464+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT ),\
465+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT ),\
466+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT ),\
467+
HID_USAGE ( HID_USAGE_LIGHTING_IS_PROGRAMMABLE ),\
468+
HID_USAGE ( HID_USAGE_LIGHTING_INPUT_BINDING ),\
469+
HID_LOGICAL_MIN ( 0 ),\
470+
HID_LOGICAL_MAX_N ( 255, 2 ),\
471+
HID_REPORT_SIZE ( 8 ),\
472+
HID_REPORT_COUNT ( 6 ),\
473+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
474+
HID_COLLECTION_END ,\
475+
/* Lamp Multi-Update Report */ \
476+
HID_REPORT_ID ( report_id + 3 ) \
477+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT ),\
478+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
479+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
480+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
481+
HID_LOGICAL_MIN ( 0 ),\
482+
HID_LOGICAL_MAX ( 8 ),\
483+
HID_REPORT_SIZE ( 8 ),\
484+
HID_REPORT_COUNT ( 2 ),\
485+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
486+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
487+
HID_LOGICAL_MIN ( 0 ),\
488+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
489+
HID_REPORT_SIZE ( 16 ),\
490+
HID_REPORT_COUNT ( 8 ),\
491+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
492+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
493+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
494+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
495+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
496+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
497+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
498+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
499+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
500+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
501+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
502+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
503+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
504+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
505+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
506+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
507+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
508+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
509+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
510+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
511+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
512+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
513+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
514+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
515+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
516+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
517+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
518+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
519+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
520+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
521+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
522+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
523+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
524+
HID_LOGICAL_MIN ( 0 ),\
525+
HID_LOGICAL_MAX_N ( 255, 2 ),\
526+
HID_REPORT_SIZE ( 8 ),\
527+
HID_REPORT_COUNT ( 32 ),\
528+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
529+
HID_COLLECTION_END ,\
530+
/* Lamp Range Update Report */ \
531+
HID_REPORT_ID ( report_id + 4 ) \
532+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT ),\
533+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
534+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
535+
HID_LOGICAL_MIN ( 0 ),\
536+
HID_LOGICAL_MAX ( 8 ),\
537+
HID_REPORT_SIZE ( 8 ),\
538+
HID_REPORT_COUNT ( 1 ),\
539+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
540+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_START ),\
541+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_END ),\
542+
HID_LOGICAL_MIN ( 0 ),\
543+
HID_LOGICAL_MAX_N ( 65535, 3 ),\
544+
HID_REPORT_SIZE ( 16 ),\
545+
HID_REPORT_COUNT ( 2 ),\
546+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
547+
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
548+
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
549+
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
550+
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
551+
HID_LOGICAL_MIN ( 0 ),\
552+
HID_LOGICAL_MAX_N ( 255, 2 ),\
553+
HID_REPORT_SIZE ( 8 ),\
554+
HID_REPORT_COUNT ( 4 ),\
555+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
556+
HID_COLLECTION_END ,\
557+
/* Lamp Array Control Report */ \
558+
HID_REPORT_ID ( report_id + 5 ) \
559+
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT ),\
560+
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
561+
HID_USAGE ( HID_USAGE_LIGHTING_AUTONOMOUS_MODE ),\
562+
HID_LOGICAL_MIN ( 0 ),\
563+
HID_LOGICAL_MAX ( 1 ),\
564+
HID_REPORT_SIZE ( 8 ),\
565+
HID_REPORT_COUNT ( 1 ),\
566+
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
567+
HID_COLLECTION_END ,\
568+
HID_COLLECTION_END \
569+
405570
//--------------------------------------------------------------------+
406571
// Internal Class Driver API
407572
//--------------------------------------------------------------------+

0 commit comments

Comments
 (0)