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