1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <hid/ambient-light.h>
6 #include <hid/descriptor.h>
7
8 // clang-format off
9
10 #define HID_USAGE_AMBIENT_LIGHT HID_USAGE16(0x04D1)
11 #define HID_USAGE_INFRARED_LIGHT HID_USAGE16(0x04D7)
12 #define HID_USAGE_RED_LIGHT HID_USAGE16(0x04D8)
13 #define HID_USAGE_GREEN_LIGHT HID_USAGE16(0x04D9)
14 #define HID_USAGE_BLUE_LIGHT HID_USAGE16(0x04DA)
15
16 static const uint8_t ambient_light_report_desc[] = {
17 HID_USAGE_PAGE(0x20), // Sensor
18 HID_USAGE(0x41), // Ambient Light
19 HID_COLLECTION_APPLICATION,
20
21
22 // Feature reports
23 HID_REPORT_ID(AMBIENT_LIGHT_RPT_ID_FEATURE),
24
25 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
26 HID_LOGICAL_MIN(0),
27 HID_LOGICAL_MAX(5),
28 HID_REPORT_SIZE(8),
29 HID_REPORT_COUNT(1),
30 HID_COLLECTION_LOGICAL,
31 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
32 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
33 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS,
34 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE,
35 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE,
36 HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE,
37 HID_FEATURE(HID_Data_Arr_Abs),
38 HID_END_COLLECTION,
39
40 HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
41 HID_LOGICAL_MIN(0),
42 HID_LOGICAL_MAX32(0x7FFFFFFF),
43 HID_REPORT_SIZE(32),
44 HID_REPORT_COUNT(1),
45 // Default is HID_USAGE_SENSOR_UNITS_MILLISECOND,
46 HID_UNIT_EXPONENT(0),
47 HID_FEATURE(HID_Data_Var_Abs),
48
49 HID_USAGE_SENSOR_DATA(HID_USAGE_AMBIENT_LIGHT, HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_LOW),
50 HID_LOGICAL_MIN(0x00),
51 HID_LOGICAL_MAX32(0xFFFF),
52 HID_REPORT_SIZE(16),
53 HID_REPORT_COUNT(1),
54 HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
55 HID_FEATURE(HID_Data_Var_Abs),
56
57 HID_USAGE_SENSOR_DATA(HID_USAGE_AMBIENT_LIGHT, HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_HIGH),
58 HID_LOGICAL_MIN(0x00),
59 HID_LOGICAL_MAX32(0xFFFF),
60 HID_REPORT_SIZE(16),
61 HID_REPORT_COUNT(1),
62 HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
63 HID_FEATURE(HID_Data_Var_Abs),
64
65
66 // Input reports
67 HID_REPORT_ID(AMBIENT_LIGHT_RPT_ID_INPUT),
68
69 HID_USAGE_SENSOR_STATE,
70 HID_LOGICAL_MIN(0),
71 HID_LOGICAL_MAX(6),
72 HID_REPORT_SIZE(8),
73 HID_REPORT_COUNT(1),
74 HID_COLLECTION_LOGICAL,
75 HID_USAGE_SENSOR_STATE_UNKNOWN,
76 HID_USAGE_SENSOR_STATE_READY,
77 HID_USAGE_SENSOR_STATE_NOT_AVAILABLE,
78 HID_USAGE_SENSOR_STATE_NO_DATA,
79 HID_USAGE_SENSOR_STATE_INITIALIZING,
80 HID_USAGE_SENSOR_STATE_ACCESS_DENIED,
81 HID_USAGE_SENSOR_STATE_ERROR,
82 HID_INPUT(HID_Const_Arr_Abs),
83 HID_END_COLLECTION,
84
85 HID_USAGE_SENSOR_EVENT,
86 HID_LOGICAL_MIN(0),
87 HID_LOGICAL_MAX(16),
88 HID_REPORT_SIZE(8),
89 HID_REPORT_COUNT(1),
90 HID_COLLECTION_LOGICAL,
91 HID_USAGE_SENSOR_EVENT_UNKNOWN,
92 HID_USAGE_SENSOR_EVENT_STATE_CHANGED,
93 HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED,
94 HID_USAGE_SENSOR_EVENT_DATA_UPDATED,
95 HID_USAGE_SENSOR_EVENT_POLL_RESPONSE,
96 HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY,
97 HID_USAGE_SENSOR_EVENT_MAX_REACHED,
98 HID_USAGE_SENSOR_EVENT_MIN_REACHED,
99 HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_UPWARD,
100 HID_USAGE_SENSOR_EVENT_HIGH_THRESHOLD_CROSS_DOWNWARD,
101 HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_UPWARD,
102 HID_USAGE_SENSOR_EVENT_LOW_THRESHOLD_CROSS_DOWNWARD,
103 HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_UPWARD,
104 HID_USAGE_SENSOR_EVENT_ZERO_THRESHOLD_CROSS_DOWNWARD,
105 HID_USAGE_SENSOR_EVENT_PERIOD_EXCEEDED,
106 HID_USAGE_SENSOR_EVENT_FREQUENCY_EXCEEDED,
107 HID_USAGE_SENSOR_EVENT_COMPLEX_TRIGGER,
108 HID_INPUT(HID_Const_Arr_Abs),
109 HID_END_COLLECTION,
110
111 HID_USAGE_AMBIENT_LIGHT,
112 HID_LOGICAL_MIN(0),
113 HID_LOGICAL_MAX32(0xFFFF),
114 HID_REPORT_SIZE(16),
115 HID_REPORT_COUNT(1),
116 HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
117 HID_INPUT(HID_Data_Var_Abs),
118
119 HID_USAGE_RED_LIGHT,
120 HID_LOGICAL_MIN(0),
121 HID_LOGICAL_MAX32(0xFFFF),
122 HID_REPORT_SIZE(16),
123 HID_REPORT_COUNT(1),
124 HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
125 HID_INPUT(HID_Data_Var_Abs),
126
127 HID_USAGE_BLUE_LIGHT,
128 HID_LOGICAL_MIN(0),
129 HID_LOGICAL_MAX32(0xFFFF),
130 HID_REPORT_SIZE(16),
131 HID_REPORT_COUNT(1),
132 HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
133 HID_INPUT(HID_Data_Var_Abs),
134
135 HID_USAGE_GREEN_LIGHT,
136 HID_LOGICAL_MIN(0),
137 HID_LOGICAL_MAX32(0xFFFF),
138 HID_REPORT_SIZE(16),
139 HID_REPORT_COUNT(1),
140 HID_USAGE_SENSOR_GENERIC_UNITS_NOT_SPECIFIED, // Explicitly not Lux
141 HID_INPUT(HID_Data_Var_Abs),
142
143
144 HID_END_COLLECTION,
145 };
146 // clang-format on
147
get_ambient_light_report_desc(const uint8_t ** buf)148 size_t get_ambient_light_report_desc(const uint8_t** buf) {
149 *buf = ambient_light_report_desc;
150 return sizeof(ambient_light_report_desc);
151 }
152