FreeCalypso > hg > fc-tourmaline
view src/cs/drivers/drv_app/fchg/fchg_convert_mA.c @ 268:f2e52cab0a73
abb_inth.c: check all interrupt causes, not just one
The original code used if - else if - else if etc constructs, thus
the first detected interrupt was the only one handled. However,
Iota ITSTATREG is a clear-on-read register, thus if we only handle
the first detected interrupt and skip checking the others, then the
other interrupts will be lost, if more than one interrupt happened
to occur in one ABB interrupt handling cycle - a form of rare race
condition. Change the code to check all interrupts that were read
in this cycle.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 13 Jun 2021 18:17:53 +0000 |
| parents | 09ea37852fd6 |
| children |
line wrap: on
line source
/* * This module implements the fchg_convert_ichg_to_mA() function, * converting charging current (Ichg) measurements from ADC units * to human-friendly mA numbers. In the phone hardware this current * measurement is made with the aid of a current measurement resistor * placed in the charging current path (the Iota chip's MADC actually * measures the voltage across this resistor, between VCCS and VBATS * terminals), and it just so happens that different phone designers * have chosen different values for this current measurement resistor: * Pirelli DP-L10 uses 0.20R, following TI's canon, whereas Mot C1xx * phones use 0.15R. Because of these different resistor values, * the formula for converting ADC units to mA becomes target-dependent. */ #include "fchg/fchg_api.h" #include "fc-target.h" UINT16 fchg_convert_ichg_to_mA(UINT16 ichg) { #ifdef CONFIG_TARGET_COMPAL /* formula for 0.15R */ return (ichg * 875 / 768); #else /* formula for 0.20R */ return (ichg * 875 / 1024); #endif }
