1
0
Fork 0
forked from len0rd/rockbox
foxbox/firmware/export/axp-2101.h
Dana Conrad 253eb79db3 erosqnative: hw4 support
Support hw4 units with AXP2101 PMU

Bootloader successfully compiles and loads onto device.
The LCD appears to be identical to hw3 units.
Scroll wheel and buttons work
Audio output works, including volume.
HP/LO detect works
Rockbox build is generic
GPIO gating logic seems to be working as intended now.

 - Added new GPIO definitions - some significant overlaps with pins
    from previous hardware revisions...
 - Added some GPIO definitions for older players we didn't know about
 - Add register definitions for AXP2101 from datasheet
    (these are very different from AXP192!)
 - Add AXP2101 regulator definitions, need to support multiple step
    sizes per regulator.
 - Verify AXP2101 voltage set multi-range logic
 - Verify AXP2101 voltage get multi-range logic
 - Make AXP2101 its own driver
 - AXP2101 driver should be "minimally viable", though I think
    there is some extra functionality that could be implemented.
 - Disabling the coulomb counter stuff - we could maybe make
   the E-Gauge work for the same purpose, but it only appears to
   be used on the debug screen at the moment so it doesn't seem
   like it's worth the effort.
 - Found new button GPIOs
 - Found error in my GPIO setting logic, blue light works now!
 - Set LDO/DCDC output voltages to OF's settings, as far as
   I can tell.
 - Determined we probably want TCS1421_CFG1:0 to be 0x00,
   for UFP behavior
 - Tested this rb build with both old and new bootloaders on hw1.5,
   hw2, hw4 in as many configurations as I can think of, works across
   the board.
 - Bootloader can install itself on hw4, so nand chip isn't novel
 - Uninstallation file can be made by patcher script, works on hw4
 - Installation file can be made by patcher script, works on hw4
 - Added HW4 to rbutil, manual

Change-Id: I5b75782273e81c2c6f2b9c79501c8b7cbf88391f
2024-11-22 17:01:39 -05:00

211 lines
7.8 KiB
C

/***************************************************************************
* __________ __ ___.
* 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__ */