> > The LP8788 has 13 ADC input selection. > > > > ADC selection: > > Battery voltage, general ADC1 and so on. > > > > ADC result: > > Result = MAX_VALUE * (raw + 0.5) / 4095 except ADC is the charger > voltage > > If the ADC input is the charger voltage, > > Result = MAX_VALUE * (raw + 0.5) / (4095 * 0.48) > > > > The raw value is from the registers. > > It has the range between 0 to 4095. (12bits) > > > > MAX_VALUE is constant for each selection. > > For the battery voltage, there are three ADC inputs. 5.0/5.5/6.0V > > Battery voltage for Max 5.0V = 5.0 > > Battery voltage for Max 5.5V = 5.5 > > Battery voltage for Max 6.0V = 6.0 > > Charger = 6.0 > > ADC1 = 2.5 > > > > I'm afraid I still misunderstand how IIO ADC works. > > Could you me some guide how to setup the scale in the driver? > > The scale is a fixpoint value, which should be multiplied with the raw > value > to get the result in the proper unit. The unit depends on the channel > type, > e.g. for voltage it is mV and for temperature it is C. The number of > decimal > places for the fixed point value depends on whether you return > INT_PLUS_MICRO it's 6, if you return INT_PLUS_NANO it is 9. The digits > before the decimal point are stored in "val" the digits after the > decimal > point are stored in "val2". > > E.g. if you have > *val = 1; > *val2 = 1256; > return INT_PLUS_MICRO; > > your scale factor is 1.001256, if you'd return INT_PLUS_NANO you scale > factor would be 1.0000001256 instead. > > In your case you could for example calculate the voltage scales as: > > tmp = MAX_VALUE * 1000000 / 4095; > *val = tmp / 1000000; > *val2 = tmp % 1000000; > > This assumes that MAX_VALUE is in millivolt. > > E.g. if MAX_VALUE is 5.0V you should get a scale of 1.220703 (val = 1, > val2 > = 220703). Since your MAX_VALUE is fixed you can probably just pre- > calculate > the result of MAX_VALUE * 1000000 / 4095 for each channel, similar like > you > already did with your lp8788_scale table. Superb! Thanks a lot for your clear explanation. I have one more question about the temperature ADC. The LP8788 has no dedicated temperature ADC, but it provides four general inputs - ADC1 to 4. The IIO consumer can get the battery temperature among general ADC inputs. I think the ADC driver should not assume that ADC1..4 is for the temperature, because the selection is configurable in the platform side. Then how can I set the unit of ADC MAX_VALUE? I would set the unit of ADC MAX_VALUE to mili (same as voltage) and the result is converted by the IIO consumer manually. Does it make sense ? Best Regards, Milo -- 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