1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Heikki Hannikainen, Uwe Freese
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
26 #define POWER_HISTORY_LEN 2*60 /* 2 hours of samples, one per minute */
28 enum charge_state_type
30 /* sorted by increasing charging current (do not change!) */
31 #if CONFIG_CHARGING >= CHARGING_MONITOR
32 CHARGE_STATE_DISABLED
= -2, /* Disable charger use (safety measure) */
33 CHARGE_STATE_ERROR
= -1, /* Some error occurred that should not allow
34 turning on the charger again by software
35 without user intervention (ie. replug) */
38 #if CONFIG_CHARGING >= CHARGING_MONITOR
39 TRICKLE
, /* For NiCd, battery maintenence phase */
40 /* For LiIon, low-current precharge phase */
41 TOPOFF
, /* For NiCd, waiting for dead zone */
42 /* For LiIon, constant voltage phase */
43 CHARGING
, /* For NiCd, main charge phase */
44 /* For LiIon, constant current phase */
48 /* tells what the charger is doing */
49 extern enum charge_state_type charge_state
;
51 #ifdef CONFIG_CHARGING
53 * Flag that the charger has been plugged in/removed: this is set for exactly
54 * one time through the power loop when the charger has been plugged in.
56 enum charger_input_state_type
58 NO_CHARGER
= 0, /* No charger is present */
59 CHARGER_UNPLUGGED
, /* Transitional state during CHARGER=>NO_CHARGER */
60 CHARGER_PLUGGED
, /* Transitional state during NO_CHARGER=>CHARGER */
61 CHARGER
/* Charger is present */
64 /* tells the state of the charge input */
65 extern enum charger_input_state_type charger_input_state
;
67 /* Power input status saved on the power thread each loop */
68 extern unsigned int power_thread_inputs
;
70 #endif /* CONFIG_CHARGING */
72 #if CONFIG_CHARGING == CHARGING_TARGET
73 /* Include target-specific definitions */
74 #include "powermgmt-target.h"
79 /* Generic current values that are intentionally meaningless - config header
80 * should define proper numbers. Use insane values here to remind people
81 * to define the correct values in the proper header*/
83 #ifndef CURRENT_NORMAL
84 #define CURRENT_NORMAL 5 /* usual current in mA */
87 #ifndef CURRENT_BACKLIGHT
88 #define CURRENT_BACKLIGHT 5 /* additional current when backlight always on */
91 #if defined(HAVE_RECORDING) && !defined(CURRENT_RECORD)
92 #define CURRENT_RECORD 2 /* additional recording current */
93 #endif /* HAVE_RECORDING && !CURRENT_RECORD*/
96 #define CURRENT_USB 2 /* usual current in mA in USB mode */
99 #if defined(HAVE_REMOTE_LCD) && !defined(CURRENT_REMOTE)
100 #define CURRENT_REMOTE 2 /* additional current when remote connected */
101 #endif /* CURRENT_REMOTE && !HAVE_REMOTE_LCD */
104 #ifndef CURRENT_MAX_CHG
105 #define CURRENT_MAX_CHG 350 /* maximum charging current */
107 #endif /* CONFIG_CHARGING */
109 #ifdef CHARGING_DEBUG_FILE
110 #define POWERMGMT_DEBUG_STACK ((0x1000)/sizeof(long))
112 #define POWERMGMT_DEBUG_STACK 0
115 #ifndef BATT_AVE_SAMPLES
116 /* slw filter constant unless otherwise specified */
117 #define BATT_AVE_SAMPLES 128
120 #ifndef POWER_THREAD_STEP_TICKS
121 /* 2HZ sample rate unless otherwise specified */
122 #define POWER_THREAD_STEP_TICKS (HZ/2)
125 extern unsigned short power_history
[POWER_HISTORY_LEN
];
126 extern const unsigned short battery_level_dangerous
[BATTERY_TYPES_COUNT
];
127 extern const unsigned short battery_level_shutoff
[BATTERY_TYPES_COUNT
];
128 extern const unsigned short percent_to_volt_discharge
[BATTERY_TYPES_COUNT
][11];
130 extern const unsigned short percent_to_volt_charge
[11];
133 /* Start up power management thread */
134 void powermgmt_init(void);
136 #endif /* SIMULATOR */
138 /* Returns battery statust */
139 int battery_level(void); /* percent */
140 int battery_time(void); /* minutes */
141 unsigned int battery_adc_voltage(void); /* voltage from ADC in millivolts */
142 unsigned int battery_voltage(void); /* filtered batt. voltage in millivolts */
144 #ifdef HAVE_BATTERY_SWITCH
145 unsigned int input_millivolts(void); /* voltage that device is running from */
146 #endif /* HAVE_BATTERY_SWITCH */
148 #if defined(HAVE_BATTERY_SWITCH) || defined(HAVE_RESET_BATTERY_FILTER)
149 /* Set the filtered battery voltage (to adjust it before beginning a charge
150 * cycle for instance where old, loaded readings will likely be invalid).
151 * Also readjust when battery switch is opened or closed.
153 void reset_battery_filter(int millivolts
);
154 #endif /* HAVE_BATTERY_SWITCH || HAVE_RESET_BATTERY_FILTER */
157 /* read unfiltered battery info */
158 void battery_read_info(int *voltage
, int *level
);
160 /* Tells if the battery level is safe for disk writes */
161 bool battery_level_safe(void);
163 void set_poweroff_timeout(int timeout
);
164 void set_battery_capacity(int capacity
); /* set local battery capacity value */
165 int get_battery_capacity(void); /* get local battery capacity value */
166 void set_battery_type(int type
); /* set local battery type */
168 void set_sleep_timer(int seconds
);
169 int get_sleep_timer(void);
170 void set_car_adapter_mode(bool setting
);
171 void reset_poweroff_timer(void);
172 void cancel_shutdown(void);
173 void shutdown_hw(void);
174 void sys_poweroff(void);
175 /* Returns true if the system should force shutdown for some reason -
177 bool query_force_shutdown(void);
178 #ifdef HAVE_ACCESSORY_SUPPLY
179 void accessory_supply_set(bool);
182 #endif /* _POWERMGMT_H_ */