Commit 9ff88edc authored by Song Hongyan's avatar Song Hongyan Committed by Jonathan Cameron

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: default avatarSong Hongyan <hongyan.song@intel.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@intel.com>
Reviewed-by: default avatarXu Even <even.xu@intel.com>
Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent b46c39a0
...@@ -218,7 +218,7 @@ static int dev_rot_parse_report(struct platform_device *pdev, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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[] = { ...@@ -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 @@ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment