Hi, On 04/07/2013 10:58, Hector Palacios wrote: > > The field of the register that stores the sample is 18 bits, but each > sample is only 12 bits. The read_raw of a given channel will only read > one sample and thus returns a value between 0 and 4095. > If I use realbits here it will divide the Vref_mv by (1 << 18) and will > give me a wrong scale value. > Either we change the 'realbits' to 12 which is the real resolution of > the ADC, or we leave it as 18 and use a 12 in this operation. > As said I didn't have a deep look at it so you are probably right. >> Using IIO_VAL_FRACTIONAL_LOG2 allows you to avoid doing that computation >> in your driver (sometimes, it is actually difficult to get it right >> because you have to use 64 bits numbers). >> >> Also, it simplifies things a bit, you can then use something like: >> >> case IIO_CHAN_INFO_SCALE: >> *val = lut[chan->channel]; >> *val2 = chan->scan_type.realbits - is_divide_by_two; >> return IIO_VAL_FRACTIONAL_LOG2; > > Yes, but not all channels have a by two divisor. Some have a by 4, so > I'll need to work out a formula per channel divisor. > When using IIO_VAL_FRACTIONAL_LOG2, val must be given in mV? > val is in mV indeed. My first go at it was something along the lines: *val = 1850; *val2 = 12 - divider[chan->channel] - is_divide_by_two; But as Lars suggested you could also have something like: *val = Vmax[chan->channel]; *val2 = 12 - is_divide_by_two; -- Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html