summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/adc-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-06-16 20:59:36 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-06-17 00:29:25 +0200
commitf4fdf1ffe2189dafd1ebbbbf50f1a4626364ead3 (patch)
tree03a43c6fd5d20fd9354e34903840f7d7baffa117 /firmware/target/arm/imx233/adc-imx233.c
parent239219ee70aa02a324fb94b6e463781c5c77beea (diff)
downloadrockbox-f4fdf1ffe2189dafd1ebbbbf50f1a4626364ead3.tar.gz
rockbox-f4fdf1ffe2189dafd1ebbbbf50f1a4626364ead3.zip
imx233: fix lradc/adc for stmp3600 and stmp3700
The lradc architecture of the stmp3600 is rather different: only channels 6 and 7 have configurable source and we need to take care when allocating channels so that we can actually measure the right channel! Delegate die temperature sensing to the power block on stmp3600. Change-Id: I0860eb4ea98240facc3d4a19d61684eca5f630cc
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;