Merge pull request #424 from cyberman54/development

TTGO T-Beam v1.0 added (includes AXP192 PMU support and i2c bus scan)
This commit is contained in:
Verkehrsrot 2019-09-02 19:48:54 +02:00 committed by GitHub
commit 27a531156e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 2301 additions and 3 deletions

View File

@ -392,7 +392,7 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
0 = BME data off
1 = BME data on, sends BME data on port 7 [default]
0x15 set battery data on/off
0x16 set battery data on/off
0 = battery data off [default]
1 = battery data on, sends voltage on port 8

12
include/i2cscan.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef _I2CSCAN_H
#define _I2CSCAN_H
#include <Arduino.h>
#ifdef HAS_PMU
#include "axp20x.h"
#endif
int i2c_scan(void);
void AXP192_init(void);
#endif

View File

@ -7,6 +7,7 @@
#include <esp_coexist.h> // needed for showing coex sw version
#include "globals.h"
#include "i2cscan.h"
#include "blescan.h"
#include "wifiscan.h"
#include "configmanager.h"

2
lib/AXP202X/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.vscode
.DS_Store

21
lib/AXP202X/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 lewis he
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

9
lib/AXP202X/README.md Normal file
View File

@ -0,0 +1,9 @@
AXP202X_Library
=====================================
- axp192 partial support, the function is not fully tested, please refer to the manual
- The `setPowerOutPut` function has forced DCDC3 to be turned on and cannot be controlled because T-Watch uses DCDC3 as the esp32 to power the main chip. If it is turned off, the hardware cannot be programmed.
TTGO invests time and resources to provide this open source code, please support TTGO and open source hardware by purchasing products from TTGO!
Written by Lewis He for TTGO. MIT license, all text above must be included in any redistribution

163
lib/AXP202X/keywords.txt Normal file
View File

@ -0,0 +1,163 @@
#######################################
# Syntax Coloring Map For X-Power AXP20X Library By lewis He
# github:https://github.com/lewisxhe
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
AXP20X_Class KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
begin KEYWORD2
isChargeing KEYWORD2
isLDO2Enable KEYWORD2
isLDO3Enable KEYWORD2
isLDO4Enable KEYWORD2
isDCDC3Enable KEYWORD2
isDCDC2Enable KEYWORD2
isChargeingEnable KEYWORD2
isAcinOverVoltageIRQ KEYWORD2
isAcinPlugInIRQ KEYWORD2
isAcinRemoveIRQ KEYWORD2
isVbusOverVoltageIRQ KEYWORD2
isVbusPlugInIRQ KEYWORD2
isVbusRemoveIRQ KEYWORD2
isVbusLowVHOLDIRQ KEYWORD2
isBattPlugInIRQ KEYWORD2
isBattRemoveIRQ KEYWORD2
isBattEnterActivateIRQ KEYWORD2
isBattExitActivateIRQ KEYWORD2
isChargingIRQ KEYWORD2
isChargingDoneIRQ KEYWORD2
isBattTempLowIRQ KEYWORD2
isBattTempHighIRQ KEYWORD2
isPEKShortPressIRQ KEYWORD2
isPEKLongtPressIRQ KEYWORD2
getAcinVoltage KEYWORD2
getAcinCurrent KEYWORD2
getVbusVoltage KEYWORD2
getVbusCurrent KEYWORD2
getTemp KEYWORD2
getTSTemp KEYWORD2
getGPIO0Voltage KEYWORD2
getGPIO1Voltage KEYWORD2
getBattInpower KEYWORD2
getBattVoltage KEYWORD2
getBattChargeCurrent KEYWORD2
getBattDischargeCurrent KEYWORD2
getSysIPSOUTVoltage KEYWORD2
getBattChargeCoulomb KEYWORD2
getBattDischargeCoulomb KEYWORD2
getSettingChargeCurrent KEYWORD2
setChargingTargetVoltage KEYWORD2
enableChargeing KEYWORD2
adc1Enable KEYWORD2
adc2Enable KEYWORD2
setStartupTime KEYWORD2
setlongPressTime KEYWORD2
setShutdownTime KEYWORD2
setTimeOutShutdown KEYWORD2
enableIRQ KEYWORD2
readIRQ KEYWORD2
clearIRQ KEYWORD2
setDCDC2Voltage KEYWORD2
setDCDC3Voltage KEYWORD2
setLDO2Voltage KEYWORD2
setLDO3Voltage KEYWORD2
setLDO4Voltage KEYWORD2
getBattPercentage KEYWORD2
#######################################
# Instances (KEYWORD2)
#######################################
#######################################
# Constants (LITERAL1)
#######################################
AXP202_LDO4_1250MV LITERAL1
AXP202_LDO4_1300MV LITERAL1
AXP202_LDO4_1400MV LITERAL1
AXP202_LDO4_1500MV LITERAL1
AXP202_LDO4_1600MV LITERAL1
AXP202_LDO4_1700MV LITERAL1
AXP202_LDO4_1800MV LITERAL1
AXP202_LDO4_1900MV LITERAL1
AXP202_LDO4_2000MV LITERAL1
AXP202_LDO4_2500MV LITERAL1
AXP202_LDO4_2700MV LITERAL1
AXP202_LDO4_2800MV LITERAL1
AXP202_LDO4_3000MV LITERAL1
AXP202_LDO4_3100MV LITERAL1
AXP202_LDO4_3200MV LITERAL1
AXP202_LDO4_3300MV LITERAL1
AXP202_VBUS_VHOLD_LOW_IRQ LITERAL1
AXP202_VBUS_REMOVED_IRQ LITERAL1
AXP202_VBUS_CONNECT_IRQ LITERAL1
AXP202_VBUS_OVER_VOL_IRQ LITERAL1
AXP202_ACIN_REMOVED_IRQ LITERAL1
AXP202_ACIN_CONNECT_IRQ LITERAL1
AXP202_ACIN_OVER_VOL_IRQ LITERAL1
AXP202_BATT_LOW_TEMP_IRQ LITERAL1
AXP202_BATT_OVER_TEMP_IRQ LITERAL1
AXP202_CHARGING_FINISHED_IRQ LITERAL1
AXP202_CHARGING_IRQ LITERAL1
AXP202_BATT_EXIT_ACTIVATE_IRQ LITERAL1
AXP202_BATT_ACTIVATE_IRQ LITERAL1
AXP202_BATT_REMOVED_IRQ LITERAL1
AXP202_BATT_CONNECT_IRQ LITERAL1
AXP202_PEK_LONGPRESS_IRQ LITERAL1
AXP202_PEL_SHORTPRESS_IRQ LITERAL1
AXP202_LDO3_LOW_VOL_IRQ LITERAL1
AXP202_DC3_LOW_VOL_IRQ LITERAL1
AXP202_DC2_LOW_VOL_IRQ LITERAL1
AXP202_CHARGE_LOW_CUR_IRQ LITERAL1
AXP202_CHIP_TEMP_HIGH_IRQ LITERAL1
AXP202_APS_LOW_VOL_LEVEL2_IRQ LITERAL1
APX202_APS_LOW_VOL_LEVEL1_IRQ LITERAL1
AXP202_VBUS_SESSION_END_IRQ LITERAL1
AXP202_VBUS_SESSION_AB_IRQ LITERAL1
AXP202_VBUS_INVALID_IRQ LITERAL1
AXP202_VBUS_VAILD_IRQ LITERAL1
AXP202_NOE_OFF_IRQ LITERAL1
AXP202_NOE_ON_IRQ LITERAL1
AXP202_TEMP_MONITORING_ADC2 LITERAL1
AXP202_GPIO1_FUNC_ADC2 LITERAL1
AXP202_GPIO0_FUNC_ADC2 LITERAL1
AXP202_BATT_VOL_ADC1 LITERAL1
AXP202_BATT_CUR_ADC1 LITERAL1
AXP202_ACIN_VOL_ADC1 LITERAL1
AXP202_ACIN_CUR_ADC1 LITERAL1
AXP202_VBUS_VOL_ADC1 LITERAL1
AXP202_VBUS_CUR_ADC1 LITERAL1
AXP202_APS_VOL_ADC1 LITERAL1
AXP202_TS_PIN_ADC1 LITERAL1
AXP202_TARGET_VOL_4_1V LITERAL1
AXP202_TARGET_VOL_4_15V LITERAL1
AXP202_TARGET_VOL_4_2V LITERAL1
AXP202_TARGET_VOL_4_36V LITERAL1
AXP202_STARTUP_TIME_128MS LITERAL1
AXP202_STARTUP_TIME_3S LITERAL1
AXP202_STARTUP_TIME_1S LITERAL1
AXP202_STARTUP_TIME_2S LITERAL1
AXP202_STARTUP_TIME LITERAL1
AXP202_LONGPRESS_TIME LITERAL1
AXP202_SHUTDOWN_EXCEEDS_TIME LITERAL1
AXP202_PWROK_SIGNAL_DELAY LITERAL1
AXP202_SHUTDOWN_TIME LITERAL1
AXP202_EXTEN LITERAL1
AXP202_DCDC3 LITERAL1
AXP202_LDO2 LITERAL1
AXP202_LDO4 LITERAL1
AXP202_DCDC2 LITERAL1
AXP202_LDO3 LITERAL1

View File

@ -0,0 +1,10 @@
name=AXP202X_Library
version=1.0.0
author=Lewis He
maintainer=Lewis He <lewishe@outlook.com>
sentence=Arduino library for X-Power AXP202 chip
paragraph=Arduino library for X-Power AXP202 chip. Tested with ESP32
category=Communication
url=https://github.com/lewisxhe/AXP202X_Library
architectures=*
architectures=esp32

1160
lib/AXP202X/src/axp20x.cpp Normal file

File diff suppressed because it is too large Load Diff

766
lib/AXP202X/src/axp20x.h Normal file
View File

@ -0,0 +1,766 @@
/////////////////////////////////////////////////////////////////
/*
MIT License
Copyright (c) 2019 lewis he
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
axp20x.h - Arduino library for X-Power AXP202 chip.
Created by Lewis he on April 1, 2019.
github:https://github.com/lewisxhe/AXP202X_Libraries
*/
/////////////////////////////////////////////////////////////////
#pragma once
#include <Arduino.h>
#include <Wire.h>
// #define AXP_DEBUG_PORT Serial
#ifdef AXP_DEBUG_PORT
#define AXP_DEBUG(fmt, ...) AXP_DEBUG_PORT.printf_P( (PGM_P)PSTR(fmt), ## __VA_ARGS__ )
#else
#define AXP_DEBUG(...)
#endif
#ifndef RISING
#define RISING 0x01
#endif
#ifndef FALLING
#define FALLING 0x02
#endif
//! Error Code
#define AXP_PASS 0
#define AXP_FAIL -1
#define AXP_INVALID -2
#define AXP_NOT_INIT -3
//! Chip Address
#define AXP202_SLAVE_ADDRESS (0x35)
#define AXP192_SLAVE_ADDRESS (0x34)
//! Chip ID
#define AXP202_CHIP_ID 0x41
#define AXP192_CHIP_ID 0x03
//! REG MAP
#define AXP202_STATUS (0x00)
#define AXP202_MODE_CHGSTATUS (0x01)
#define AXP202_OTG_STATUS (0x02)
#define AXP202_IC_TYPE (0x03)
#define AXP202_DATA_BUFFER1 (0x04)
#define AXP202_DATA_BUFFER2 (0x05)
#define AXP202_DATA_BUFFER3 (0x06)
#define AXP202_DATA_BUFFER4 (0x07)
#define AXP202_DATA_BUFFER5 (0x08)
#define AXP202_DATA_BUFFER6 (0x09)
#define AXP202_DATA_BUFFER7 (0x0A)
#define AXP202_DATA_BUFFER8 (0x0B)
#define AXP202_DATA_BUFFER9 (0x0C)
#define AXP202_DATA_BUFFERA (0x0D)
#define AXP202_DATA_BUFFERB (0x0E)
#define AXP202_DATA_BUFFERC (0x0F)
#define AXP202_LDO234_DC23_CTL (0x12)
#define AXP202_DC2OUT_VOL (0x23)
#define AXP202_LDO3_DC2_DVM (0x25)
#define AXP202_DC3OUT_VOL (0x27)
#define AXP202_LDO24OUT_VOL (0x28)
#define AXP202_LDO3OUT_VOL (0x29)
#define AXP202_IPS_SET (0x30)
#define AXP202_VOFF_SET (0x31)
#define AXP202_OFF_CTL (0x32)
#define AXP202_CHARGE1 (0x33)
#define AXP202_CHARGE2 (0x34)
#define AXP202_BACKUP_CHG (0x35)
#define AXP202_POK_SET (0x36)
#define AXP202_DCDC_FREQSET (0x37)
#define AXP202_VLTF_CHGSET (0x38)
#define AXP202_VHTF_CHGSET (0x39)
#define AXP202_APS_WARNING1 (0x3A)
#define AXP202_APS_WARNING2 (0x3B)
#define AXP202_TLTF_DISCHGSET (0x3C)
#define AXP202_THTF_DISCHGSET (0x3D)
#define AXP202_DCDC_MODESET (0x80)
#define AXP202_ADC_EN1 (0x82)
#define AXP202_ADC_EN2 (0x83)
#define AXP202_ADC_SPEED (0x84)
#define AXP202_ADC_INPUTRANGE (0x85)
#define AXP202_ADC_IRQ_RETFSET (0x86)
#define AXP202_ADC_IRQ_FETFSET (0x87)
#define AXP202_TIMER_CTL (0x8A)
#define AXP202_VBUS_DET_SRP (0x8B)
#define AXP202_HOTOVER_CTL (0x8F)
#define AXP202_GPIO0_CTL (0x90)
#define AXP202_GPIO0_VOL (0x91)
#define AXP202_GPIO1_CTL (0x92)
#define AXP202_GPIO2_CTL (0x93)
#define AXP202_GPIO012_SIGNAL (0x94)
#define AXP202_GPIO3_CTL (0x95)
#define AXP202_INTEN1 (0x40)
#define AXP202_INTEN2 (0x41)
#define AXP202_INTEN3 (0x42)
#define AXP202_INTEN4 (0x43)
#define AXP202_INTEN5 (0x44)
#define AXP202_INTSTS1 (0x48)
#define AXP202_INTSTS2 (0x49)
#define AXP202_INTSTS3 (0x4A)
#define AXP202_INTSTS4 (0x4B)
#define AXP202_INTSTS5 (0x4C)
//Irq control register
#define AXP192_INTEN1 (0x40)
#define AXP192_INTEN2 (0x41)
#define AXP192_INTEN3 (0x42)
#define AXP192_INTEN4 (0x43)
#define AXP192_INTEN5 (0x4A)
//Irq status register
#define AXP192_INTSTS1 (0x44)
#define AXP192_INTSTS2 (0x45)
#define AXP192_INTSTS3 (0x46)
#define AXP192_INTSTS4 (0x47)
#define AXP192_INTSTS5 (0x4D)
#define AXP192_DC1_VLOTAGE (0x26)
#define AXP192_LDO23OUT_VOL (0x28)
#define AXP192_GPIO0_CTL (0x90)
#define AXP192_GPIO0_VOL (0x91)
/* axp 20 adc data register */
#define AXP202_BAT_AVERVOL_H8 (0x78)
#define AXP202_BAT_AVERVOL_L4 (0x79)
#define AXP202_BAT_AVERCHGCUR_H8 (0x7A)
#define AXP202_BAT_AVERCHGCUR_L4 (0x7B)
#define AXP202_BAT_VOL_H8 (0x50)
#define AXP202_BAT_VOL_L4 (0x51)
#define AXP202_ACIN_VOL_H8 (0x56)
#define AXP202_ACIN_VOL_L4 (0x57)
#define AXP202_ACIN_CUR_H8 (0x58)
#define AXP202_ACIN_CUR_L4 (0x59)
#define AXP202_VBUS_VOL_H8 (0x5A)
#define AXP202_VBUS_VOL_L4 (0x5B)
#define AXP202_VBUS_CUR_H8 (0x5C)
#define AXP202_VBUS_CUR_L4 (0x5D)
#define AXP202_INTERNAL_TEMP_H8 (0x5E)
#define AXP202_INTERNAL_TEMP_L4 (0x5F)
#define AXP202_TS_IN_H8 (0x62)
#define AXP202_TS_IN_L4 (0x63)
#define AXP202_GPIO0_VOL_ADC_H8 (0x64)
#define AXP202_GPIO0_VOL_ADC_L4 (0x65)
#define AXP202_GPIO1_VOL_ADC_H8 (0x66)
#define AXP202_GPIO1_VOL_ADC_L4 (0x67)
#define AXP202_BAT_AVERDISCHGCUR_H8 (0x7C)
#define AXP202_BAT_AVERDISCHGCUR_L5 (0x7D)
#define AXP202_APS_AVERVOL_H8 (0x7E)
#define AXP202_APS_AVERVOL_L4 (0x7F)
#define AXP202_INT_BAT_CHGCUR_H8 (0xA0)
#define AXP202_INT_BAT_CHGCUR_L4 (0xA1)
#define AXP202_EXT_BAT_CHGCUR_H8 (0xA2)
#define AXP202_EXT_BAT_CHGCUR_L4 (0xA3)
#define AXP202_INT_BAT_DISCHGCUR_H8 (0xA4)
#define AXP202_INT_BAT_DISCHGCUR_L4 (0xA5)
#define AXP202_EXT_BAT_DISCHGCUR_H8 (0xA6)
#define AXP202_EXT_BAT_DISCHGCUR_L4 (0xA7)
#define AXP202_BAT_CHGCOULOMB3 (0xB0)
#define AXP202_BAT_CHGCOULOMB2 (0xB1)
#define AXP202_BAT_CHGCOULOMB1 (0xB2)
#define AXP202_BAT_CHGCOULOMB0 (0xB3)
#define AXP202_BAT_DISCHGCOULOMB3 (0xB4)
#define AXP202_BAT_DISCHGCOULOMB2 (0xB5)
#define AXP202_BAT_DISCHGCOULOMB1 (0xB6)
#define AXP202_BAT_DISCHGCOULOMB0 (0xB7)
#define AXP202_COULOMB_CTL (0xB8)
#define AXP202_BAT_POWERH8 (0x70)
#define AXP202_BAT_POWERM8 (0x71)
#define AXP202_BAT_POWERL8 (0x72)
#define AXP202_VREF_TEM_CTRL (0xF3)
#define AXP202_BATT_PERCENTAGE (0xB9)
/* bit definitions for AXP events ,irq event */
/* AXP202 */
#define AXP202_IRQ_USBLO (1)
#define AXP202_IRQ_USBRE (2)
#define AXP202_IRQ_USBIN (3)
#define AXP202_IRQ_USBOV (4)
#define AXP202_IRQ_ACRE (5)
#define AXP202_IRQ_ACIN (6)
#define AXP202_IRQ_ACOV (7)
#define AXP202_IRQ_TEMLO (8)
#define AXP202_IRQ_TEMOV (9)
#define AXP202_IRQ_CHAOV (10)
#define AXP202_IRQ_CHAST (11)
#define AXP202_IRQ_BATATOU (12)
#define AXP202_IRQ_BATATIN (13)
#define AXP202_IRQ_BATRE (14)
#define AXP202_IRQ_BATIN (15)
#define AXP202_IRQ_POKLO (16)
#define AXP202_IRQ_POKSH (17)
#define AXP202_IRQ_LDO3LO (18)
#define AXP202_IRQ_DCDC3LO (19)
#define AXP202_IRQ_DCDC2LO (20)
#define AXP202_IRQ_CHACURLO (22)
#define AXP202_IRQ_ICTEMOV (23)
#define AXP202_IRQ_EXTLOWARN2 (24)
#define AXP202_IRQ_EXTLOWARN1 (25)
#define AXP202_IRQ_SESSION_END (26)
#define AXP202_IRQ_SESS_AB_VALID (27)
#define AXP202_IRQ_VBUS_UN_VALID (28)
#define AXP202_IRQ_VBUS_VALID (29)
#define AXP202_IRQ_PDOWN_BY_NOE (30)
#define AXP202_IRQ_PUP_BY_NOE (31)
#define AXP202_IRQ_GPIO0TG (32)
#define AXP202_IRQ_GPIO1TG (33)
#define AXP202_IRQ_GPIO2TG (34)
#define AXP202_IRQ_GPIO3TG (35)
#define AXP202_IRQ_PEKFE (37)
#define AXP202_IRQ_PEKRE (38)
#define AXP202_IRQ_TIMER (39)
//Signal Capture
#define AXP202_BATT_VOLTAGE_STEP (1.1F)
#define AXP202_BATT_DISCHARGE_CUR_STEP (0.5F)
#define AXP202_BATT_CHARGE_CUR_STEP (0.5F)
#define AXP202_ACIN_VOLTAGE_STEP (1.7F)
#define AXP202_ACIN_CUR_STEP (0.625F)
#define AXP202_VBUS_VOLTAGE_STEP (1.7F)
#define AXP202_VBUS_CUR_STEP (0.375F)
#define AXP202_INTENAL_TEMP_STEP (0.1F)
#define AXP202_APS_VOLTAGE_STEP (1.4F)
#define AXP202_TS_PIN_OUT_STEP (0.8F)
#define AXP202_GPIO0_STEP (0.5F)
#define AXP202_GPIO1_STEP (0.5F)
#define FORCED_OPEN_DCDC3(x) (x |= AXP202_DCDC3)
#define BIT_MASK(x) (1 << x)
#define IS_OPEN(reg,channel) (bool)(reg & BIT_MASK(channel))
#define AXP202_ON 1
#define AXP202_OFF 0
enum {
AXP202_EXTEN = 0,
AXP202_DCDC3 = 1,
AXP202_LDO2 = 2,
AXP202_LDO4 = 3,
AXP202_DCDC2 = 4,
AXP202_LDO3 = 6,
AXP202_OUTPUT_MAX,
};
enum {
AXP192_DCDC1 = 0,
AXP192_DCDC3 = 1,
AXP192_LDO2 = 2,
AXP192_LDO3 = 3,
AXP192_DCDC2 = 4,
AXP192_EXTEN = 6,
AXP192_OUTPUT_MAX,
};
typedef enum {
AXP202_STARTUP_TIME_128MS,
AXP202_STARTUP_TIME_3S,
AXP202_STARTUP_TIME_1S,
AXP202_STARTUP_TIME_2S,
} axp202_startup_time_t;
typedef enum {
AXP192_STARTUP_TIME_128MS,
AXP192_STARTUP_TIME_512MS,
AXP192_STARTUP_TIME_1S,
AXP192_STARTUP_TIME_2S,
} axp192_startup_time_t;
typedef enum {
AXP_LONGPRESS_TIME_1S,
AXP_LONGPRESS_TIME_1S5,
AXP_LONGPRESS_TIME_2S,
AXP_LONGPRESS_TIME_2S5,
} axp_loonPress_time_t;
typedef enum {
AXP_POWER_OFF_TIME_4S,
AXP_POWER_OFF_TIME_65,
AXP_POWER_OFF_TIME_8S,
AXP_POWER_OFF_TIME_16S,
} axp_poweroff_time_t;
//REG 33H: Charging control 1 Charging target-voltage setting
typedef enum {
AXP202_TARGET_VOL_4_1V,
AXP202_TARGET_VOL_4_15V,
AXP202_TARGET_VOL_4_2V,
AXP202_TARGET_VOL_4_36V
} axp_chargeing_vol_t;
//REG 82H: ADC Enable 1 register Parameter
typedef enum {
AXP202_BATT_VOL_ADC1 = 1 << 7,
AXP202_BATT_CUR_ADC1 = 1 << 6,
AXP202_ACIN_VOL_ADC1 = 1 << 5,
AXP202_ACIN_CUR_ADC1 = 1 << 4,
AXP202_VBUS_VOL_ADC1 = 1 << 3,
AXP202_VBUS_CUR_ADC1 = 1 << 2,
AXP202_APS_VOL_ADC1 = 1 << 1,
AXP202_TS_PIN_ADC1 = 1 << 0
} axp_adc1_func_t;
// REG 83H: ADC Enable 2 register Parameter
typedef enum {
AXP202_TEMP_MONITORING_ADC2 = 1 << 7,
AXP202_GPIO1_FUNC_ADC2 = 1 << 3,
AXP202_GPIO0_FUNC_ADC2 = 1 << 2
} axp_adc2_func_t;
typedef enum {
AXP202_LDO3_MODE_LDO,
AXP202_LDO3_MODE_DCIN
} axp202_ldo3_mode_t;
typedef enum {
//IRQ1
AXP202_VBUS_VHOLD_LOW_IRQ = 1 << 1,
AXP202_VBUS_REMOVED_IRQ = 1 << 2,
AXP202_VBUS_CONNECT_IRQ = 1 << 3,
AXP202_VBUS_OVER_VOL_IRQ = 1 << 4,
AXP202_ACIN_REMOVED_IRQ = 1 << 5,
AXP202_ACIN_CONNECT_IRQ = 1 << 6,
AXP202_ACIN_OVER_VOL_IRQ = 1 << 7,
//IRQ2
AXP202_BATT_LOW_TEMP_IRQ = 1 << 8,
AXP202_BATT_OVER_TEMP_IRQ = 1 << 9,
AXP202_CHARGING_FINISHED_IRQ = 1 << 10,
AXP202_CHARGING_IRQ = 1 << 11,
AXP202_BATT_EXIT_ACTIVATE_IRQ = 1 << 12,
AXP202_BATT_ACTIVATE_IRQ = 1 << 13,
AXP202_BATT_REMOVED_IRQ = 1 << 14,
AXP202_BATT_CONNECT_IRQ = 1 << 15,
//IRQ3
AXP202_PEK_LONGPRESS_IRQ = 1 << 16,
AXP202_PEK_SHORTPRESS_IRQ = 1 << 17,
AXP202_LDO3_LOW_VOL_IRQ = 1 << 18,
AXP202_DC3_LOW_VOL_IRQ = 1 << 19,
AXP202_DC2_LOW_VOL_IRQ = 1 << 20,
AXP202_CHARGE_LOW_CUR_IRQ = 1 << 21,
AXP202_CHIP_TEMP_HIGH_IRQ = 1 << 22,
//IRQ4
AXP202_APS_LOW_VOL_LEVEL2_IRQ = 1 << 24,
APX202_APS_LOW_VOL_LEVEL1_IRQ = 1 << 25,
AXP202_VBUS_SESSION_END_IRQ = 1 << 26,
AXP202_VBUS_SESSION_AB_IRQ = 1 << 27,
AXP202_VBUS_INVALID_IRQ = 1 << 28,
AXP202_VBUS_VAILD_IRQ = 1 << 29,
AXP202_NOE_OFF_IRQ = 1 << 30,
AXP202_NOE_ON_IRQ = 1 << 31,
AXP202_ALL_IRQ = 0xFFFF
} axp_irq_t;
typedef enum {
AXP202_LDO4_1250MV,
AXP202_LDO4_1300MV,
AXP202_LDO4_1400MV,
AXP202_LDO4_1500MV,
AXP202_LDO4_1600MV,
AXP202_LDO4_1700MV,
AXP202_LDO4_1800MV,
AXP202_LDO4_1900MV,
AXP202_LDO4_2000MV,
AXP202_LDO4_2500MV,
AXP202_LDO4_2700MV,
AXP202_LDO4_2800MV,
AXP202_LDO4_3000MV,
AXP202_LDO4_3100MV,
AXP202_LDO4_3200MV,
AXP202_LDO4_3300MV,
AXP202_LDO4_MAX,
} axp_ldo4_table_t;
typedef enum {
AXP20X_LED_OFF,
AXP20X_LED_BLINK_1HZ,
AXP20X_LED_BLINK_4HZ,
AXP20X_LED_LOW_LEVEL,
} axp_chgled_mode_t;
typedef enum {
AXP202_GPIO_1V8,
AXP202_GPIO_2V5,
AXP202_GPIO_2V8,
AXP202_GPIO_3V0,
AXP202_GPIO_3V1,
AXP202_GPIO_3V3,
AXP202_GPIO_3V4,
AXP202_GPIO_3V5,
} axp202_gpio_voltage_t;
typedef enum {
AXP202_GPIO2_OUTPUT_LOW,
AXP202_GPIO2_FLOATING,
AXP202_GPIO3_INPUT,
} axp202_gpio2_mode_t;
typedef enum {
AXP202_GPIO3_DIGITAL_INPUT,
AXP202_GPIO3_OPEN_DRAIN_OUTPUT,
} axp202_gpio3_mode_t;
typedef enum {
AXP202_GPIO3_OUTPUT_LOW,
AXP202_GPIO3_FLOATING,
} axp202_gpio3_output_t;
typedef enum {
AXP202_GPIO0,
AXP202_GPIO1,
AXP202_GPIO2,
AXP202_GPIO3,
} axp202_gpio_t;
typedef enum {
AXP_ADC_SAMPLING_RATE_25HZ = 0,
AXP_ADC_SAMPLING_RATE_50HZ = 1,
AXP_ADC_SAMPLING_RATE_100HZ = 2,
AXP_ADC_SAMPLING_RATE_200HZ = 3,
} axp_adc_sampling_rate_t;
typedef enum {
AXP192_GPIO0_NMOD_OUTPUT = 0,
AXP192_GPIO0_INPUT = 1,
AXP192_GPIO0_LDO_OUTPUT = 2,
AXP192_GPIO0_ADC_INPUT = 4,
AXP192_GPIO0_OUTPUT_LOW = 5,
AXP192_GPIO0_FLOATING = 7
} axp192_gpio0_mode_t;
typedef enum {
AXP192_GPIO_1V8,
AXP192_GPIO_1V9,
AXP192_GPIO_2V0,
AXP192_GPIO_2V1,
AXP192_GPIO_2V2,
AXP192_GPIO_2V3,
AXP192_GPIO_2V4,
AXP192_GPIO_2V5,
AXP192_GPIO_2V6,
AXP192_GPIO_2V7,
AXP192_GPIO_2V8,
AXP192_GPIO_2V9,
AXP192_GPIO_3V0,
AXP192_GPIO_3V1,
AXP192_GPIO_3V2,
AXP192_GPIO_3V3,
} axp192_gpio_voltage_t;
class AXP20X_Class
{
public:
int begin(TwoWire &port = Wire, uint8_t addr = AXP202_SLAVE_ADDRESS);
// Power Output Control
int setPowerOutPut(uint8_t ch, bool en);
bool isBatteryConnect();
bool isChargeing();
bool isLDO2Enable();
bool isLDO3Enable();
bool isLDO4Enable();
bool isDCDC3Enable();
bool isDCDC2Enable();
bool isChargeingEnable();
bool isVBUSPlug();
//Only axp192 chip
bool isDCDC1Enable();
//Only axp192 chip
bool isExtenEnable();
//IRQ Status
bool isAcinOverVoltageIRQ();
bool isAcinPlugInIRQ();
bool isAcinRemoveIRQ();
bool isVbusOverVoltageIRQ();
bool isVbusPlugInIRQ();
bool isVbusRemoveIRQ();
bool isVbusLowVHOLDIRQ();
bool isBattPlugInIRQ();
bool isBattRemoveIRQ();
bool isBattEnterActivateIRQ();
bool isBattExitActivateIRQ();
bool isChargingIRQ();
bool isChargingDoneIRQ();
bool isBattTempLowIRQ();
bool isBattTempHighIRQ();
bool isPEKShortPressIRQ();
bool isPEKLongtPressIRQ();
//! Group4 ADC data
float getAcinVoltage();
float getAcinCurrent();
float getVbusVoltage();
float getVbusCurrent();
float getTemp();
float getTSTemp();
float getGPIO0Voltage();
float getGPIO1Voltage();
float getBattInpower();
float getBattVoltage();
float getBattChargeCurrent();
float getBattDischargeCurrent();
float getSysIPSOUTVoltage();
uint32_t getBattChargeCoulomb();
uint32_t getBattDischargeCoulomb();
float getSettingChargeCurrent();
int setChargingTargetVoltage(axp_chargeing_vol_t param);
int enableChargeing(bool en);
int adc1Enable(uint16_t params, bool en);
int adc2Enable(uint16_t params, bool en);
/**
* param: axp202_startup_time_t or axp192_startup_time_t
*/
int setStartupTime(uint8_t param);
/**
* param: axp_loonPress_time_t
*/
int setlongPressTime(uint8_t param);
/**
* @param param: axp_poweroff_time_t
*/
int setShutdownTime(uint8_t param);
int setTimeOutShutdown(bool en);
int shutdown();
/**
* params: axp_irq_t
*/
int enableIRQ(uint32_t params, bool en);
int readIRQ();
void clearIRQ();
int setDCDC1Voltage(uint16_t mv); //! Only AXP192 support
// return mv
uint16_t getDCDC1Voltage(); //! Only AXP192 support
// -----------------
int setDCDC2Voltage(uint16_t mv);
int setDCDC3Voltage(uint16_t mv);
int setLDO2Voltage(uint16_t mv);
int setLDO3Voltage(uint16_t mv);
int setLDO4Voltage(axp_ldo4_table_t param); //! Only axp202 support
// return mv
uint16_t getLDO2Voltage();
uint16_t getLDO3Voltage();
uint16_t getDCDC2Voltage();
uint16_t getDCDC3Voltage();
/**
* @param mode: axp_chgled_mode_t
*/
int setChgLEDMode(uint8_t mode);
/**
* @param mode: axp202_ldo3_mode_t
*/
int setLDO3Mode(uint8_t mode); //! Only AXP202 support
int getBattPercentage();
int debugCharging();
int debugStatus();
int limitingOff();
int setAdcSamplingRate(axp_adc_sampling_rate_t rate);
uint8_t getAdcSamplingRate();
float getCoulombData();
int gpio0Setting(axp192_gpio0_mode_t mode); //! Only axp192
int gpio0SetVoltage(axp192_gpio_voltage_t vol);
uint16_t gpio0GetVoltage();
//! The following features have not been tested
/**
* @brief setGPIO0Voltage
* @note
* @param mv: axp202_gpio_voltage_t enum
* @retval
*/
int setGPIO0Voltage(uint8_t mv);
/**
* @brief setGPIO0Level
* @note
* @param level: 0 or 1
* @retval
*/
int setGPIO0Level(uint8_t level);
/**
* @brief setGPIO1Level
* @note
* @param level: 0 or 1
* @retval
*/
int setGPIO1Level(uint8_t level);
/**
* @brief readGpioStatus
* @note
* @retval
*/
int readGpioStatus();
int readGpio0Level();
int readGpio1Level();
int readGpio2Level();
int setGpio2Mode(uint8_t mode);
/**
* @brief setGpio3Mode
* @note Set GPIO3 mode, can only be set to output low level, floating, can not output high level
* @param mode: axp202_gpio3_mode_t enum
* @retval
*/
int setGpio3Mode(uint8_t mode);
/**
* @brief setGpio3Level
* @note Can only be set when GPIO3 is configured as output mode
* @param level: axp202_gpio3_output_t enum
* @retval
*/
int setGpio3Level(uint8_t level);
/**
* @brief setGpioInterruptMode
* @note Interrupt can only be set when GPIO is configured as input mode
* @param gpio: axp202_gpio_t enum
* @param mode: RISING or FALLING
* @param en: true or false
* @retval
*/
int setGpioInterruptMode(uint8_t gpio, int mode, bool en);
private:
uint16_t _getRegistH8L5(uint8_t regh8, uint8_t regl4)
{
uint8_t hv, lv;
_readByte(regh8, 1, &hv);
_readByte(regl4, 1, &lv);
return (hv << 5) | (lv & 0x1F);
}
uint16_t _getRegistResult(uint8_t regh8, uint8_t regl4)
{
uint8_t hv, lv;
_readByte(regh8, 1, &hv);
_readByte(regl4, 1, &lv);
return (hv << 4) | (lv & 0xF);
}
int _readByte(uint8_t reg, uint8_t nbytes, uint8_t *data)
{
if (nbytes == 0 || !data) return -1;
_i2cPort->beginTransmission(_address);
_i2cPort->write(reg);
_i2cPort->endTransmission();
_i2cPort->requestFrom(_address, nbytes);
uint8_t index = 0;
while (_i2cPort->available())
data[index++] = _i2cPort->read();
return 0;
}
int _writeByte(uint8_t reg, uint8_t nbytes, uint8_t *data)
{
if (nbytes == 0 || !data) return -1;
_i2cPort->beginTransmission(_address);
_i2cPort->write(reg);
for (uint8_t i = 0; i < nbytes; i++) {
_i2cPort->write(data[i]);
}
_i2cPort->endTransmission();
return 0;
}
int _setGpioInterrupt(uint8_t *val, int mode, bool en);
static const uint8_t startupParams[];
static const uint8_t longPressParams[];
static const uint8_t shutdownParams[];
static const uint8_t targetVolParams[];
static uint8_t _outputReg;
uint8_t _address;
bool _init = false;
TwoWire *_i2cPort;
uint8_t _irq[5];
uint8_t _chip_id;
uint8_t _gpio[4];
};

View File

@ -19,6 +19,7 @@ halfile = generic.h
;halfile = ttgov21new.h
;halfile = ttgofox.h
;halfile = ttgobeam.h
;halfile = ttgobeam10.h
;halfile = fipy.h
;halfile = lopy.h
;halfile = lopy4.h
@ -42,7 +43,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I
[common]
; for release_version use max. 10 chars total, use any decimal format like "a.b.c"
release_version = 1.8.0
release_version = 1.8.01
; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running!
; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose
debug_level = 3

View File

@ -52,6 +52,10 @@ uint16_t read_voltage() {
digitalWrite(EXT_POWER_SW, EXT_POWER_OFF);
#endif
#ifdef HAS_PMU
voltage = axp.getBattVoltage();
#endif
return (uint16_t)voltage;
#else
return 0;

45
src/hal/ttgobeam10.h Normal file
View File

@ -0,0 +1,45 @@
// clang-format off
// upload_speed 921600
// board ttgo-t-beam
#ifndef _TTGOBEAM_H
#define _TTGOBEAM_H
#include <stdint.h>
// Hardware related definitions for TTGO T-Beam board
// (only) for newer T-Beam version T22_V10
// pinouts taken from https://github.com/lewisxhe/TTGO-T-Beam
#define HAS_LORA 1 // comment out if device shall not send data via LoRa
#define CFG_sx1276_radio 1 // HPD13A LoRa SoC
#define BOARD_HAS_PSRAM // use extra 4MB external RAM
#define HAS_BUTTON GPIO_NUM_36 // on board button (next to reset)
#define HAS_PMU 1 // AXP192 power management chip
#define PMU_INT GPIO_NUM_36 // AXP192 interrupt
#define HAS_LED NOT_A_PIN
// GPS settings
#define HAS_GPS 1 // use on board GPS
#define GPS_SERIAL 9600, SERIAL_8N1, GPIO_NUM_34, GPIO_NUM_12 // UBlox NEO 6M
// enable only if device has these sensors, otherwise comment these lines
// BME680 sensor on I2C bus
//#define HAS_BME 1 // Enable BME sensors in general
//#define HAS_BME680 SDA, SCL
//#define BME680_ADDR BME680_I2C_ADDR_PRIMARY // !! connect SDIO of BME680 to GND !!
// display (if connected)
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
#define MY_OLED_SDA SDA
#define MY_OLED_SCL SCL
#define MY_OLED_RST U8X8_PIN_NONE
//#define DISPLAY_FLIP 1 // use if display is rotated
// user defined sensors (if connected)
//#define HAS_SENSORS 1 // comment out if device has user defined sensors
//#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
#endif

102
src/i2cscan.cpp Normal file
View File

@ -0,0 +1,102 @@
// Basic config
#include "globals.h"
#include "i2cscan.h"
// Local logging tag
static const char TAG[] = __FILE__;
#define SSD1306_PRIMARY_ADDRESS (0x3D)
#define SSD1306_SECONDARY_ADDRESS (0x3C)
#define BME_PRIMARY_ADDRESS (0x77)
#define BME_SECONDARY_ADDRESS (0x76)
#define AXP192_PRIMARY_ADDRESS (0x34)
#define MCP_24AA02E64_PRIMARY_ADDRESS (0x50)
int i2c_scan(void) {
int i2c_ret, addr;
int devices = 0;
ESP_LOGI(TAG, "Starting I2C bus scan...");
for (addr = 8; addr <= 119; addr++) {
// scan i2c bus with no more to 100KHz
Wire.begin(SDA, SCL, 100000);
Wire.beginTransmission(addr);
Wire.write(addr);
i2c_ret = Wire.endTransmission();
if (i2c_ret == 0) {
devices++;
switch (addr) {
case SSD1306_PRIMARY_ADDRESS:
case SSD1306_SECONDARY_ADDRESS:
ESP_LOGI(TAG, "0x%X: SSD1306 Display controller", addr);
break;
case BME_PRIMARY_ADDRESS:
case BME_SECONDARY_ADDRESS:
ESP_LOGI(TAG, "0x%X: Bosch BME MEMS", addr);
break;
case AXP192_PRIMARY_ADDRESS:
ESP_LOGI(TAG, "0x%X: AXP192 power management", addr);
#ifdef HAS_PMU
AXP192_init();
#endif
break;
case MCP_24AA02E64_PRIMARY_ADDRESS:
ESP_LOGI(TAG, "0x%X: 24AA02E64 serial EEPROM", addr);
break;
default:
ESP_LOGI(TAG, "0x%X: Unknown device", addr);
break;
}
} // switch
} // for loop
ESP_LOGI(TAG, "I2C scan done, %u devices found.", devices);
return devices;
}
#ifdef HAS_PMU
void AXP192_init(void) {
AXP20X_Class axp;
if (axp.begin(Wire, AXP192_PRIMARY_ADDRESS))
ESP_LOGI(TAG, "AXP192 PMU initialization failed");
else {
axp.setPowerOutPut(AXP192_LDO2, AXP202_ON);
axp.setPowerOutPut(AXP192_LDO3, AXP202_ON);
axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON);
axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON);
axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
axp.setChgLEDMode(AXP20X_LED_OFF);
//axp.setChgLEDMode(LED_BLINK_4HZ);
/*
axp.setDCDC1Voltage(3300);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] { pmu_irq = true; }, FALLING);
axp.adc1Enable(AXP202_BATT_CUR_ADC1, 1);
axp.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ,
1);
axp.clearIRQ();
*/
ESP_LOGI(TAG, "AXP192 PMU initialized.");
}
#endif // HAS_PMU
}

View File

@ -151,7 +151,7 @@ void get_hard_deveui(uint8_t *pdeveui) {
uint8_t i2c_ret;
// Init this just in case, no more to 100KHz
Wire.begin(MY_OLED_SDA, MY_OLED_SCL, 100000);
Wire.begin(SDA, SCL, 100000);
Wire.beginTransmission(MCP_24AA02E64_I2C_ADDRESS);
Wire.write(MCP_24AA02E64_MAC_ADDRESS);
i2c_ret = Wire.endTransmission();

View File

@ -169,6 +169,8 @@ void setup() {
ESP_LOGI(TAG, "TinyGPS+ version %s", TinyGPSPlus::libraryVersion());
#endif
i2c_scan();
#endif // verbose
// read (and initialize on first run) runtime settings from NVRAM