iio: hid-sensor-rotation: Fix quaternion data not correct
Subsystems (3)
PATCH v2 1/1 iio: hid-sensor-rotation: Fix quaternion data not correct
Because the data of HID_USAGE_SENSOR_ORIENT_QUATERNION defined by ISH FW is s16, but quaternion data type is in_rot_quaternion_type(le:s16/32X4>>0), need to transform data type from s16 to s32
Fixes fc18dddc0625 ("iio: hid-sensors: Added device rotation support")
Signed-off-by Ye Xiang <[email protected]>
---
v2:
- Add Fixes tag
--- drivers/iio/orientation/hid-sensor-rotation.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/iio/orientation/hid-sensor-rotation.c +10 -3
@@ -21,7 +21,7 @@ struct dev_rot_state {struct hid_sensor_common common_attributes;struct hid_sensor_hub_attribute_info quaternion;struct { -u32 sampled_vals[4 ]__aligned(16) ; +s32 sampled_vals[4 ]__aligned(16) ;u64 timestamp__aligned(8) ; } scan;int scale_pre_decml;
@@ -175,8 +175,15 @@ static int dev_rot_capture_sample(struct hid_sensor_hub_device *hsdev,struct dev_rot_state *rot_state =iio_priv (indio_dev);if (usage_id ==HID_USAGE_SENSOR_ORIENT_QUATERNION ) { -memcpy (&rot_state->scan.sampled_vals, raw_data, -sizeof (rot_state->scan.sampled_vals)); +if (raw_len /4 ==sizeof (s16)) { + rot_state->scan.sampled_vals[0 ] = ((s16 *)raw_data)[0 ]; + rot_state->scan.sampled_vals[1 ] = ((s16 *)raw_data)[1 ]; + rot_state->scan.sampled_vals[2 ] = ((s16 *)raw_data)[2 ]; + rot_state->scan.sampled_vals[3 ] = ((s16 *)raw_data)[3 ]; + }else { +memcpy (&rot_state->scan.sampled_vals, raw_data, +sizeof (rot_state->scan.sampled_vals)); + }dev_dbg (&indio_dev->dev,"Recd Quat len:%zu::%zu\n" , raw_len,sizeof (rot_state->scan.sampled_vals));
Signature · 1 line
2.17.1
Jonathan Cameron
maintainerQuoted 6 lines · On Sat, 30 Jan 2021 18:25:46 +0800 Ye Xiang <[email protected]> wrote:
Because the data of
HID_USAGE_SENSOR_ORIENT_QUATERNIONdefined by ISH FW is s16, but quaternion data type isin_rot_quaternion_type(le:s16/32X4>>0), need to transform data type from s16 to s32Fixes fc18dddc0625 ("iio: hid-sensors: Added device rotation support")Signed-off-by Ye Xiang <[email protected]>
This is going to need manual backporting. I've applied it to the togreg branch of iio.git for the next merge window. So after that we can work on backports.
Jonathan
Quoted 39 lines
---
v2:
- Add Fixes tag--- drivers/iio/orientation/hid-sensor-rotation.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)drivers/iio/orientation/hid-sensor-rotation.c +10
-3@@ -21,7 +21,7 @@ struct dev_rot_state {struct hid_sensor_common common_attributes;struct hid_sensor_hub_attribute_info quaternion;struct { -u32 sampled_vals[4 ]__aligned(16) ; +s32 sampled_vals[4 ]__aligned(16) ;u64 timestamp__aligned(8) ; } scan;int scale_pre_decml;@@ -175,8 +175,15 @@ static int dev_rot_capture_sample(struct hid_sensor_hub_device *hsdev,struct dev_rot_state *rot_state =iio_priv (indio_dev);if (usage_id ==HID_USAGE_SENSOR_ORIENT_QUATERNION ) { -memcpy (&rot_state->scan.sampled_vals, raw_data, -sizeof (rot_state->scan.sampled_vals)); +if (raw_len /4 ==sizeof (s16)) { + rot_state->scan.sampled_vals[0 ] = ((s16 *)raw_data)[0 ]; + rot_state->scan.sampled_vals[1 ] = ((s16 *)raw_data)[1 ]; + rot_state->scan.sampled_vals[2 ] = ((s16 *)raw_data)[2 ]; + rot_state->scan.sampled_vals[3 ] = ((s16 *)raw_data)[3 ]; + }else { +memcpy (&rot_state->scan.sampled_vals, raw_data, +sizeof (rot_state->scan.sampled_vals)); + }dev_dbg (&indio_dev->dev,"Recd Quat len:%zu::%zu\n" , raw_len,sizeof (rot_state->scan.sampled_vals));