summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/adc-pp5020.c (renamed from firmware/target/arm/iriver/h10/adc-h10.c)22
-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
5 files changed, 28 insertions, 161 deletions
diff --git a/firmware/target/arm/iriver/h10/adc-h10.c b/firmware/target/arm/adc-pp5020.c
index f63e8b8013..616ef04861 100644
--- a/firmware/target/arm/iriver/h10/adc-h10.c
+++ b/firmware/target/arm/adc-pp5020.c
@@ -71,10 +71,10 @@ static void adc_tick(void)
71 if(++adc_counter == HZ) 71 if(++adc_counter == HZ)
72 { 72 {
73 adc_counter = 0; 73 adc_counter = 0;
74 adc_scan(ADC_BATTERY); 74 adc_scan(0);
75 adc_scan(ADC_UNKNOWN_1); 75 adc_scan(1);
76 adc_scan(ADC_REMOTE); 76 adc_scan(2);
77 adc_scan(ADC_SCROLLPAD); 77 adc_scan(3);
78 } 78 }
79} 79}
80 80
@@ -114,28 +114,28 @@ void adc_init(void)
114 ADC_ADDR |= 0x1000000; 114 ADC_ADDR |= 0x1000000;
115 ADC_STATUS |= 0x20; 115 ADC_STATUS |= 0x20;
116 116
117 /* Enable channel 1 (unknown, temperature?) */ 117 /* Enable channel 1 (unknown) */
118 DEV_INIT1 &=~30; 118 DEV_INIT1 &=~30;
119 ADC_ADDR |= 0x2000000; 119 ADC_ADDR |= 0x2000000;
120 ADC_STATUS |= 0x2000; 120 ADC_STATUS |= 0x2000;
121 121
122 /* Enable channel 2 (remote) */ 122 /* Enable channel 2 (H10:remote) */
123 DEV_INIT1 &=~0x300; 123 DEV_INIT1 &=~0x300;
124 DEV_INIT1 |= 0x100; 124 DEV_INIT1 |= 0x100;
125 ADC_ADDR |= 0x4000000; 125 ADC_ADDR |= 0x4000000;
126 ADC_STATUS |= 0x200000; 126 ADC_STATUS |= 0x200000;
127 127
128 /* Enable channel 3 (scroll pad) */ 128 /* Enable channel 3 (H10:scroll pad) */
129 DEV_INIT1 &=~0x3000; 129 DEV_INIT1 &=~0x3000;
130 DEV_INIT1 |= 0x1000; 130 DEV_INIT1 |= 0x1000;
131 ADC_ADDR |= 0x8000000; 131 ADC_ADDR |= 0x8000000;
132 ADC_STATUS |= 0x20000000; 132 ADC_STATUS |= 0x20000000;
133 133
134 /* Force a scan of all channels to get initial values */ 134 /* Force a scan of all channels to get initial values */
135 adc_scan(ADC_BATTERY); 135 adc_scan(0);
136 adc_scan(ADC_UNKNOWN_1); 136 adc_scan(1);
137 adc_scan(ADC_REMOTE); 137 adc_scan(2);
138 adc_scan(ADC_SCROLLPAD); 138 adc_scan(3);
139 139
140 tick_add_task(adc_tick); 140 tick_add_task(adc_tick);
141} 141}
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 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2006 by Barry Wardell
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19#include "config.h"
20#include "cpu.h"
21#include "system.h"
22#include "kernel.h"
23#include "thread.h"
24#include "adc.h"
25
26static unsigned short adcdata[NUM_ADC_CHANNELS];
27
28/* Scan ADC so that adcdata[channel] gets updated. */
29unsigned short adc_scan(int channel)
30{
31 unsigned int adc_data_1;
32 unsigned int adc_data_2;
33
34 /* Start conversion */
35 ADC_ADDR |= 0x80000000;
36
37 /* Wait for conversion to complete */
38 while((ADC_STATUS & (0x40<<8*channel))==0);
39
40 /* Stop conversion */
41 ADC_ADDR &=~ 0x80000000;
42
43 /* ADC_DATA_1 and ADC_DATA_2 are both four bytes, one byte per channel.
44 For each channel, ADC_DATA_1 stores the 8-bit msb, ADC_DATA_2 stores the
45 2-bit lsb (in bits 0 and 1). Each channel is 10 bits total. */
46 adc_data_1 = ((ADC_DATA_1 >> (8*channel)) & 0xff);
47 adc_data_2 = ((ADC_DATA_2 >> (8*channel+6)) & 0x3);
48
49 adcdata[channel] = (adc_data_1<<2 | adc_data_2);
50
51 /* ADC values read low if PLL is enabled */
52 if(PLL_CONTROL & 0x80000000){
53 adcdata[channel] += 0x14;
54 if(adcdata[channel] > 0x400)
55 adcdata[channel] = 0x400;
56 }
57
58 return adcdata[channel];
59}
60
61/* Read 10-bit channel data */
62unsigned short adc_read(int channel)
63{
64 return adcdata[channel];
65}
66
67static int adc_counter;
68
69static void adc_tick(void)
70{
71 if(++adc_counter == HZ)
72 {
73 adc_counter = 0;
74 adc_scan(ADC_BATTERY);
75 adc_scan(ADC_UNKNOWN_1);
76 adc_scan(ADC_REMOTE);
77 adc_scan(ADC_SCROLLPAD);
78 }
79}
80
81/* Figured out from how the OF does things */
82void adc_init(void)
83{
84 ADC_INIT |= 1;
85 ADC_INIT |= 0x40000000;
86 udelay(100);
87
88 /* Reset ADC */
89 DEV_RS2 |= 0x20;
90 udelay(100);
91
92 DEV_RS2 &=~ 0x20;
93 udelay(100);
94
95 /* Enable ADC */
96 DEV_EN2 |= 0x20;
97 udelay(100);
98
99 ADC_CLOCK_SRC |= 0x3;
100 udelay(100);
101
102 ADC_ADDR |= 0x40;
103 ADC_ADDR |= 0x20000000;
104 udelay(100);
105
106 ADC_INIT;
107 ADC_INIT = 0;
108 udelay(100);
109
110 ADC_STATUS = 0;
111
112 /* Enable channel 0 (battery) */
113 DEV_INIT1 &=~0x3;
114 ADC_ADDR |= 0x1000000;
115 ADC_STATUS |= 0x20;
116
117 /* Enable channel 1 (unknown, temperature?) */
118 DEV_INIT1 &=~30;
119 ADC_ADDR |= 0x2000000;
120 ADC_STATUS |= 0x2000;
121
122 /* Enable channel 2 (remote) */
123 DEV_INIT1 &=~0x300;
124 DEV_INIT1 |= 0x100;
125 ADC_ADDR |= 0x4000000;
126 ADC_STATUS |= 0x200000;
127
128 /* Enable channel 3 (scroll pad) */
129 DEV_INIT1 &=~0x3000;
130 DEV_INIT1 |= 0x1000;
131 ADC_ADDR |= 0x8000000;
132 ADC_STATUS |= 0x20000000;
133
134 /* Force a scan of all channels to get initial values */
135 adc_scan(ADC_BATTERY);
136 adc_scan(ADC_UNKNOWN_1);
137 adc_scan(ADC_REMOTE);
138 adc_scan(ADC_SCROLLPAD);
139
140 tick_add_task(adc_tick);
141}
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 @@
29 29
30#define ADC_BATTERY 0 30#define ADC_BATTERY 0
31#define ADC_UNKNOWN_1 1 31#define ADC_UNKNOWN_1 1
32#define ADC_REMOTE 2 32#define ADC_UNKNOWN_2 2
33#define ADC_SCROLLPAD 3 33#define ADC_UNKNOWN_3 3
34#define ADC_UNREG_POWER ADC_BATTERY /* For compatibility */ 34#define ADC_UNREG_POWER ADC_BATTERY /* For compatibility */
35 35
36/* Force a scan now */ 36/* 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)
37 37
38bool charger_inserted(void) 38bool charger_inserted(void)
39{ 39{
40 return (GPIOB_INPUT_VAL & 0x02) ? false : true ; 40 return (GPIOL_INPUT_VAL & 0x24) ? true : false ;
41} 41}
42 42
43void ide_power_enable(bool on) 43void 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 @@
27 27
28const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = 28const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
29{ 29{
30 3760 30 3450
31}; 31};
32 32
33const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = 33const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
34{ 34{
35 3650 35 3400
36}; 36};
37 37
38/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ 38/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
39const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = 39const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
40{ 40{
41 { 3760, 3800, 3850, 3870, 3900, 3950, 4020, 4070, 4110, 4180, 4240 } 41 { 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990 },
42}; 42};
43 43
44#if CONFIG_CHARGING 44#if CONFIG_CHARGING
45/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ 45/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
46const unsigned short percent_to_volt_charge[11] = 46const unsigned short percent_to_volt_charge[11] =
47{ 47{
48 3990, 4030, 4060, 4080, 4100, 4120, 4150, 4180, 4220, 4260, 4310 48 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990
49}; 49};
50#endif /* CONFIG_CHARGING */ 50#endif /* CONFIG_CHARGING */
51 51
52#define BATTERY_SCALE_FACTOR 4650 52#define BATTERY_SCALE_FACTOR 6052
53/* full-scale ADC readout (2^10) in millivolt */ 53/* full-scale ADC readout (2^10) in millivolt */
54 54
55/* adc readout
56 * max with charger connected: 690
57 * max fully charged: 682
58 * min just before shutdown:
59 */
60
55/* Returns battery voltage from ADC [millivolts] */ 61/* Returns battery voltage from ADC [millivolts] */
56unsigned int battery_adc_voltage(void) 62unsigned int battery_adc_voltage(void)
57{ 63{
58 return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10; 64 /* work around the inital (false) high readout */
65 int readout=adc_read(ADC_UNREG_POWER);
66 return (readout>700) ? 3990 : (readout * BATTERY_SCALE_FACTOR) >> 10;
59} 67}