diff options
Diffstat (limited to 'firmware/target/arm/imx233/adc-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/adc-imx233.c | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/firmware/target/arm/imx233/adc-imx233.c b/firmware/target/arm/imx233/adc-imx233.c index 8236f58767..4f183ac531 100644 --- a/firmware/target/arm/imx233/adc-imx233.c +++ b/firmware/target/arm/imx233/adc-imx233.c | |||
@@ -23,12 +23,72 @@ | |||
23 | #include "adc.h" | 23 | #include "adc.h" |
24 | #include "adc-target.h" | 24 | #include "adc-target.h" |
25 | 25 | ||
26 | /* dedicate two channels to temperature sensing | ||
27 | * dedicate channel 7 to battery | ||
28 | * and channel 6 to vddio */ | ||
29 | static int pmos_chan, nmos_chan; | ||
30 | static int battery_chan, vddio_chan; | ||
31 | |||
26 | void adc_init(void) | 32 | void adc_init(void) |
27 | { | 33 | { |
34 | imx233_lradc_init(); | ||
35 | battery_chan = 7; | ||
36 | imx233_lradc_reserve_channel(7); | ||
37 | vddio_chan = 6; | ||
38 | imx233_lradc_reserve_channel(6); | ||
39 | |||
40 | pmos_chan = imx233_lradc_acquire_channel(0); | ||
41 | if(pmos_chan < 0) panicf("No LRADC channel for PMOS !"); | ||
42 | nmos_chan = imx233_lradc_acquire_channel(0); | ||
43 | if(nmos_chan < 0) panicf("No LRADC channel for NMOS !"); | ||
44 | |||
45 | // setup them | ||
46 | imx233_lradc_setup_channel(battery_chan, false, false, 0, HW_LRADC_CHANNEL_BATTERY); | ||
47 | imx233_lradc_setup_channel(vddio_chan, false, false, 0, HW_LRADC_CHANNEL_VDDIO); | ||
48 | imx233_lradc_setup_channel(nmos_chan, false, false, 0, HW_LRADC_CHANNEL_NMOS_THIN); | ||
49 | imx233_lradc_setup_channel(pmos_chan, false, false, 0, HW_LRADC_CHANNEL_PMOS_THIN); | ||
50 | } | ||
51 | |||
52 | int adc_read_physical_ex(int virt) | ||
53 | { | ||
54 | imx233_lradc_clear_channel(virt); | ||
55 | imx233_lradc_kick_channel(virt); | ||
56 | imx233_lradc_wait_channel(virt); | ||
57 | int v = imx233_lradc_read_channel(virt); | ||
58 | return v; | ||
59 | } | ||
60 | |||
61 | int adc_read_physical(int src) | ||
62 | { | ||
63 | int virt = imx233_lradc_acquire_channel(TIMEOUT_BLOCK); | ||
64 | // divide by two for wider ranger | ||
65 | imx233_lradc_setup_channel(virt, false, false, 0, src); | ||
66 | int val = adc_read_physical_ex(virt); | ||
67 | imx233_lradc_release_channel(virt); | ||
68 | return val; | ||
69 | } | ||
70 | |||
71 | unsigned short adc_read_virtual(int c) | ||
72 | { | ||
73 | switch(c) | ||
74 | { | ||
75 | case IMX233_ADC_BATTERY: | ||
76 | return adc_read_physical_ex(battery_chan); | ||
77 | case IMX233_ADC_VDDIO: | ||
78 | return adc_read_physical_ex(vddio_chan); | ||
79 | case IMX233_ADC_DIE_TEMP: | ||
80 | // do kelvin to celsius conversion | ||
81 | return imx233_lradc_sense_die_temperature(nmos_chan, pmos_chan) - 273; | ||
82 | default: | ||
83 | return 0; | ||
84 | } | ||
28 | } | 85 | } |
29 | 86 | ||
30 | unsigned short adc_read(int channel) | 87 | unsigned short adc_read(int channel) |
31 | { | 88 | { |
32 | (void) channel; | 89 | int c = imx233_adc_mapping[channel]; |
33 | return 0; | 90 | if(c < 0) |
91 | return adc_read_virtual(c); | ||
92 | else | ||
93 | return adc_read_physical(c); | ||
34 | } | 94 | } |