/* Adjust channel real bits based on report descriptor */ staticvoid hinge_adjust_channel_realbits(struct iio_chan_spec *channels, int channel, int size)
{
channels[channel].scan_type.realbits = size * 8;
}
/* Channel read_raw handler */ staticint hinge_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct hinge_state *st = iio_priv(indio_dev); struct hid_sensor_hub_device *hsdev; int report_id;
s32 min;
hsdev = st->common_attributes.hsdev; switch (mask) { case IIO_CHAN_INFO_RAW:
hid_sensor_power_state(&st->common_attributes, true);
report_id = st->hinge[chan->scan_index].report_id;
min = st->hinge[chan->scan_index].logical_minimum; if (report_id < 0) {
hid_sensor_power_state(&st->common_attributes, false); return -EINVAL;
}
*val = sensor_hub_input_attr_get_raw_value(st->common_attributes.hsdev,
hsdev->usage,
hinge_addresses[chan->scan_index],
report_id,
SENSOR_HUB_SYNC, min < 0);
hid_sensor_power_state(&st->common_attributes, false); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE:
*val = st->scale_pre_decml;
*val2 = st->scale_post_decml; return st->scale_precision; case IIO_CHAN_INFO_OFFSET:
*val = st->value_offset; return IIO_VAL_INT; case IIO_CHAN_INFO_SAMP_FREQ: return hid_sensor_read_samp_freq_value(&st->common_attributes,
val, val2); case IIO_CHAN_INFO_HYSTERESIS: return hid_sensor_read_raw_hyst_value(&st->common_attributes,
val, val2); default: return -EINVAL;
}
}
/* Channel write_raw handler */ staticint hinge_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct hinge_state *st = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_SAMP_FREQ: return hid_sensor_write_samp_freq_value(&st->common_attributes,
val, val2); case IIO_CHAN_INFO_HYSTERESIS: return hid_sensor_write_raw_hyst_value(&st->common_attributes,
val, val2); default: return -EINVAL;
}
}
switch (usage_id) { case HID_USAGE_SENSOR_DATA_FIELD_CUSTOM_VALUE(1): case HID_USAGE_SENSOR_DATA_FIELD_CUSTOM_VALUE(2): case HID_USAGE_SENSOR_DATA_FIELD_CUSTOM_VALUE(3):
offset = usage_id - HID_USAGE_SENSOR_DATA_FIELD_CUSTOM_VALUE(1);
st->scan.hinge_val[offset] = *(u32 *)raw_data; return 0; case HID_USAGE_SENSOR_TIME_TIMESTAMP:
st->timestamp = hid_sensor_convert_timestamp(&st->common_attributes,
*(int64_t *)raw_data); return 0; default: return -EINVAL;
}
}
/* Parse report which is specific to an usage id */ staticint hinge_parse_report(struct platform_device *pdev, struct hid_sensor_hub_device *hsdev, struct iio_chan_spec *channels, unsignedint usage_id, struct hinge_state *st)
{ int ret; int i;
for (i = 0; i < CHANNEL_SCAN_INDEX_MAX; ++i) {
ret = sensor_hub_input_get_attribute_info(hsdev,
HID_INPUT_REPORT,
usage_id,
hinge_addresses[i],
&st->hinge[i]); if (ret < 0) return ret;
hinge_adjust_channel_realbits(channels, i, st->hinge[i].size);
}
/* Function to initialize the processing for usage id */ staticint hid_hinge_probe(struct platform_device *pdev)
{ struct hid_sensor_hub_device *hsdev = dev_get_platdata(&pdev->dev); struct hinge_state *st; struct iio_dev *indio_dev; int ret; int i;
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st)); if (!indio_dev) return -ENOMEM;
platform_set_drvdata(pdev, indio_dev);
st = iio_priv(indio_dev);
st->common_attributes.hsdev = hsdev;
st->common_attributes.pdev = pdev;
st->indio_dev = indio_dev; for (i = 0; i < CHANNEL_SCAN_INDEX_MAX; i++)
st->labels[i] = hinge_labels[i];
ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage,
&st->common_attributes,
hinge_sensitivity_addresses,
ARRAY_SIZE(hinge_sensitivity_addresses)); if (ret) {
dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.