summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/olympus/mrobe-100
diff options
context:
space:
mode:
authorRobert Kukla <roolku@rockbox.org>2008-01-12 20:36:45 +0000
committerRobert Kukla <roolku@rockbox.org>2008-01-12 20:36:45 +0000
commita615aabc335ecc16c3abc65e5d0b0d626617c1b9 (patch)
tree94e3b2a8a7fba842decc76740097f1d4b53b16e4 /firmware/target/arm/olympus/mrobe-100
parent36ffa798759a89f63f43253aab5144b9e6f20bca (diff)
downloadrockbox-a615aabc335ecc16c3abc65e5d0b0d626617c1b9.tar.gz
rockbox-a615aabc335ecc16c3abc65e5d0b0d626617c1b9.tar.bz2
rockbox-a615aabc335ecc16c3abc65e5d0b0d626617c1b9.zip
- share adc reading code between h10 and mrobe100
- battery voltage calibrated and used for mrobe100 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16064 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/olympus/mrobe-100')
-rw-r--r--firmware/target/arm/olympus/mrobe-100/adc-mr100.c141
-rw-r--r--firmware/target/arm/olympus/mrobe-100/adc-target.h4
-rw-r--r--firmware/target/arm/olympus/mrobe-100/power-mr100.c2
-rw-r--r--firmware/target/arm/olympus/mrobe-100/powermgmt-mr100.c20
4 files changed, 17 insertions, 150 deletions
diff --git a/firmware/target/arm/olympus/mrobe-100/adc-mr100.c b/firmware/target/arm/olympus/mrobe-100/adc-mr100.c
deleted file mode 100644
index f63e8b8013..0000000000
--- a/firmware/target/arm/olympus/mrobe-100/adc-mr100.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2006 by Barry Wardell
- *
- * All files in this archive are subject to the GNU General Public License.
- * See the file COPYING in the source tree root for full license agreement.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-#include "config.h"
-#include "cpu.h"
-#include "system.h"
-#include "kernel.h"
-#include "thread.h"
-#include "adc.h"
-
-static unsigned short adcdata[NUM_ADC_CHANNELS];
-
-/* Scan ADC so that adcdata[channel] gets updated. */
-unsigned short adc_scan(int channel)
-{
- unsigned int adc_data_1;
- unsigned int adc_data_2;
-
- /* Start conversion */
- ADC_ADDR |= 0x80000000;
-
- /* Wait for conversion to complete */
- while((ADC_STATUS & (0x40<<8*channel))==0);
-
- /* Stop conversion */
- ADC_ADDR &=~ 0x80000000;
-
- /* ADC_DATA_1 and ADC_DATA_2 are both four bytes, one byte per channel.
- For each channel, ADC_DATA_1 stores the 8-bit msb, ADC_DATA_2 stores the
- 2-bit lsb (in bits 0 and 1). Each channel is 10 bits total. */
- adc_data_1 = ((ADC_DATA_1 >> (8*channel)) & 0xff);
- adc_data_2 = ((ADC_DATA_2 >> (8*channel+6)) & 0x3);
-
- adcdata[channel] = (adc_data_1<<2 | adc_data_2);
-
- /* ADC values read low if PLL is enabled */
- if(PLL_CONTROL & 0x80000000){
- adcdata[channel] += 0x14;
- if(adcdata[channel] > 0x400)
- adcdata[channel] = 0x400;
- }
-
- return adcdata[channel];
-}
-
-/* Read 10-bit channel data */
-unsigned short adc_read(int channel)
-{
- return adcdata[channel];
-}
-
-static int adc_counter;
-
-static void adc_tick(void)
-{
- if(++adc_counter == HZ)
- {
- adc_counter = 0;
- adc_scan(ADC_BATTERY);
- adc_scan(ADC_UNKNOWN_1);
- adc_scan(ADC_REMOTE);
- adc_scan(ADC_SCROLLPAD);
- }
-}
-
-/* Figured out from how the OF does things */
-void adc_init(void)
-{
- ADC_INIT |= 1;
- ADC_INIT |= 0x40000000;
- udelay(100);
-
- /* Reset ADC */
- DEV_RS2 |= 0x20;
- udelay(100);
-
- DEV_RS2 &=~ 0x20;
- udelay(100);
-
- /* Enable ADC */
- DEV_EN2 |= 0x20;
- udelay(100);
-
- ADC_CLOCK_SRC |= 0x3;
- udelay(100);
-
- ADC_ADDR |= 0x40;
- ADC_ADDR |= 0x20000000;
- udelay(100);
-
- ADC_INIT;
- ADC_INIT = 0;
- udelay(100);
-
- ADC_STATUS = 0;
-
- /* Enable channel 0 (battery) */
- DEV_INIT1 &=~0x3;
- ADC_ADDR |= 0x1000000;
- ADC_STATUS |= 0x20;
-
- /* Enable channel 1 (unknown, temperature?) */
- DEV_INIT1 &=~30;
- ADC_ADDR |= 0x2000000;
- ADC_STATUS |= 0x2000;
-
- /* Enable channel 2 (remote) */
- DEV_INIT1 &=~0x300;
- DEV_INIT1 |= 0x100;
- ADC_ADDR |= 0x4000000;
- ADC_STATUS |= 0x200000;
-
- /* Enable channel 3 (scroll pad) */
- DEV_INIT1 &=~0x3000;
- DEV_INIT1 |= 0x1000;
- ADC_ADDR |= 0x8000000;
- ADC_STATUS |= 0x20000000;
-
- /* Force a scan of all channels to get initial values */
- adc_scan(ADC_BATTERY);
- adc_scan(ADC_UNKNOWN_1);
- adc_scan(ADC_REMOTE);
- adc_scan(ADC_SCROLLPAD);
-
- tick_add_task(adc_tick);
-}
diff --git a/firmware/target/arm/olympus/mrobe-100/adc-target.h b/firmware/target/arm/olympus/mrobe-100/adc-target.h
index f761e761ef..95b911783b 100644
--- a/firmware/target/arm/olympus/mrobe-100/adc-target.h
+++ b/firmware/target/arm/olympus/mrobe-100/adc-target.h
@@ -29,8 +29,8 @@
#define ADC_BATTERY 0
#define ADC_UNKNOWN_1 1
-#define ADC_REMOTE 2
-#define ADC_SCROLLPAD 3
+#define ADC_UNKNOWN_2 2
+#define ADC_UNKNOWN_3 3
#define ADC_UNREG_POWER ADC_BATTERY /* For compatibility */
/* Force a scan now */
diff --git a/firmware/target/arm/olympus/mrobe-100/power-mr100.c b/firmware/target/arm/olympus/mrobe-100/power-mr100.c
index 54b7030646..985b52ce0b 100644
--- a/firmware/target/arm/olympus/mrobe-100/power-mr100.c
+++ b/firmware/target/arm/olympus/mrobe-100/power-mr100.c
@@ -37,7 +37,7 @@ void power_init(void)
bool charger_inserted(void)
{
- return (GPIOB_INPUT_VAL & 0x02) ? false : true ;
+ return (GPIOL_INPUT_VAL & 0x24) ? true : false ;
}
void ide_power_enable(bool on)
diff --git a/firmware/target/arm/olympus/mrobe-100/powermgmt-mr100.c b/firmware/target/arm/olympus/mrobe-100/powermgmt-mr100.c
index 1b6a52f517..6101b3eb01 100644
--- a/firmware/target/arm/olympus/mrobe-100/powermgmt-mr100.c
+++ b/firmware/target/arm/olympus/mrobe-100/powermgmt-mr100.c
@@ -27,33 +27,41 @@
const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
{
- 3760
+ 3450
};
const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
{
- 3650
+ 3400
};
/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
{
- { 3760, 3800, 3850, 3870, 3900, 3950, 4020, 4070, 4110, 4180, 4240 }
+ { 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990 },
};
#if CONFIG_CHARGING
/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
const unsigned short percent_to_volt_charge[11] =
{
- 3990, 4030, 4060, 4080, 4100, 4120, 4150, 4180, 4220, 4260, 4310
+ 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990
};
#endif /* CONFIG_CHARGING */
-#define BATTERY_SCALE_FACTOR 4650
+#define BATTERY_SCALE_FACTOR 6052
/* full-scale ADC readout (2^10) in millivolt */
+/* adc readout
+ * max with charger connected: 690
+ * max fully charged: 682
+ * min just before shutdown:
+ */
+
/* Returns battery voltage from ADC [millivolts] */
unsigned int battery_adc_voltage(void)
{
- return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10;
+ /* work around the inital (false) high readout */
+ int readout=adc_read(ADC_UNREG_POWER);
+ return (readout>700) ? 3990 : (readout * BATTERY_SCALE_FACTOR) >> 10;
}