mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-08 07:21:27 +00:00
iio: hid-sensor-rotation: Add relative orientation sensor hid support
Relative orientation(AG) sensor is a 6dof orientation sensor, it depends on acceleration and gyroscope sensor data. It gives a quaternion describing the orientation of the device relative to an initial orientation. It is a standard HID sensor. More information can be found in: http://www.usb.org/developers/hidpage/HUTRR59_-_Usages_for_Wearables.pdf Relative orientation(AG) sensor and dev rotation sensor have same channels and share channel usage id. So the most of the code for relative orientation sensor can be reused. Signed-off-by: Song Hongyan <hongyan.song@intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com> Reviewed-by: Xu Even <even.xu@intel.com> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
b46c39a098
commit
9ff88edc5e
2 changed files with 21 additions and 8 deletions
|
@ -218,7 +218,7 @@ static int dev_rot_parse_report(struct platform_device *pdev,
|
||||||
static int hid_dev_rot_probe(struct platform_device *pdev)
|
static int hid_dev_rot_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
static char *name = "dev_rotation";
|
static char *name;
|
||||||
struct iio_dev *indio_dev;
|
struct iio_dev *indio_dev;
|
||||||
struct dev_rot_state *rot_state;
|
struct dev_rot_state *rot_state;
|
||||||
struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
|
struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
|
||||||
|
@ -234,8 +234,18 @@ static int hid_dev_rot_probe(struct platform_device *pdev)
|
||||||
rot_state->common_attributes.hsdev = hsdev;
|
rot_state->common_attributes.hsdev = hsdev;
|
||||||
rot_state->common_attributes.pdev = pdev;
|
rot_state->common_attributes.pdev = pdev;
|
||||||
|
|
||||||
ret = hid_sensor_parse_common_attributes(hsdev,
|
switch (hsdev->usage) {
|
||||||
HID_USAGE_SENSOR_DEVICE_ORIENTATION,
|
case HID_USAGE_SENSOR_DEVICE_ORIENTATION:
|
||||||
|
name = "dev_rotation";
|
||||||
|
break;
|
||||||
|
case HID_USAGE_SENSOR_RELATIVE_ORIENTATION:
|
||||||
|
name = "relative_orientation";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage,
|
||||||
&rot_state->common_attributes);
|
&rot_state->common_attributes);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to setup common attributes\n");
|
dev_err(&pdev->dev, "failed to setup common attributes\n");
|
||||||
|
@ -252,8 +262,7 @@ static int hid_dev_rot_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = dev_rot_parse_report(pdev, hsdev,
|
ret = dev_rot_parse_report(pdev, hsdev,
|
||||||
(struct iio_chan_spec *)indio_dev->channels,
|
(struct iio_chan_spec *)indio_dev->channels,
|
||||||
HID_USAGE_SENSOR_DEVICE_ORIENTATION,
|
hsdev->usage, rot_state);
|
||||||
rot_state);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to setup attributes\n");
|
dev_err(&pdev->dev, "failed to setup attributes\n");
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -288,8 +297,7 @@ static int hid_dev_rot_probe(struct platform_device *pdev)
|
||||||
rot_state->callbacks.send_event = dev_rot_proc_event;
|
rot_state->callbacks.send_event = dev_rot_proc_event;
|
||||||
rot_state->callbacks.capture_sample = dev_rot_capture_sample;
|
rot_state->callbacks.capture_sample = dev_rot_capture_sample;
|
||||||
rot_state->callbacks.pdev = pdev;
|
rot_state->callbacks.pdev = pdev;
|
||||||
ret = sensor_hub_register_callback(hsdev,
|
ret = sensor_hub_register_callback(hsdev, hsdev->usage,
|
||||||
HID_USAGE_SENSOR_DEVICE_ORIENTATION,
|
|
||||||
&rot_state->callbacks);
|
&rot_state->callbacks);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "callback reg failed\n");
|
dev_err(&pdev->dev, "callback reg failed\n");
|
||||||
|
@ -314,7 +322,7 @@ static int hid_dev_rot_remove(struct platform_device *pdev)
|
||||||
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
|
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
|
||||||
struct dev_rot_state *rot_state = iio_priv(indio_dev);
|
struct dev_rot_state *rot_state = iio_priv(indio_dev);
|
||||||
|
|
||||||
sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_DEVICE_ORIENTATION);
|
sensor_hub_remove_callback(hsdev, hsdev->usage);
|
||||||
iio_device_unregister(indio_dev);
|
iio_device_unregister(indio_dev);
|
||||||
hid_sensor_remove_trigger(&rot_state->common_attributes);
|
hid_sensor_remove_trigger(&rot_state->common_attributes);
|
||||||
iio_triggered_buffer_cleanup(indio_dev);
|
iio_triggered_buffer_cleanup(indio_dev);
|
||||||
|
@ -327,6 +335,10 @@ static const struct platform_device_id hid_dev_rot_ids[] = {
|
||||||
/* Format: HID-SENSOR-usage_id_in_hex_lowercase */
|
/* Format: HID-SENSOR-usage_id_in_hex_lowercase */
|
||||||
.name = "HID-SENSOR-20008a",
|
.name = "HID-SENSOR-20008a",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Relative orientation(AG) sensor */
|
||||||
|
.name = "HID-SENSOR-20008e",
|
||||||
|
},
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(platform, hid_dev_rot_ids);
|
MODULE_DEVICE_TABLE(platform, hid_dev_rot_ids);
|
||||||
|
|
|
@ -90,6 +90,7 @@
|
||||||
#define HID_USAGE_SENSOR_ORIENT_TILT_Z 0x200481
|
#define HID_USAGE_SENSOR_ORIENT_TILT_Z 0x200481
|
||||||
|
|
||||||
#define HID_USAGE_SENSOR_DEVICE_ORIENTATION 0x20008A
|
#define HID_USAGE_SENSOR_DEVICE_ORIENTATION 0x20008A
|
||||||
|
#define HID_USAGE_SENSOR_RELATIVE_ORIENTATION 0x20008E
|
||||||
#define HID_USAGE_SENSOR_ORIENT_ROTATION_MATRIX 0x200482
|
#define HID_USAGE_SENSOR_ORIENT_ROTATION_MATRIX 0x200482
|
||||||
#define HID_USAGE_SENSOR_ORIENT_QUATERNION 0x200483
|
#define HID_USAGE_SENSOR_ORIENT_QUATERNION 0x200483
|
||||||
#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX 0x200484
|
#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX 0x200484
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue