4 HID sensor framework provides necessary interfaces to implement sensor drivers,
5 which are connected to a sensor hub. The sensor hub is a HID device and it provides
6 a report descriptor conforming to HID 1.12 sensor usage tables.
8 Description from the HID 1.12 "HID Sensor Usages" specification:
9 "Standardization of HID usages for sensors would allow (but not require) sensor
10 hardware vendors to provide a consistent Plug And Play interface at the USB boundary,
11 thereby enabling some operating systems to incorporate common device drivers that
12 could be reused between vendors, alleviating any need for the vendors to provide
13 the drivers themselves."
15 This specification describes many usage IDs, which describe the type of sensor
16 and also the individual data fields. Each sensor can have variable number of
17 data fields. The length and order is specified in the report descriptor. For
18 example a part of report descriptor can look like:
26 Logical Minimum(-32767)
27 Logical Maximum(32767)
31 Flags(Variable Absolute)
35 The report is indicating "sensor page (0x20)" contains an accelerometer-3D (0x73).
36 This accelerometer-3D has some fields. Here for example field 2 is motion intensity
37 (0x045f) with a logical minimum value of -32767 and logical maximum of 32767. The
38 order of fields and length of each field is important as the input event raw
39 data will use this format.
45 This specification defines many different types of sensors with different sets of
46 data fields. It is difficult to have a common input event to user space applications,
47 for different sensors. For example an accelerometer can send X,Y and Z data, whereas
48 an ambient light sensor can send illumination data.
49 So the implementation has two parts:
51 - Individual sensor processing part (sensor drivers)
55 The core driver registers (hid-sensor-hub) registers as a HID driver. It parses
56 report descriptors and identifies all the sensors present. It adds an MFD device
57 with name HID-SENSOR-xxxx (where xxxx is usage id from the specification).
59 HID-SENSOR-200073 is registered for an Accelerometer 3D driver.
60 So if any driver with this name is inserted, then the probe routine for that
61 function will be called. So an accelerometer processing driver can register
62 with this name and will be probed if there is an accelerometer-3D detected.
64 The core driver provides a set of APIs which can be used by the processing
65 drivers to register and get events for that usage id. Also it provides parsing
66 functions, which get and set each input/feature/output report.
68 Individual sensor processing part (sensor drivers)
70 The processing driver will use an interface provided by the core driver to parse
71 the report and get the indexes of the fields and also can get events. This driver
72 can use IIO interface to use the standard ABI defined for a type of sensor.
79 Each processing driver can use this structure to set some callbacks.
80 int (*suspend)(..): Callback when HID suspend is received
81 int (*resume)(..): Callback when HID resume is received
82 int (*capture_sample)(..): Capture a sample for one of its data fields
83 int (*send_event)(..): One complete event is received which can have
86 Registration functions:
87 int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
89 struct hid_sensor_hub_callbacks *usage_callback):
91 Registers callbacks for an usage id. The callback functions are not allowed
95 int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
98 Removes callbacks for an usage id.
102 int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
104 u32 usage_id, u32 attr_usage_id,
105 struct hid_sensor_hub_attribute_info *info);
107 A processing driver can look for some field of interest and check if it exists
108 in a report descriptor. If it exists it will store necessary information
109 so that fields can be set or get individually.
110 These indexes avoid searching every time and getting field index to get or set.
114 int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
115 u32 field_index, s32 value);
117 This interface is used to set a value for a field in feature report. For example
118 if there is a field report_interval, which is parsed by a call to
119 sensor_hub_input_get_attribute_info before, then it can directly set that individual
123 int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
124 u32 field_index, s32 *value);
126 This interface is used to get a value for a field in input report. For example
127 if there is a field report_interval, which is parsed by a call to
128 sensor_hub_input_get_attribute_info before, then it can directly get that individual
132 int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
134 u32 attr_usage_id, u32 report_id);
136 This is used to get a particular field value through input reports. For example
137 accelerometer wants to poll X axis value, then it can call this function with
138 the usage id of X axis. HID sensors can provide events, so this is not necessary
139 to poll for any field. If there is some new sample, the core driver will call
140 registered callback function to process the sample.