summaryrefslogtreecommitdiffstats
path: root/firmware/export/axp-2101.h
blob: 228e0ae2a434945313d13c9a0d0bda44c8327a13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2021 Aidan MacDonald
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/

#ifndef __AXP_2101_H__
#define __AXP_2101_H__

#include "config.h"
#include <stdbool.h>
#include <stdint.h>

/* ADC channels */
#define AXP2101_ADC_VBAT_VOLTAGE    0
#define AXP2101_ADC_VBUS_VOLTAGE    1
#define AXP2101_ADC_VSYS_VOLTAGE    2
#define AXP2101_ADC_TS_VOLTAGE      3
#define AXP2101_ADC_DIE_TEMPERATURE 4
#define AXP2101_NUM_ADC_CHANNELS    5

/* ADC sampling rates */
#define AXP2101_ADC_RATE_25HZ   0
#define AXP2101_ADC_RATE_50HZ   1
#define AXP2101_ADC_RATE_100HZ  2
#define AXP2101_ADC_RATE_200HZ  3

/* Return values of axp_battery_status() */
#define AXP2101_BATT_DISCHARGING    0
#define AXP2101_BATT_CHARGING       1
#define AXP2101_BATT_FULL           2

/* Bits returned by axp_input_status() */
#define AXP2101_INPUT_AC        (1 << 0)
#define AXP2101_INPUT_USB       (1 << 1)
#define AXP2101_INPUT_BATTERY   (1 << 2)
#define AXP2101_INPUT_EXTERNAL  (AXP_INPUT_AC|AXP_INPUT_USB)

#define AXP2101_SUPPLY_DCDC1    0
#define AXP2101_SUPPLY_DCDC2    1
#define AXP2101_SUPPLY_DCDC3    2
#define AXP2101_SUPPLY_DCDC4    3
#define AXP2101_SUPPLY_DCDC5    4
#define AXP2101_SUPPLY_ALDO1    5
#define AXP2101_SUPPLY_ALDO2    6
#define AXP2101_SUPPLY_ALDO3    7
#define AXP2101_SUPPLY_ALDO4    8
#define AXP2101_SUPPLY_BLDO1    9
#define AXP2101_SUPPLY_BLDO2    10
#define AXP2101_SUPPLY_DLDO1    11
#define AXP2101_SUPPLY_DLDO2    12
#define AXP2101_SUPPLY_VCPUS    13
#define AXP2101_SUPPLY_RTCLDO1  14
#define AXP2101_SUPPLY_RTCLDO2  15
#define AXP2101_NUM_SUPPLIES    16

/* Special values returned by axp_supply_get_voltage */
#define AXP2101_SUPPLY_NOT_PRESENT INT_MIN
#define AXP2101_SUPPLY_DISABLED    (-1)

/* AXP2101 registers */
#define AXP2101_REG_PMU_STATUS1     0x00
#define AXP2101_REG_PMU_STATUS2     0x01
#define AXP2101_REG_DATA_BUFFER0    0x04
#define AXP2101_REG_DATA_BUFFER1    0x05
#define AXP2101_REG_DATA_BUFFER2    0x06
#define AXP2101_REG_DATA_BUFFER3    0x07
#define AXP2101_REG_PMUCOMMCONFIG   0x10
#define AXP2101_REG_BATFET_CTRL     0x12
#define AXP2101_REG_DIETEMPCTRL     0x13
#define AXP2101_REG_MINSYSVOLTCTRL  0x14
#define AXP2101_REG_INVOLTLIMITCTRL 0x15
#define AXP2101_REG_INCURRLIMITCTRL 0x16
#define AXP2101_REG_FUELGAUGERESET  0x17
#define AXP2101_REG_PERIPHERALCTRL  0x18
#define AXP2101_REG_WATCHDOGCTRL    0x19
#define AXP2101_REG_LOWBATTWARN     0x1a
#define AXP2101_REG_PWRONSTATUS     0x20
#define AXP2101_REG_PWROFFSTATUS    0x21
#define AXP2101_REG_PWROFFENABLE    0x22
#define AXP2101_REG_PWROFF_DCDC_OVP_UVP 0x23
#define AXP2101_REG_VSYSPWROFFTHRESH 0x24
#define AXP2101_REG_PWROK_SETTING   0x25
#define AXP2101_REG_SLEEPWAKE       0x26
#define AXP2101_REG_LOGICTHRESH     0x27
#define AXP2101_REG_FASTPWRON0      0x28
#define AXP2101_REG_FASTPWRON1      0x29
#define AXP2101_REG_FASTPWRON2      0x2a
#define AXP2101_REG_FASTPWRON_CTRL  0x2b
#define AXP2101_REG_ADCCHNENABLE    0x30
#define AXP2101_REG_ADC_VBAT_H      0x34
#define AXP2101_REG_ADC_VBAT_L      0x35
#define AXP2101_REG_ADC_TS_H        0x36
#define AXP2101_REG_ADC_TS_L        0x37
#define AXP2101_REG_ADC_VBUS_H      0x38
#define AXP2101_REG_ADC_VBUS_L      0x39
#define AXP2101_REG_ADC_VSYS_H      0x3a
#define AXP2101_REG_ADC_VSYS_L      0x3b
#define AXP2101_REG_ADC_TDIE_H      0x3c
#define AXP2101_REG_ADC_TDIE_L      0x3d
#define AXP2101_REG_IRQEN0          0x40
#define AXP2101_REG_IRQEN1          0x41
#define AXP2101_REG_IRQEN2          0x42
#define AXP2101_REG_IRQSTATUS0      0x48
#define AXP2101_REG_IRQSTATUS1      0x49
#define AXP2101_REG_IRQSTATUS2      0x4a
#define AXP2101_REG_TSPINCTRL       0x50
#define AXP2101_REG_TS_HYSL2H       0x52
#define AXP2101_REG_TS_HYSH2L       0x53
#define AXP2101_REG_VLTF_CHG        0x54
#define AXP2101_REG_VHTF_CHG        0x55
#define AXP2101_REG_VLTF_WORK       0x56
#define AXP2101_REG_VHTF_WORK       0x57
#define AXP2101_REG_JIETA_ENABLE    0x58
#define AXP2101_REG_JIETA_SETTING0  0x59
#define AXP2101_REG_JIETA_SETTING1  0x5a
#define AXP2101_REG_JIETA_SETTING2  0x5b
#define AXP2101_REG_IPRECHG_SETTING 0x61
#define AXP2101_REG_ICC_SETTING     0x62
#define AXP2101_REG_ITERM_SETTING   0x63
#define AXP2101_REG_CV_SETTING      0x64
#define AXP2101_REG_THERMREGTHRESH  0x65
#define AXP2101_REG_CHARGETIMEOUT   0x67
#define AXP2101_REG_BATTDETECTCTRL  0x68
#define AXP2101_REG_CHGLED          0x69
#define AXP2101_REG_BUTTONBAT       0x6a
#define AXP2101_REG_DCDC_ONOFF     0x80
#define AXP2101_REG_DCDC_FORCEPWM  0x81
#define AXP2101_REG_DCDC0_VOLTAGE   0x82
#define AXP2101_REG_DCDC1_VOLTAGE   0x83
#define AXP2101_REG_DCDC2_VOLTAGE   0x84
#define AXP2101_REG_DCDC3_VOLTAGE   0x85
#define AXP2101_REG_DCDC4_VOLTAGE   0x86
#define AXP2101_REG_LDO_ONOFF0      0x90
#define AXP2101_REG_LDO_ONOFF1      0x91
#define AXP2101_REG_LDO0_VOLTAGE    0x92
#define AXP2101_REG_LDO1_VOLTAGE    0x93
#define AXP2101_REG_LDO2_VOLTAGE    0x94
#define AXP2101_REG_LDO3_VOLTAGE    0x94
#define AXP2101_REG_LDO4_VOLTAGE    0x95
#define AXP2101_REG_LDO5_VOLTAGE    0x96
#define AXP2101_REG_LDO6_VOLTAGE    0x97
#define AXP2101_REG_LDO7_VOLTAGE    0x98
#define AXP2101_REG_LDO8_VOLTAGE    0x99
#define AXP2101_REG_LDO9_VOLTAGE    0x9a
#define AXP2101_REG_BATT_PARAMETER  0xa1
#define AXP2101_REG_FUEL_GAUGE_CTRL 0xa2
#define AXP2101_REG_BATT_PERCENTAGE 0xa4

/* Must be called from power_init() to initialize the driver state */
extern void axp2101_init(void);

/* - axp_supply_set_voltage(): set a supply voltage to the given value
 *   in millivolts. Pass a voltage of AXP_SUPPLY_DISABLED to shut off
 *   the supply. Any invalid supply or voltage will make the call a no-op.
 *
 * - axp_supply_get_voltage() returns a supply voltage in millivolts.
 *   If the supply is powered off, returns AXP_SUPPLY_DISABLED.
 *   If the chip does not have the supply, returns AXP_SUPPLY_NOT_PRESENT.
 */
extern void axp2101_supply_set_voltage(int supply, int voltage);
extern int axp2101_supply_get_voltage(int supply);

/* Basic battery and power supply status */
extern int axp2101_battery_status(void);
extern int axp2101_input_status(void);

/* ADC access -- ADCs which are not enabled will return INT_MIN if read.
 * The output of axp_adc_read() is normalized to appropriate units:
 *
 * - for voltages, the scale is millivolts
 * - for currents, the scale is milliamps
 * - for temperatures, the scale is tenths of a degree Celsius
 * - for power, the scale is microwatts
 *
 * See the comment in axp_adc_conv_raw() for raw value precision/scale.
 */
extern int axp2101_adc_read(int adc);
extern int axp2101_adc_read_raw(int adc);
extern int axp2101_adc_conv_raw(int adc, int value);
extern void axp2101_adc_set_enabled(int adc_bits);
extern int axp2101_adc_get_rate(void);

/* Set/get maximum charging current in milliamps */
extern void axp2101_set_charge_current(int current_mA);
extern int axp2101_get_charge_current(void);

/* Set the shutdown bit */
extern void axp2101_power_off(void);

/* Debug menu */
extern bool axp2101_debug_menu(void);

extern unsigned int axp2101_power_input_status(void);

#endif /* __AXP_2101_H__ */