summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/adc-imx233.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233/adc-imx233.c')
-rw-r--r--firmware/target/arm/imx233/adc-imx233.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/firmware/target/arm/imx233/adc-imx233.c b/firmware/target/arm/imx233/adc-imx233.c
index 9b5af82d5d..a6025cfde9 100644
--- a/firmware/target/arm/imx233/adc-imx233.c
+++ b/firmware/target/arm/imx233/adc-imx233.c
@@ -20,6 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22#include "adc-imx233.h" 22#include "adc-imx233.h"
23#include "power-imx233.h"
23 24
24void adc_init(void) 25void adc_init(void)
25{ 26{
@@ -35,7 +36,7 @@ static short adc_read_physical_ex(int virt)
35 36
36static short adc_read_physical(int src, bool div2) 37static short adc_read_physical(int src, bool div2)
37{ 38{
38 int virt = imx233_lradc_acquire_channel(TIMEOUT_BLOCK); 39 int virt = imx233_lradc_acquire_channel(src, TIMEOUT_BLOCK);
39 // divide by two for wider ranger 40 // divide by two for wider ranger
40 imx233_lradc_setup_channel(virt, div2, false, 0, src); 41 imx233_lradc_setup_channel(virt, div2, false, 0, src);
41 int val = adc_read_physical_ex(virt); 42 int val = adc_read_physical_ex(virt);
@@ -52,14 +53,17 @@ static short adc_read_virtual(int c)
52 case IMX233_ADC_VDDIO: 53 case IMX233_ADC_VDDIO:
53 /* VddIO pin has a builtin 2:1 divide */ 54 /* VddIO pin has a builtin 2:1 divide */
54 return adc_read_physical(LRADC_SRC_VDDIO, false); 55 return adc_read_physical(LRADC_SRC_VDDIO, false);
56#if IMX233_SUBTARGET >= 3700
55 case IMX233_ADC_VDD5V: 57 case IMX233_ADC_VDD5V:
56 /* Vdd5V pin has a builtin 4:1 divide */ 58 /* Vdd5V pin has a builtin 4:1 divide */
57 return adc_read_physical(LRADC_SRC_5V, false) * 2; 59 return adc_read_physical(LRADC_SRC_5V, false) * 2;
60#endif
58 case IMX233_ADC_DIE_TEMP: 61 case IMX233_ADC_DIE_TEMP:
59 { 62 {
63#if IMX233_SUBTARGET >= 3700
60 // don't block on second channel otherwise we might deadlock ! 64 // don't block on second channel otherwise we might deadlock !
61 int nmos_chan = imx233_lradc_acquire_channel(TIMEOUT_BLOCK); 65 int nmos_chan = imx233_lradc_acquire_channel(LRADC_SRC_NMOS_THIN, TIMEOUT_BLOCK);
62 int pmos_chan = imx233_lradc_acquire_channel(TIMEOUT_NOBLOCK); 66 int pmos_chan = imx233_lradc_acquire_channel(LRADC_SRC_PMOS_THIN, TIMEOUT_NOBLOCK);
63 int val = 0; 67 int val = 0;
64 if(pmos_chan >= 0) 68 if(pmos_chan >= 0)
65 { 69 {
@@ -67,12 +71,19 @@ static short adc_read_virtual(int c)
67 imx233_lradc_release_channel(pmos_chan); 71 imx233_lradc_release_channel(pmos_chan);
68 } 72 }
69 imx233_lradc_release_channel(nmos_chan); 73 imx233_lradc_release_channel(nmos_chan);
74#else
75 int min, max, val;
76 if(imx233_power_sense_die_temperature(&min, &max) < 0)
77 val = -1;
78 else
79 val = (max + min) / 2;
80#endif
70 return val; 81 return val;
71 } 82 }
72#ifdef IMX233_BATT_TEMP_SENSOR 83#ifdef IMX233_BATT_TEMP_SENSOR
73 case IMX233_ADC_BATT_TEMP: 84 case IMX233_ADC_BATT_TEMP:
74 { 85 {
75 int virt = imx233_lradc_acquire_channel(TIMEOUT_BLOCK); 86 int virt = imx233_lradc_acquire_channel(IMX233_BATT_TEMP_SENSOR, TIMEOUT_BLOCK);
76 int val = imx233_lradc_sense_ext_temperature(virt, IMX233_BATT_TEMP_SENSOR); 87 int val = imx233_lradc_sense_ext_temperature(virt, IMX233_BATT_TEMP_SENSOR);
77 imx233_lradc_release_channel(virt); 88 imx233_lradc_release_channel(virt);
78 return val; 89 return val;