summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-11-14 21:05:14 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-11-14 21:05:14 +0000
commite167c1d8d7566a4b6422fd6764b5961c69a4600b (patch)
treeb230cec8c45c97816f0aaa0083e60ea215f2e817 /firmware
parenta9d56ac5de93611b80fa46992390428719782f79 (diff)
downloadrockbox-e167c1d8d7566a4b6422fd6764b5961c69a4600b.tar.gz
rockbox-e167c1d8d7566a4b6422fd6764b5961c69a4600b.zip
imx233: add automatic battery conversion using delay channel, make 5V a virtual channel since it has a builtin divider
fuze+: use 5V virtual channel git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30982 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/imx233/adc-imx233.c24
-rw-r--r--firmware/target/arm/imx233/adc-imx233.h1
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/adc-fuzeplus.c4
3 files changed, 22 insertions, 7 deletions
diff --git a/firmware/target/arm/imx233/adc-imx233.c b/firmware/target/arm/imx233/adc-imx233.c
index b23e57f9b4..5e9717b922 100644
--- a/firmware/target/arm/imx233/adc-imx233.c
+++ b/firmware/target/arm/imx233/adc-imx233.c
@@ -30,25 +30,37 @@
30 * and channel 6 to vddio */ 30 * and channel 6 to vddio */
31static int pmos_chan, nmos_chan; 31static int pmos_chan, nmos_chan;
32static int battery_chan, vddio_chan; 32static int battery_chan, vddio_chan;
33static int battery_delay_chan;
33 34
34void adc_init(void) 35void adc_init(void)
35{ 36{
36 imx233_lradc_init(); 37 imx233_lradc_init();
38 /* reserve channels 6 for vddio and 7 for battery (special for conversion) */
37 battery_chan = 7; 39 battery_chan = 7;
38 vddio_chan = 6; 40 vddio_chan = 6;
39 imx233_lradc_reserve_channel(battery_chan); 41 imx233_lradc_reserve_channel(battery_chan);
40 imx233_lradc_reserve_channel(vddio_chan); 42 imx233_lradc_reserve_channel(vddio_chan);
41 43 /* reserve any channels for PMOS and NMOS */
42 pmos_chan = imx233_lradc_acquire_channel(TIMEOUT_NOBLOCK); 44 pmos_chan = imx233_lradc_acquire_channel(TIMEOUT_NOBLOCK);
43 if(pmos_chan < 0) panicf("No LRADC channel for PMOS !"); 45 if(pmos_chan < 0) panicf("No LRADC channel for PMOS !");
44 nmos_chan = imx233_lradc_acquire_channel(TIMEOUT_NOBLOCK); 46 nmos_chan = imx233_lradc_acquire_channel(TIMEOUT_NOBLOCK);
45 if(nmos_chan < 0) panicf("No LRADC channel for NMOS !"); 47 if(nmos_chan < 0) panicf("No LRADC channel for NMOS !");
46 48
47 // setup them 49 /* setup them for the simplest use: no accumulation, no division*/
48 imx233_lradc_setup_channel(battery_chan, false, false, 0, HW_LRADC_CHANNEL_BATTERY); 50 imx233_lradc_setup_channel(battery_chan, false, false, 0, HW_LRADC_CHANNEL_BATTERY);
49 imx233_lradc_setup_channel(vddio_chan, false, false, 0, HW_LRADC_CHANNEL_VDDIO); 51 imx233_lradc_setup_channel(vddio_chan, false, false, 0, HW_LRADC_CHANNEL_VDDIO);
50 imx233_lradc_setup_channel(nmos_chan, false, false, 0, HW_LRADC_CHANNEL_NMOS_THIN); 52 imx233_lradc_setup_channel(nmos_chan, false, false, 0, HW_LRADC_CHANNEL_NMOS_THIN);
51 imx233_lradc_setup_channel(pmos_chan, false, false, 0, HW_LRADC_CHANNEL_PMOS_THIN); 53 imx233_lradc_setup_channel(pmos_chan, false, false, 0, HW_LRADC_CHANNEL_PMOS_THIN);
54 /* setup delay channel for battery for automatic reading and scaling */
55 battery_delay_chan = 0;
56 imx233_lradc_reserve_delay(battery_delay_chan);
57 /* setup delay to trigger battery channel and retrigger itself.
58 * The counter runs at 2KHz so a delay of 200 will trigger 10
59 * conversions per seconds */
60 imx233_lradc_setup_delay(battery_delay_chan, 1 << battery_chan,
61 1 << battery_delay_chan, 0, 200);
62 /* enable automatic conversion, use Li-Ion type battery */
63 imx233_lradc_setup_battery_conversion(true, HW_LRADC_CONVERSION__SCALE_FACTOR__LI_ION);
52} 64}
53 65
54int adc_read_physical_ex(int virt) 66int adc_read_physical_ex(int virt)
@@ -56,8 +68,7 @@ int adc_read_physical_ex(int virt)
56 imx233_lradc_clear_channel(virt); 68 imx233_lradc_clear_channel(virt);
57 imx233_lradc_kick_channel(virt); 69 imx233_lradc_kick_channel(virt);
58 imx233_lradc_wait_channel(virt); 70 imx233_lradc_wait_channel(virt);
59 int v = imx233_lradc_read_channel(virt); 71 return imx233_lradc_read_channel(virt);
60 return v;
61} 72}
62 73
63int adc_read_physical(int src) 74int adc_read_physical(int src)
@@ -75,9 +86,12 @@ unsigned short adc_read_virtual(int c)
75 switch(c) 86 switch(c)
76 { 87 {
77 case IMX233_ADC_BATTERY: 88 case IMX233_ADC_BATTERY:
78 return adc_read_physical_ex(battery_chan); 89 return /*imx233_lradc_read_battery_voltage()*/adc_read_physical_ex(battery_chan);
79 case IMX233_ADC_VDDIO: 90 case IMX233_ADC_VDDIO:
80 return adc_read_physical_ex(vddio_chan); 91 return adc_read_physical_ex(vddio_chan);
92 case IMX233_ADC_5V:
93 /* channel 15 5V has a 4:1 built it divider */
94 return adc_read_physical(HW_LRADC_CHANNEL_5V) * 4;
81 case IMX233_ADC_DIE_TEMP: 95 case IMX233_ADC_DIE_TEMP:
82 // do kelvin to celsius conversion 96 // do kelvin to celsius conversion
83 return imx233_lradc_sense_die_temperature(nmos_chan, pmos_chan) - 273; 97 return imx233_lradc_sense_die_temperature(nmos_chan, pmos_chan) - 273;
diff --git a/firmware/target/arm/imx233/adc-imx233.h b/firmware/target/arm/imx233/adc-imx233.h
index 6025fdcdf8..7468fbe3c3 100644
--- a/firmware/target/arm/imx233/adc-imx233.h
+++ b/firmware/target/arm/imx233/adc-imx233.h
@@ -29,6 +29,7 @@
29#define IMX233_ADC_BATTERY -1 /* Battery voltage (mV) */ 29#define IMX233_ADC_BATTERY -1 /* Battery voltage (mV) */
30#define IMX233_ADC_DIE_TEMP -2 /* Die temperature (°C) */ 30#define IMX233_ADC_DIE_TEMP -2 /* Die temperature (°C) */
31#define IMX233_ADC_VDDIO -3 /* VddIO voltage (mV) */ 31#define IMX233_ADC_VDDIO -3 /* VddIO voltage (mV) */
32#define IMX233_ADC_5V -4 /* Vdd5V voltage (mV) */
32 33
33/* Channel mapping */ 34/* Channel mapping */
34extern int imx233_adc_mapping[]; 35extern int imx233_adc_mapping[];
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/adc-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/adc-fuzeplus.c
index 757ec72519..2da440b170 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/adc-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/adc-fuzeplus.c
@@ -26,7 +26,7 @@ int imx233_adc_mapping[] =
26 [ADC_BATTERY] = IMX233_ADC_BATTERY, 26 [ADC_BATTERY] = IMX233_ADC_BATTERY,
27 [ADC_DIE_TEMP] = IMX233_ADC_DIE_TEMP, 27 [ADC_DIE_TEMP] = IMX233_ADC_DIE_TEMP,
28 [ADC_VDDIO] = IMX233_ADC_VDDIO, 28 [ADC_VDDIO] = IMX233_ADC_VDDIO,
29 [ADC_5V] = HW_LRADC_CHANNEL_5V, 29 [ADC_5V] = IMX233_ADC_5V,
30}; 30};
31 31
32const char *imx233_adc_channel_name[] = 32const char *imx233_adc_channel_name[] =
@@ -34,5 +34,5 @@ const char *imx233_adc_channel_name[] =
34 "Battery(mV)", 34 "Battery(mV)",
35 "Die temperature(°C)", 35 "Die temperature(°C)",
36 "VddIO", 36 "VddIO",
37 "5V", 37 "Vdd5V",
38}; 38};