* [PATCH] iio: hid-sensors: Increase the precision of scale @ 2016-10-25 1:30 Song Hongyan 2016-10-30 16:22 ` Jonathan Cameron 0 siblings, 1 reply; 4+ messages in thread From: Song Hongyan @ 2016-10-25 1:30 UTC (permalink / raw) To: linux-iio; +Cc: srinivas.pandruvada, Song Hongyan While testing, it was observed that on some platforms the scale value from iio sysfs for gyroscope is always 0 (E.g. Yoga 260). This results in the final angular velocity component values to be zeros. This is caused by insufficient precision of scale value displayed in sysfs. If the precision is changed to nano from current micro, then this is sufficient to display the scale value on this platform. Since this can be a problem for all other HID sensors, increase scale precision of all HID sensors to nano from current micro. Results on Yoga 260: name scale before scale now -------------------------------------------- gyro_3d 0.000000 0.000000174 als 0.001000 0.001000000 magn_3d 0.000001 0.000001000 accel_3d 0.000009 0.000009806 Signed-off-by: Song Hongyan <hongyan.song@intel.com> --- .../iio/common/hid-sensors/hid-sensor-attributes.c | 56 +++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index dc33c1d..b5beea53 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c @@ -30,26 +30,26 @@ u32 usage_id; int unit; /* 0 for default others from HID sensor spec */ int scale_val0; /* scale, whole number */ - int scale_val1; /* scale, fraction in micros */ + int scale_val1; /* scale, fraction in nanos */ } unit_conversion[] = { - {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, + {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650000}, {HID_USAGE_SENSOR_ACCEL_3D, HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, {HID_USAGE_SENSOR_ACCEL_3D, - HID_USAGE_SENSOR_UNITS_G, 9, 806650}, + HID_USAGE_SENSOR_UNITS_G, 9, 806650000}, - {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453}, + {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453293}, {HID_USAGE_SENSOR_GYRO_3D, HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND, 1, 0}, {HID_USAGE_SENSOR_GYRO_3D, - HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453}, + HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453293}, - {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000}, + {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000000}, {HID_USAGE_SENSOR_COMPASS_3D, HID_USAGE_SENSOR_UNITS_GAUSS, 1, 0}, - {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453}, + {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453293}, {HID_USAGE_SENSOR_INCLINOMETER_3D, - HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453}, + HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453293}, {HID_USAGE_SENSOR_INCLINOMETER_3D, HID_USAGE_SENSOR_UNITS_RADIANS, 1, 0}, @@ -57,7 +57,7 @@ {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0}, - {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000}, + {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000000}, }; static int pow_10(unsigned power) @@ -266,15 +266,15 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, /* * This fuction applies the unit exponent to the scale. * For example: - * 9.806650 ->exp:2-> val0[980]val1[665000] - * 9.000806 ->exp:2-> val0[900]val1[80600] - * 0.174535 ->exp:2-> val0[17]val1[453500] - * 1.001745 ->exp:0-> val0[1]val1[1745] - * 1.001745 ->exp:2-> val0[100]val1[174500] - * 1.001745 ->exp:4-> val0[10017]val1[450000] - * 9.806650 ->exp:-2-> val0[0]val1[98066] + * 9.806650000 ->exp:2-> val0[980]val1[665000000] + * 9.000806000 ->exp:2-> val0[900]val1[80600000] + * 0.174535293 ->exp:2-> val0[17]val1[453529300] + * 1.001745329 ->exp:0-> val0[1]val1[1745329] + * 1.001745329 ->exp:2-> val0[100]val1[174532900] + * 1.001745329 ->exp:4-> val0[10017]val1[453290000] + * 9.806650000 ->exp:-2-> val0[0]val1[98066500] */ -static void adjust_exponent_micro(int *val0, int *val1, int scale0, +static void adjust_exponent_nano(int *val0, int *val1, int scale0, int scale1, int exp) { int i; @@ -285,32 +285,32 @@ static void adjust_exponent_micro(int *val0, int *val1, int scale0, if (exp > 0) { *val0 = scale0 * pow_10(exp); res = 0; - if (exp > 6) { + if (exp > 9) { *val1 = 0; return; } for (i = 0; i < exp; ++i) { - x = scale1 / pow_10(5 - i); + x = scale1 / pow_10(8 - i); res += (pow_10(exp - 1 - i) * x); - scale1 = scale1 % pow_10(5 - i); + scale1 = scale1 % pow_10(8 - i); } *val0 += res; *val1 = scale1 * pow_10(exp); } else if (exp < 0) { exp = abs(exp); - if (exp > 6) { + if (exp > 9) { *val0 = *val1 = 0; return; } *val0 = scale0 / pow_10(exp); rem = scale0 % pow_10(exp); res = 0; - for (i = 0; i < (6 - exp); ++i) { - x = scale1 / pow_10(5 - i); - res += (pow_10(5 - exp - i) * x); - scale1 = scale1 % pow_10(5 - i); + for (i = 0; i < (9 - exp); ++i) { + x = scale1 / pow_10(8 - i); + res += (pow_10(8 - exp - i) * x); + scale1 = scale1 % pow_10(8 - i); } - *val1 = rem * pow_10(6 - exp) + res; + *val1 = rem * pow_10(9 - exp) + res; } else { *val0 = scale0; *val1 = scale1; @@ -332,14 +332,14 @@ int hid_sensor_format_scale(u32 usage_id, unit_conversion[i].unit == attr_info->units) { exp = hid_sensor_convert_exponent( attr_info->unit_expo); - adjust_exponent_micro(val0, val1, + adjust_exponent_nano(val0, val1, unit_conversion[i].scale_val0, unit_conversion[i].scale_val1, exp); break; } } - return IIO_VAL_INT_PLUS_MICRO; + return IIO_VAL_INT_PLUS_NANO; } EXPORT_SYMBOL(hid_sensor_format_scale); -- 1.9.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] iio: hid-sensors: Increase the precision of scale 2016-10-25 1:30 [PATCH] iio: hid-sensors: Increase the precision of scale Song Hongyan @ 2016-10-30 16:22 ` Jonathan Cameron 2016-10-31 0:34 ` Pandruvada, Srinivas 0 siblings, 1 reply; 4+ messages in thread From: Jonathan Cameron @ 2016-10-30 16:22 UTC (permalink / raw) To: Song Hongyan, linux-iio; +Cc: srinivas.pandruvada On 25/10/16 02:30, Song Hongyan wrote: > While testing, it was observed that on some platforms the scale value > from iio sysfs for gyroscope is always 0 (E.g. Yoga 260). This results > in the final angular velocity component values to be zeros. > > This is caused by insufficient precision of scale value displayed in sysfs. > If the precision is changed to nano from current micro, then this is > sufficient to display the scale value on this platform. > Since this can be a problem for all other HID sensors, increase scale > precision of all HID sensors to nano from current micro. > > Results on Yoga 260: > > name scale before scale now > -------------------------------------------- > gyro_3d 0.000000 0.000000174 > als 0.001000 0.001000000 > magn_3d 0.000001 0.000001000 > accel_3d 0.000009 0.000009806 > > Signed-off-by: Song Hongyan <hongyan.song@intel.com> Hi Looks right to me, Srinivas, I'd like your Ack on this ideally. thanks, Jonathan > --- > .../iio/common/hid-sensors/hid-sensor-attributes.c | 56 +++++++++++----------- > 1 file changed, 28 insertions(+), 28 deletions(-) > > diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > index dc33c1d..b5beea53 100644 > --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > @@ -30,26 +30,26 @@ > u32 usage_id; > int unit; /* 0 for default others from HID sensor spec */ > int scale_val0; /* scale, whole number */ > - int scale_val1; /* scale, fraction in micros */ > + int scale_val1; /* scale, fraction in nanos */ > } unit_conversion[] = { > - {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, > + {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650000}, > {HID_USAGE_SENSOR_ACCEL_3D, > HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, > {HID_USAGE_SENSOR_ACCEL_3D, > - HID_USAGE_SENSOR_UNITS_G, 9, 806650}, > + HID_USAGE_SENSOR_UNITS_G, 9, 806650000}, > > - {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453}, > + {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453293}, > {HID_USAGE_SENSOR_GYRO_3D, > HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND, 1, 0}, > {HID_USAGE_SENSOR_GYRO_3D, > - HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453}, > + HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453293}, > > - {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000}, > + {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000000}, > {HID_USAGE_SENSOR_COMPASS_3D, HID_USAGE_SENSOR_UNITS_GAUSS, 1, 0}, > > - {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453}, > + {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453293}, > {HID_USAGE_SENSOR_INCLINOMETER_3D, > - HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453}, > + HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453293}, > {HID_USAGE_SENSOR_INCLINOMETER_3D, > HID_USAGE_SENSOR_UNITS_RADIANS, 1, 0}, > > @@ -57,7 +57,7 @@ > {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, > > {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0}, > - {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000}, > + {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000000}, > }; > > static int pow_10(unsigned power) > @@ -266,15 +266,15 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, > /* > * This fuction applies the unit exponent to the scale. > * For example: > - * 9.806650 ->exp:2-> val0[980]val1[665000] > - * 9.000806 ->exp:2-> val0[900]val1[80600] > - * 0.174535 ->exp:2-> val0[17]val1[453500] > - * 1.001745 ->exp:0-> val0[1]val1[1745] > - * 1.001745 ->exp:2-> val0[100]val1[174500] > - * 1.001745 ->exp:4-> val0[10017]val1[450000] > - * 9.806650 ->exp:-2-> val0[0]val1[98066] > + * 9.806650000 ->exp:2-> val0[980]val1[665000000] > + * 9.000806000 ->exp:2-> val0[900]val1[80600000] > + * 0.174535293 ->exp:2-> val0[17]val1[453529300] > + * 1.001745329 ->exp:0-> val0[1]val1[1745329] > + * 1.001745329 ->exp:2-> val0[100]val1[174532900] > + * 1.001745329 ->exp:4-> val0[10017]val1[453290000] > + * 9.806650000 ->exp:-2-> val0[0]val1[98066500] > */ > -static void adjust_exponent_micro(int *val0, int *val1, int scale0, > +static void adjust_exponent_nano(int *val0, int *val1, int scale0, > int scale1, int exp) > { > int i; > @@ -285,32 +285,32 @@ static void adjust_exponent_micro(int *val0, int *val1, int scale0, > if (exp > 0) { > *val0 = scale0 * pow_10(exp); > res = 0; > - if (exp > 6) { > + if (exp > 9) { > *val1 = 0; > return; > } > for (i = 0; i < exp; ++i) { > - x = scale1 / pow_10(5 - i); > + x = scale1 / pow_10(8 - i); > res += (pow_10(exp - 1 - i) * x); > - scale1 = scale1 % pow_10(5 - i); > + scale1 = scale1 % pow_10(8 - i); > } > *val0 += res; > *val1 = scale1 * pow_10(exp); > } else if (exp < 0) { > exp = abs(exp); > - if (exp > 6) { > + if (exp > 9) { > *val0 = *val1 = 0; > return; > } > *val0 = scale0 / pow_10(exp); > rem = scale0 % pow_10(exp); > res = 0; > - for (i = 0; i < (6 - exp); ++i) { > - x = scale1 / pow_10(5 - i); > - res += (pow_10(5 - exp - i) * x); > - scale1 = scale1 % pow_10(5 - i); > + for (i = 0; i < (9 - exp); ++i) { > + x = scale1 / pow_10(8 - i); > + res += (pow_10(8 - exp - i) * x); > + scale1 = scale1 % pow_10(8 - i); > } > - *val1 = rem * pow_10(6 - exp) + res; > + *val1 = rem * pow_10(9 - exp) + res; > } else { > *val0 = scale0; > *val1 = scale1; > @@ -332,14 +332,14 @@ int hid_sensor_format_scale(u32 usage_id, > unit_conversion[i].unit == attr_info->units) { > exp = hid_sensor_convert_exponent( > attr_info->unit_expo); > - adjust_exponent_micro(val0, val1, > + adjust_exponent_nano(val0, val1, > unit_conversion[i].scale_val0, > unit_conversion[i].scale_val1, exp); > break; > } > } > > - return IIO_VAL_INT_PLUS_MICRO; > + return IIO_VAL_INT_PLUS_NANO; > } > EXPORT_SYMBOL(hid_sensor_format_scale); > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] iio: hid-sensors: Increase the precision of scale 2016-10-30 16:22 ` Jonathan Cameron @ 2016-10-31 0:34 ` Pandruvada, Srinivas 2016-11-05 17:52 ` Jonathan Cameron 0 siblings, 1 reply; 4+ messages in thread From: Pandruvada, Srinivas @ 2016-10-31 0:34 UTC (permalink / raw) To: Song, Hongyan, linux-iio@vger.kernel.org, jic23@kernel.org T24gU3VuLCAyMDE2LTEwLTMwIGF0IDE2OjIyICswMDAwLCBKb25hdGhhbiBDYW1lcm9uIHdyb3Rl Og0KPiBPbiAyNS8xMC8xNiAwMjozMCwgU29uZyBIb25neWFuIHdyb3RlOg0KPiA+IA0KPiA+IFdo aWxlIHRlc3RpbmcsIGl0IHdhcyBvYnNlcnZlZCB0aGF0IG9uIHNvbWUgcGxhdGZvcm1zIHRoZSBz Y2FsZQ0KPiA+IHZhbHVlDQo+ID4gZnJvbSBpaW8gc3lzZnMgZm9yIGd5cm9zY29wZSBpcyBhbHdh eXMgMCAoRS5nLiBZb2dhIDI2MCkuIFRoaXMNCj4gPiByZXN1bHRzDQo+ID4gaW4gdGhlIGZpbmFs IGFuZ3VsYXIgdmVsb2NpdHkgY29tcG9uZW50IHZhbHVlcyB0byBiZSB6ZXJvcy4NCj4gPiANCj4g PiBUaGlzIGlzIGNhdXNlZCBieSBpbnN1ZmZpY2llbnQgcHJlY2lzaW9uIG9mIHNjYWxlIHZhbHVl IGRpc3BsYXllZA0KPiA+IGluIHN5c2ZzLg0KPiA+IElmIHRoZSBwcmVjaXNpb24gaXMgY2hhbmdl ZCB0byBuYW5vIGZyb20gY3VycmVudCBtaWNybywgdGhlbiB0aGlzDQo+ID4gaXMNCj4gPiBzdWZm aWNpZW50IHRvIGRpc3BsYXkgdGhlIHNjYWxlIHZhbHVlIG9uIHRoaXMgcGxhdGZvcm0uDQo+ID4g U2luY2UgdGhpcyBjYW4gYmUgYSBwcm9ibGVtIGZvciBhbGwgb3RoZXIgSElEIHNlbnNvcnMsIGlu Y3JlYXNlDQo+ID4gc2NhbGUNCj4gPiBwcmVjaXNpb24gb2YgYWxsIEhJRCBzZW5zb3JzIHRvIG5h bm8gZnJvbSBjdXJyZW50IG1pY3JvLg0KPiA+IA0KPiA+IFJlc3VsdHMgb24gWW9nYSAyNjA6DQo+ ID4gDQo+ID4gbmFtZQkJc2NhbGUgYmVmb3JlCXNjYWxlIG5vdw0KPiA+IC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ID4gZ3lyb18zZAkJMC4wMDAwMDAJMC4w MDAwMDAxNzQNCj4gPiBhbHMJCQkwLjAwMTAwMAkwLjAwMTAwMDAwMA0KPiA+IG1hZ25fM2QJCTAu MDAwMDAxCTAuMDAwMDAxMDAwDQo+ID4gYWNjZWxfM2QJCTAuMDAwMDA5CTAuMDAwMDA5ODA2DQo+ ID4gDQo+ID4gU2lnbmVkLW9mZi1ieTogU29uZyBIb25neWFuIDxob25neWFuLnNvbmdAaW50ZWwu Y29tPg0KQWNrZWQtYnk6IFNyaW5pdmFzIFBhbmRydXZhZGEgPHNyaW5pdmFzLnBhbmRydXZhZGFA bGludXguaW50ZWwuY29tPg0KDQpIaSBKb25hdGhhbiwNCj4gSGkNCj4gDQo+IExvb2tzIHJpZ2h0 IHRvIG1lLCBTcmluaXZhcywgSSdkIGxpa2UgeW91ciBBY2sgb24gdGhpcyBpZGVhbGx5Lg0KDQpJ IGhhdmUgYWRkZWQgbXkgQUNLLg0KDQpUaGFua3MsDQpTcmluaXZhcw0KDQo+IHRoYW5rcywNCj4g DQo+IEpvbmF0aGFuDQo+ID4gDQo+ID4gLS0tDQo+ID4gwqAuLi4vaWlvL2NvbW1vbi9oaWQtc2Vu c29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYyB8IDU2DQo+ID4gKysrKysrKysrKystLS0tLS0t LS0tLQ0KPiA+IMKgMSBmaWxlIGNoYW5nZWQsIDI4IGluc2VydGlvbnMoKyksIDI4IGRlbGV0aW9u cygtKQ0KPiA+IA0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNv cnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMgDQo+ID4gYi9kcml2ZXJzL2lpby9jb21tb24vaGlk LXNlbnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMNCj4gPiBpbmRleCBkYzMzYzFkLi5iNWJl ZWE1MyAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlk LXNlbnNvci1hdHRyaWJ1dGVzLmMNCj4gPiArKysgYi9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNl bnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMNCj4gPiBAQCAtMzAsMjYgKzMwLDI2IEBADQo+ ID4gwqAJdTMyIHVzYWdlX2lkOw0KPiA+IMKgCWludCB1bml0OyAvKiAwIGZvciBkZWZhdWx0IG90 aGVycyBmcm9tIEhJRCBzZW5zb3Igc3BlYyAqLw0KPiA+IMKgCWludCBzY2FsZV92YWwwOyAvKiBz Y2FsZSwgd2hvbGUgbnVtYmVyICovDQo+ID4gLQlpbnQgc2NhbGVfdmFsMTsgLyogc2NhbGUsIGZy YWN0aW9uIGluIG1pY3JvcyAqLw0KPiA+ICsJaW50IHNjYWxlX3ZhbDE7IC8qIHNjYWxlLCBmcmFj dGlvbiBpbiBuYW5vcyAqLw0KPiA+IMKgfSB1bml0X2NvbnZlcnNpb25bXSA9IHsNCj4gPiAtCXtI SURfVVNBR0VfU0VOU09SX0FDQ0VMXzNELCAwLCA5LCA4MDY2NTB9LA0KPiA+ICsJe0hJRF9VU0FH RV9TRU5TT1JfQUNDRUxfM0QsIDAsIDksIDgwNjY1MDAwMH0sDQo+ID4gwqAJe0hJRF9VU0FHRV9T RU5TT1JfQUNDRUxfM0QsDQo+ID4gwqAJCUhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTUVURVJTX1BF Ul9TRUNfU1FSRCwgMSwgMH0sDQo+ID4gwqAJe0hJRF9VU0FHRV9TRU5TT1JfQUNDRUxfM0QsDQo+ ID4gLQkJSElEX1VTQUdFX1NFTlNPUl9VTklUU19HLCA5LCA4MDY2NTB9LA0KPiA+ICsJCUhJRF9V U0FHRV9TRU5TT1JfVU5JVFNfRywgOSwgODA2NjUwMDAwfSwNCj4gPiDCoA0KPiA+IC0Je0hJRF9V U0FHRV9TRU5TT1JfR1lST18zRCwgMCwgMCwgMTc0NTN9LA0KPiA+ICsJe0hJRF9VU0FHRV9TRU5T T1JfR1lST18zRCwgMCwgMCwgMTc0NTMyOTN9LA0KPiA+IMKgCXtISURfVVNBR0VfU0VOU09SX0dZ Uk9fM0QsDQo+ID4gwqAJCUhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUkFESUFOU19QRVJfU0VDT05E LCAxLCAwfSwNCj4gPiDCoAl7SElEX1VTQUdFX1NFTlNPUl9HWVJPXzNELA0KPiA+IC0JCUhJRF9V U0FHRV9TRU5TT1JfVU5JVFNfREVHUkVFU19QRVJfU0VDT05ELCAwLA0KPiA+IDE3NDUzfSwNCj4g PiArCQlISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFR1JFRVNfUEVSX1NFQ09ORCwgMCwNCj4gPiAx NzQ1MzI5M30sDQo+ID4gwqANCj4gPiAtCXtISURfVVNBR0VfU0VOU09SX0NPTVBBU1NfM0QsIDAs IDAsIDEwMDB9LA0KPiA+ICsJe0hJRF9VU0FHRV9TRU5TT1JfQ09NUEFTU18zRCwgMCwgMCwgMTAw MDAwMH0sDQo+ID4gwqAJe0hJRF9VU0FHRV9TRU5TT1JfQ09NUEFTU18zRCwNCj4gPiBISURfVVNB R0VfU0VOU09SX1VOSVRTX0dBVVNTLCAxLCAwfSwNCj4gPiDCoA0KPiA+IC0Je0hJRF9VU0FHRV9T RU5TT1JfSU5DTElOT01FVEVSXzNELCAwLCAwLCAxNzQ1M30sDQo+ID4gKwl7SElEX1VTQUdFX1NF TlNPUl9JTkNMSU5PTUVURVJfM0QsIDAsIDAsIDE3NDUzMjkzfSwNCj4gPiDCoAl7SElEX1VTQUdF X1NFTlNPUl9JTkNMSU5PTUVURVJfM0QsDQo+ID4gLQkJSElEX1VTQUdFX1NFTlNPUl9VTklUU19E RUdSRUVTLCAwLCAxNzQ1M30sDQo+ID4gKwkJSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERUdSRUVT LCAwLCAxNzQ1MzI5M30sDQo+ID4gwqAJe0hJRF9VU0FHRV9TRU5TT1JfSU5DTElOT01FVEVSXzNE LA0KPiA+IMKgCQlISURfVVNBR0VfU0VOU09SX1VOSVRTX1JBRElBTlMsIDEsIDB9LA0KPiA+IMKg DQo+ID4gQEAgLTU3LDcgKzU3LDcgQEANCj4gPiDCoAl7SElEX1VTQUdFX1NFTlNPUl9BTFMsIEhJ RF9VU0FHRV9TRU5TT1JfVU5JVFNfTFVYLCAxLCAwfSwNCj4gPiDCoA0KPiA+IMKgCXtISURfVVNB R0VfU0VOU09SX1BSRVNTVVJFLCAwLCAxMDAsIDB9LA0KPiA+IC0Je0hJRF9VU0FHRV9TRU5TT1Jf UFJFU1NVUkUsIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUEFTQ0FMLA0KPiA+IDAsIDEwMDB9LA0K PiA+ICsJe0hJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNf UEFTQ0FMLA0KPiA+IDAsIDEwMDAwMDB9LA0KPiA+IMKgfTsNCj4gPiDCoA0KPiA+IMKgc3RhdGlj IGludCBwb3dfMTAodW5zaWduZWQgcG93ZXIpDQo+ID4gQEAgLTI2NiwxNSArMjY2LDE1IEBAIGlu dCBoaWRfc2Vuc29yX3dyaXRlX3Jhd19oeXN0X3ZhbHVlKHN0cnVjdA0KPiA+IGhpZF9zZW5zb3Jf Y29tbW9uICpzdCwNCj4gPiDCoC8qDQo+ID4gwqAgKiBUaGlzIGZ1Y3Rpb24gYXBwbGllcyB0aGUg dW5pdCBleHBvbmVudCB0byB0aGUgc2NhbGUuDQo+ID4gwqAgKiBGb3IgZXhhbXBsZToNCj4gPiAt ICogOS44MDY2NTAgLT5leHA6Mi0+IHZhbDBbOTgwXXZhbDFbNjY1MDAwXQ0KPiA+IC0gKiA5LjAw MDgwNiAtPmV4cDoyLT4gdmFsMFs5MDBddmFsMVs4MDYwMF0NCj4gPiAtICogMC4xNzQ1MzUgLT5l eHA6Mi0+IHZhbDBbMTdddmFsMVs0NTM1MDBdDQo+ID4gLSAqIDEuMDAxNzQ1IC0+ZXhwOjAtPiB2 YWwwWzFddmFsMVsxNzQ1XQ0KPiA+IC0gKiAxLjAwMTc0NSAtPmV4cDoyLT4gdmFsMFsxMDBddmFs MVsxNzQ1MDBdDQo+ID4gLSAqIDEuMDAxNzQ1IC0+ZXhwOjQtPiB2YWwwWzEwMDE3XXZhbDFbNDUw MDAwXQ0KPiA+IC0gKiA5LjgwNjY1MCAtPmV4cDotMi0+IHZhbDBbMF12YWwxWzk4MDY2XQ0KPiA+ ICsgKiA5LjgwNjY1MDAwMCAtPmV4cDoyLT4gdmFsMFs5ODBddmFsMVs2NjUwMDAwMDBdDQo+ID4g KyAqIDkuMDAwODA2MDAwIC0+ZXhwOjItPiB2YWwwWzkwMF12YWwxWzgwNjAwMDAwXQ0KPiA+ICsg KiAwLjE3NDUzNTI5MyAtPmV4cDoyLT4gdmFsMFsxN112YWwxWzQ1MzUyOTMwMF0NCj4gPiArICog MS4wMDE3NDUzMjkgLT5leHA6MC0+IHZhbDBbMV12YWwxWzE3NDUzMjldDQo+ID4gKyAqIDEuMDAx NzQ1MzI5IC0+ZXhwOjItPiB2YWwwWzEwMF12YWwxWzE3NDUzMjkwMF0NCj4gPiArICogMS4wMDE3 NDUzMjkgLT5leHA6NC0+IHZhbDBbMTAwMTdddmFsMVs0NTMyOTAwMDBdDQo+ID4gKyAqIDkuODA2 NjUwMDAwIC0+ZXhwOi0yLT4gdmFsMFswXXZhbDFbOTgwNjY1MDBdDQo+ID4gwqAgKi8NCj4gPiAt c3RhdGljIHZvaWQgYWRqdXN0X2V4cG9uZW50X21pY3JvKGludCAqdmFsMCwgaW50ICp2YWwxLCBp bnQNCj4gPiBzY2FsZTAsDQo+ID4gK3N0YXRpYyB2b2lkIGFkanVzdF9leHBvbmVudF9uYW5vKGlu dCAqdmFsMCwgaW50ICp2YWwxLCBpbnQgc2NhbGUwLA0KPiA+IMKgCQkJCcKgwqBpbnQgc2NhbGUx LCBpbnQgZXhwKQ0KPiA+IMKgew0KPiA+IMKgCWludCBpOw0KPiA+IEBAIC0yODUsMzIgKzI4NSwz MiBAQCBzdGF0aWMgdm9pZCBhZGp1c3RfZXhwb25lbnRfbWljcm8oaW50ICp2YWwwLA0KPiA+IGlu dCAqdmFsMSwgaW50IHNjYWxlMCwNCj4gPiDCoAlpZiAoZXhwID4gMCkgew0KPiA+IMKgCQkqdmFs MCA9IHNjYWxlMCAqIHBvd18xMChleHApOw0KPiA+IMKgCQlyZXMgPSAwOw0KPiA+IC0JCWlmIChl eHAgPiA2KSB7DQo+ID4gKwkJaWYgKGV4cCA+IDkpIHsNCj4gPiDCoAkJCSp2YWwxID0gMDsNCj4g PiDCoAkJCXJldHVybjsNCj4gPiDCoAkJfQ0KPiA+IMKgCQlmb3IgKGkgPSAwOyBpIDwgZXhwOyAr K2kpIHsNCj4gPiAtCQkJeCA9IHNjYWxlMSAvIHBvd18xMCg1IC0gaSk7DQo+ID4gKwkJCXggPSBz Y2FsZTEgLyBwb3dfMTAoOCAtIGkpOw0KPiA+IMKgCQkJcmVzICs9IChwb3dfMTAoZXhwIC0gMSAt IGkpICogeCk7DQo+ID4gLQkJCXNjYWxlMSA9IHNjYWxlMSAlIHBvd18xMCg1IC0gaSk7DQo+ID4g KwkJCXNjYWxlMSA9IHNjYWxlMSAlIHBvd18xMCg4IC0gaSk7DQo+ID4gwqAJCX0NCj4gPiDCoAkJ KnZhbDAgKz0gcmVzOw0KPiA+IMKgCQkJKnZhbDEgPSBzY2FsZTEgKiBwb3dfMTAoZXhwKTsNCj4g PiDCoAl9IGVsc2UgaWYgKGV4cCA8IDApIHsNCj4gPiDCoAkJZXhwID0gYWJzKGV4cCk7DQo+ID4g LQkJaWYgKGV4cCA+IDYpIHsNCj4gPiArCQlpZiAoZXhwID4gOSkgew0KPiA+IMKgCQkJKnZhbDAg PSAqdmFsMSA9IDA7DQo+ID4gwqAJCQlyZXR1cm47DQo+ID4gwqAJCX0NCj4gPiDCoAkJKnZhbDAg PSBzY2FsZTAgLyBwb3dfMTAoZXhwKTsNCj4gPiDCoAkJcmVtID0gc2NhbGUwICUgcG93XzEwKGV4 cCk7DQo+ID4gwqAJCXJlcyA9IDA7DQo+ID4gLQkJZm9yIChpID0gMDsgaSA8ICg2IC0gZXhwKTsg KytpKSB7DQo+ID4gLQkJCXggPSBzY2FsZTEgLyBwb3dfMTAoNSAtIGkpOw0KPiA+IC0JCQlyZXMg Kz0gKHBvd18xMCg1IC0gZXhwIC0gaSkgKiB4KTsNCj4gPiAtCQkJc2NhbGUxID0gc2NhbGUxICUg cG93XzEwKDUgLSBpKTsNCj4gPiArCQlmb3IgKGkgPSAwOyBpIDwgKDkgLSBleHApOyArK2kpIHsN Cj4gPiArCQkJeCA9IHNjYWxlMSAvIHBvd18xMCg4IC0gaSk7DQo+ID4gKwkJCXJlcyArPSAocG93 XzEwKDggLSBleHAgLSBpKSAqIHgpOw0KPiA+ICsJCQlzY2FsZTEgPSBzY2FsZTEgJSBwb3dfMTAo OCAtIGkpOw0KPiA+IMKgCQl9DQo+ID4gLQkJKnZhbDEgPSByZW0gKiBwb3dfMTAoNiAtIGV4cCkg KyByZXM7DQo+ID4gKwkJKnZhbDEgPSByZW0gKiBwb3dfMTAoOSAtIGV4cCkgKyByZXM7DQo+ID4g wqAJfSBlbHNlIHsNCj4gPiDCoAkJKnZhbDAgPSBzY2FsZTA7DQo+ID4gwqAJCSp2YWwxID0gc2Nh bGUxOw0KPiA+IEBAIC0zMzIsMTQgKzMzMiwxNCBAQCBpbnQgaGlkX3NlbnNvcl9mb3JtYXRfc2Nh bGUodTMyIHVzYWdlX2lkLA0KPiA+IMKgCQkJdW5pdF9jb252ZXJzaW9uW2ldLnVuaXQgPT0gYXR0 cl9pbmZvLQ0KPiA+ID51bml0cykgew0KPiA+IMKgCQkJZXhwwqDCoD0gaGlkX3NlbnNvcl9jb252 ZXJ0X2V4cG9uZW50KA0KPiA+IMKgCQkJCQkJYXR0cl9pbmZvLQ0KPiA+ID51bml0X2V4cG8pOw0K PiA+IC0JCQlhZGp1c3RfZXhwb25lbnRfbWljcm8odmFsMCwgdmFsMSwNCj4gPiArCQkJYWRqdXN0 X2V4cG9uZW50X25hbm8odmFsMCwgdmFsMSwNCj4gPiDCoAkJCQkJdW5pdF9jb252ZXJzaW9uW2ld LnNjYWxlX3YNCj4gPiBhbDAsDQo+ID4gwqAJCQkJCXVuaXRfY29udmVyc2lvbltpXS5zY2FsZV92 DQo+ID4gYWwxLCBleHApOw0KPiA+IMKgCQkJYnJlYWs7DQo+ID4gwqAJCX0NCj4gPiDCoAl9DQo+ ID4gwqANCj4gPiAtCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOw0KPiA+ICsJcmV0dXJu IElJT19WQUxfSU5UX1BMVVNfTkFOTzsNCj4gPiDCoH0NCj4gPiDCoEVYUE9SVF9TWU1CT0woaGlk X3NlbnNvcl9mb3JtYXRfc2NhbGUpOw0KPiA+IMKgDQo+ID4g ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] iio: hid-sensors: Increase the precision of scale 2016-10-31 0:34 ` Pandruvada, Srinivas @ 2016-11-05 17:52 ` Jonathan Cameron 0 siblings, 0 replies; 4+ messages in thread From: Jonathan Cameron @ 2016-11-05 17:52 UTC (permalink / raw) To: Pandruvada, Srinivas, Song, Hongyan, linux-iio@vger.kernel.org On 31/10/16 00:34, Pandruvada, Srinivas wrote: > On Sun, 2016-10-30 at 16:22 +0000, Jonathan Cameron wrote: >> On 25/10/16 02:30, Song Hongyan wrote: >>> >>> While testing, it was observed that on some platforms the scale >>> value >>> from iio sysfs for gyroscope is always 0 (E.g. Yoga 260). This >>> results >>> in the final angular velocity component values to be zeros. >>> >>> This is caused by insufficient precision of scale value displayed >>> in sysfs. >>> If the precision is changed to nano from current micro, then this >>> is >>> sufficient to display the scale value on this platform. >>> Since this can be a problem for all other HID sensors, increase >>> scale >>> precision of all HID sensors to nano from current micro. >>> >>> Results on Yoga 260: >>> >>> name scale before scale now >>> -------------------------------------------- >>> gyro_3d 0.000000 0.000000174 >>> als 0.001000 0.001000000 >>> magn_3d 0.000001 0.000001000 >>> accel_3d 0.000009 0.000009806 >>> >>> Signed-off-by: Song Hongyan <hongyan.song@intel.com> > Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> > > Hi Jonathan, >> Hi >> >> Looks right to me, Srinivas, I'd like your Ack on this ideally. > > I have added my ACK. > Again I've amended the patch title a touch to make it clear this is a fix we really want in stable. Applied to the togreg branch of iio.git and marked for stable. Thanks, Jonathan > Thanks, > Srinivas > >> thanks, >> >> Jonathan >>> >>> --- >>> .../iio/common/hid-sensors/hid-sensor-attributes.c | 56 >>> +++++++++++----------- >>> 1 file changed, 28 insertions(+), 28 deletions(-) >>> >>> diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c >>> b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c >>> index dc33c1d..b5beea53 100644 >>> --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c >>> +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c >>> @@ -30,26 +30,26 @@ >>> u32 usage_id; >>> int unit; /* 0 for default others from HID sensor spec */ >>> int scale_val0; /* scale, whole number */ >>> - int scale_val1; /* scale, fraction in micros */ >>> + int scale_val1; /* scale, fraction in nanos */ >>> } unit_conversion[] = { >>> - {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, >>> + {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650000}, >>> {HID_USAGE_SENSOR_ACCEL_3D, >>> HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, >>> {HID_USAGE_SENSOR_ACCEL_3D, >>> - HID_USAGE_SENSOR_UNITS_G, 9, 806650}, >>> + HID_USAGE_SENSOR_UNITS_G, 9, 806650000}, >>> >>> - {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453}, >>> + {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453293}, >>> {HID_USAGE_SENSOR_GYRO_3D, >>> HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND, 1, 0}, >>> {HID_USAGE_SENSOR_GYRO_3D, >>> - HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, >>> 17453}, >>> + HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, >>> 17453293}, >>> >>> - {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000}, >>> + {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000000}, >>> {HID_USAGE_SENSOR_COMPASS_3D, >>> HID_USAGE_SENSOR_UNITS_GAUSS, 1, 0}, >>> >>> - {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453}, >>> + {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453293}, >>> {HID_USAGE_SENSOR_INCLINOMETER_3D, >>> - HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453}, >>> + HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453293}, >>> {HID_USAGE_SENSOR_INCLINOMETER_3D, >>> HID_USAGE_SENSOR_UNITS_RADIANS, 1, 0}, >>> >>> @@ -57,7 +57,7 @@ >>> {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, >>> >>> {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0}, >>> - {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, >>> 0, 1000}, >>> + {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, >>> 0, 1000000}, >>> }; >>> >>> static int pow_10(unsigned power) >>> @@ -266,15 +266,15 @@ int hid_sensor_write_raw_hyst_value(struct >>> hid_sensor_common *st, >>> /* >>> * This fuction applies the unit exponent to the scale. >>> * For example: >>> - * 9.806650 ->exp:2-> val0[980]val1[665000] >>> - * 9.000806 ->exp:2-> val0[900]val1[80600] >>> - * 0.174535 ->exp:2-> val0[17]val1[453500] >>> - * 1.001745 ->exp:0-> val0[1]val1[1745] >>> - * 1.001745 ->exp:2-> val0[100]val1[174500] >>> - * 1.001745 ->exp:4-> val0[10017]val1[450000] >>> - * 9.806650 ->exp:-2-> val0[0]val1[98066] >>> + * 9.806650000 ->exp:2-> val0[980]val1[665000000] >>> + * 9.000806000 ->exp:2-> val0[900]val1[80600000] >>> + * 0.174535293 ->exp:2-> val0[17]val1[453529300] >>> + * 1.001745329 ->exp:0-> val0[1]val1[1745329] >>> + * 1.001745329 ->exp:2-> val0[100]val1[174532900] >>> + * 1.001745329 ->exp:4-> val0[10017]val1[453290000] >>> + * 9.806650000 ->exp:-2-> val0[0]val1[98066500] >>> */ >>> -static void adjust_exponent_micro(int *val0, int *val1, int >>> scale0, >>> +static void adjust_exponent_nano(int *val0, int *val1, int scale0, >>> int scale1, int exp) >>> { >>> int i; >>> @@ -285,32 +285,32 @@ static void adjust_exponent_micro(int *val0, >>> int *val1, int scale0, >>> if (exp > 0) { >>> *val0 = scale0 * pow_10(exp); >>> res = 0; >>> - if (exp > 6) { >>> + if (exp > 9) { >>> *val1 = 0; >>> return; >>> } >>> for (i = 0; i < exp; ++i) { >>> - x = scale1 / pow_10(5 - i); >>> + x = scale1 / pow_10(8 - i); >>> res += (pow_10(exp - 1 - i) * x); >>> - scale1 = scale1 % pow_10(5 - i); >>> + scale1 = scale1 % pow_10(8 - i); >>> } >>> *val0 += res; >>> *val1 = scale1 * pow_10(exp); >>> } else if (exp < 0) { >>> exp = abs(exp); >>> - if (exp > 6) { >>> + if (exp > 9) { >>> *val0 = *val1 = 0; >>> return; >>> } >>> *val0 = scale0 / pow_10(exp); >>> rem = scale0 % pow_10(exp); >>> res = 0; >>> - for (i = 0; i < (6 - exp); ++i) { >>> - x = scale1 / pow_10(5 - i); >>> - res += (pow_10(5 - exp - i) * x); >>> - scale1 = scale1 % pow_10(5 - i); >>> + for (i = 0; i < (9 - exp); ++i) { >>> + x = scale1 / pow_10(8 - i); >>> + res += (pow_10(8 - exp - i) * x); >>> + scale1 = scale1 % pow_10(8 - i); >>> } >>> - *val1 = rem * pow_10(6 - exp) + res; >>> + *val1 = rem * pow_10(9 - exp) + res; >>> } else { >>> *val0 = scale0; >>> *val1 = scale1; >>> @@ -332,14 +332,14 @@ int hid_sensor_format_scale(u32 usage_id, >>> unit_conversion[i].unit == attr_info- >>>> units) { >>> exp = hid_sensor_convert_exponent( >>> attr_info- >>>> unit_expo); >>> - adjust_exponent_micro(val0, val1, >>> + adjust_exponent_nano(val0, val1, >>> unit_conversion[i].scale_v >>> al0, >>> unit_conversion[i].scale_v >>> al1, exp); >>> break; >>> } >>> } >>> >>> - return IIO_VAL_INT_PLUS_MICRO; >>> + return IIO_VAL_INT_PLUS_NANO; >>> } >>> EXPORT_SYMBOL(hid_sensor_format_scale); >>> ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-11-05 17:52 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-10-25 1:30 [PATCH] iio: hid-sensors: Increase the precision of scale Song Hongyan 2016-10-30 16:22 ` Jonathan Cameron 2016-10-31 0:34 ` Pandruvada, Srinivas 2016-11-05 17:52 ` Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).