Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934294AbdDGT2F (ORCPT ); Fri, 7 Apr 2017 15:28:05 -0400 Received: from mout.kundenserver.de ([212.227.126.131]:50847 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932552AbdDGT15 (ORCPT ); Fri, 7 Apr 2017 15:27:57 -0400 Date: Fri, 7 Apr 2017 21:27:27 +0200 From: Andreas Klinger To: Matt Ranostay Cc: Linus Walleij , Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald , Vlad Dogaru , Akinobu Mita , Wei Yongjun , Aniroop Mathur , "linux-iio@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH] IIO: bmp280-core.c: fix error in humidity calculation Message-ID: <20170407192727.GA4205@project> References: <20170327100646.GA8128@project> <2bec8c26-f33c-d331-aa97-047871b4cc57@kernel.org> <20170402172949.GA1479@project> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Provags-ID: V03:K0:usJfc434XsBRoajhPZsEouH64+EkU4Ynztk4cFSi8NSG9byJH0k OWn8owqHl2T4d8elBdfDMBqeTYOEf2E4k2jUqWOKBEf9RWVR1DRZKBd6zrL3wdlxY8Kxqgd j6BpqFLEXqCqttgBAFjvwtuhKFfKZAVRR1EFZZpcS4jJXNBUWjReHEUM5Ag/AP4p3JcUoVI an5iUSEnnWqdPRFVo3HMw== X-UI-Out-Filterresults: notjunk:1;V01:K0:N74O8UIOWtY=:1VDCRHz6fNBo+o1jvqYH28 8m4ptkJQCojx/XvvVAlBicJxgsTzfdBsls1SaV1cFq2sgfVajNp8RRp/8cBXHdgmpcM87841t hdxaQXlUSn82tnnD8QaYYnccrta1QY5lwVn04gD7vU6QZVpIbsdG26k60A59bnU7AQ5k4PDGj iVRtoIsFFmij6EQFJLn837eOJV+JfldvtF2YAd94RhtzdCikMaYXTVVQXnJ/8vS5VozyHWaM0 kOzQTeDLSzmPHqxS2//+zaYZYhHrVo0xyQvSfL6nKSYkZfO8YZKuBX2fZ6rXVe1zRLxx/LHxy sVytq5jR9lvf4kjVkn5udBm/i/AbrvPQoewHACCr5GUpMLfenTD4ixo+6ohLe0a57WlILQWOL bO4zEt0OwK8StT7GqH4WsBWrZhSrTm5RBrCLOOTXobx8y33Q9pulbElrA2NcYz8MnYZDdU/Cw ir/ugL+FspGJJX76uOLem0C+shpAg3F2k6CfVCoqFdZluD67Z948ZZ8+ek28sxmlgSsgjQNf0 cSV3MRPjZz53ODKic19rRt2OfHqT069pffVmRgoUx3CPQIINkmEucviW9bbMa9Ba3vQpWHNA3 RvJi3dwziJE9ibzMhiVJPqsmsVuBOysHh3fLBWiygqJedGAOlId1S0+psmRVqZk/t0B/lwtEa ls7WLAYEpE3PuJs8ZyERJpmAm90URfgbpNwzIgFWelqHjA8aAdowXoDWur97BqVNCDsI= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4326 Lines: 146 Hi Matt, i've extracted the error condition in a small userspace application for demonstration. Just compile and see that in this case the variable H3 is zero but the whole term evaluates differently if treated as unsigned or signed. The whole example including the values of the variables are taken from the real driver. Andreas Now the example: --- /* * humidity.c * this test program is just for demonstrating the difference in the * calculation of humidity compensation with BME280 sensor * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */ #include #include int main(int argn, char* argv[]) { int adc_humidity = 28275; int t_fine = 50623; unsigned int H1 = 75, H3 = 0; int H2 = 360, H4 = 324, H5 = 0, H6 = 30; int var; var = -26177; /* extracted errornous term with cast */ printf("with cast: %d\n", (((var * H6) >> 10) * (((var * (int)H3) >> 11) + (int)32768)) >> 10); /* extracted errornous term now without a cast */ printf("without cast: %d\n", (((var * H6) >> 10) * (((var * H3) >> 11) + 32768)) >> 10); printf("\n"); printf("t_fine: %d; humidity: %d\nH: %d; %d; %d; %d; %d; %d\n", t_fine, adc_humidity, H1, H2, H3, H4, H5, H6); printf("\n"); /* the whole example taken from the driver */ /* with the cast as proposed by the documentation */ var = ((int)t_fine) - (int)76800; var = ((((adc_humidity << 14) - (H4 << 20) - (H5 * var)) + (int)16384) >> 15) * (((((((var * H6) >> 10) * (((var * (int)H3) >> 11) + (int)32768)) >> 10) + (int)2097152) * H2 + 8192) >> 14); var -= ((((var >> 15) * (var >> 15)) >> 7) * (int)H1) >> 4; printf("with cast: var: %d\n", var>>12); printf("\n"); /* now the same calculation without the cast */ var = (t_fine) - 76800; var = ((((adc_humidity << 14) - (H4 << 20) - (H5 * var)) + 16384) >> 15) * (((((((var * H6) >> 10) * (((var * H3) >> 11) + 32768)) >> 10) + 2097152) * H2 + 8192) >> 14); var -= ((((var >> 15) * (var >> 15)) >> 7) * H1) >> 4; printf("without cast: var: %d\n", var>>12); return 0; } --- Output: with cast: -24544 without cast: 4169760 t_fine: 50623; humidity: 28275 H: 75; 360; 0; 324; 0; 30 with cast: var: 41671 without cast: var: 124497 --- Matt Ranostay schrieb am Thu, 06. Apr 23:13: > On Mon, Apr 3, 2017 at 11:16 PM, Matt Ranostay > wrote: > > On Sun, Apr 2, 2017 at 10:29 AM, Andreas Klinger wrote: > >> Linus Walleij schrieb am Sun, 02. Apr 16:56: > >>> On Sun, Apr 2, 2017 at 11:32 AM, Jonathan Cameron wrote: > >>> > On 27/03/17 11:06, Andreas Klinger wrote: > >>> >> While calculating the compensation of the humidity there are negative > >>> >> values interpreted as unsigned because of unsigned variables used. > >>> >> These values need to be casted to signed as indicated by the documentation > >>> >> of the sensor. > >>> >> > >>> >> Signed-off-by: Andreas Klinger > >>> > > >>> > Looks superficially right to me, but would like an Ack from Linus Walleij. > >>> > >>> I didn't work on these calculations, only infrastructure for the driver > >>> but FWIW: > >>> Acked-by: Linus Walleij > >>> > >>> Matt Ranostay @Intel is the person you probably want to ACK it though, > >>> he added the humidity calculations :) > >> > >> It just turned out that there must be another error in the calculation. I'll fix > >> and test it first. > >> > >> When i'm done i'll send a new version of the patch. > >> > > > > Ok will hold off till review till the next patchset... BTW this > > datasheet's calculations made my eyes bleed so it is quiet likely it > > has bugs... > > Hmm the datatypes you are casting to s32 are already signed > integers... Interested in what you found on what the actual bug is. > > > > > Thanks, > > > > Matt > > > >> Andreas > >> > >>> > >>> Yours, > >>> Linus Walleij > >> > >> -- > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-iio" in > >> the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html --