diff --git a/libdeps/XPowersLib/.gitignore b/libdeps/XPowersLib/.gitignore deleted file mode 100644 index af9cf62..0000000 --- a/libdeps/XPowersLib/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.pio -.vscode -test -.travis.yml -test -assets -build -sdkconfig -sdkconfig.old diff --git a/libdeps/XPowersLib/.piopm b/libdeps/XPowersLib/.piopm new file mode 100644 index 0000000..8924541 --- /dev/null +++ b/libdeps/XPowersLib/.piopm @@ -0,0 +1 @@ +{"type": "library", "name": "XPowersLib", "version": "0.2.7", "spec": {"owner": "lewisxhe", "id": 14299, "name": "XPowersLib", "requirements": null, "uri": null}} \ No newline at end of file diff --git a/libdeps/XPowersLib/CMakeLists.txt b/libdeps/XPowersLib/CMakeLists.txt deleted file mode 100644 index c664052..0000000 --- a/libdeps/XPowersLib/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(src_dirs ./src) -set(include_dirs ./src - ./src/REG) -idf_component_register(SRC_DIRS ${src_dirs} INCLUDE_DIRS ${include_dirs}) - diff --git a/libdeps/XPowersLib/Kconfig b/libdeps/XPowersLib/Kconfig deleted file mode 100644 index 93b1f34..0000000 --- a/libdeps/XPowersLib/Kconfig +++ /dev/null @@ -1,59 +0,0 @@ -menu "XPowersLib Configuration" - - choice PMU_Type - prompt "XPowers chip type" - default XPOWERS_CHIP_AXP2101 if IDF_TARGET_ESP32 - default XPOWERS_CHIP_AXP192 - help - Defines the default peripheral for xpowers example - - config XPOWERS_CHIP_AXP2101 - bool "Xpowers AXP2101" - config XPOWERS_CHIP_AXP192 - bool "Xpowers AXP192" - endchoice - - choice XPowersLib_ESP_IDF_API - prompt "XPowers library esp-idf api version" - default XPOWERS_ESP_IDF_NEW_API - help - Define API version - - config XPOWERS_ESP_IDF_NEW_API - bool "Use esp-idf higher version (>= 5.0) API" - config XPOWERS_ESP_IDF_OLD_API - bool "Use esp-idf lower version ( < 5.0) API , Compatible with lower versions of esp-idf" - endchoice - - config I2C_MASTER_PORT_NUM - int "PMU I2C Port Number" - default 1 - help - Port number for I2C Master device. - - config I2C_MASTER_FREQUENCY - int "Master Frequency" - default 100000 - help - I2C Speed of Master device. - - config PMU_I2C_SCL - int "PMU SCL GPIO Num" - default 22 - help - GPIO number for I2C PMU clock line. - - config PMU_I2C_SDA - int "PMU SDA GPIO Num" - default 21 - help - GPIO number for I2C PMU data line. - - config PMU_INTERRUPT_PIN - int "PMU Interrupt Pin" - default 35 - help - PMU interrupt pin. - - -endmenu diff --git a/libdeps/XPowersLib/Micropython/examples/AXP192_AllFunction.py b/libdeps/XPowersLib/Micropython/examples/AXP192_AllFunction.py deleted file mode 100644 index 8b88536..0000000 --- a/libdeps/XPowersLib/Micropython/examples/AXP192_AllFunction.py +++ /dev/null @@ -1,312 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP192_AllFunction.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' -from AXP192 import * -import time - -SDA = None -SCL = None -IRQ = None -I2CBUS = None -if implementation.name == 'micropython': - from machine import Pin, I2C - SDA = 21 - SCL = 22 - IRQ = 35 - I2CBUS = I2C(0, scl=Pin(SCL), sda=Pin(SDA)) -if implementation.name == 'circuitpython': - import digitalio - from board import * - import busio - SDA = IO15 - SCL = IO7 - IRQ = IO6 - I2CBUS = busio.I2C(SCL, SDA) - -pmu_flag = False -irq = None - - -def __callback(args): - global pmu_flag - pmu_flag = True - # print('callback') - - -PMU = AXP192(I2CBUS, addr=AXP192_SLAVE_ADDRESS) - -print('getID:%s' % hex(PMU.getChipID())) - - -# Set the minimum system operating voltage inside the PMU, -# below this value will shut down the PMU -# Range: 2600~3300mV -PMU.setSysPowerDownVoltage(2600) - -# Set the minimum common working voltage of the PMU VBUS input, -# below this value will turn off the PMU -PMU.setVbusVoltageLimit(PMU.XPOWERS_AXP192_VBUS_VOL_LIM_4V5) - -# Turn off USB input current limit -PMU.setVbusCurrentLimit(PMU.XPOWERS_AXP192_VBUS_CUR_LIM_OFF) - - -# DC1 700~3500mV, IMAX=1.2A -PMU.setDC1Voltage(3300) -# print('DC1 : %s Voltage:%u mV ' % PMU.isEnableDC1() ? '+': '-', PMU.getDC1Voltage()) -print('DC1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC1()], PMU.getDC1Voltage())) - - -# DC2 700~2750 mV, IMAX=1.6A -PMU.setDC2Voltage(2750) -print(PMU.isEnableDC2()) -print('DC2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC2()], PMU.getDC2Voltage())) - -# DC3 700~3500mV,IMAX=0.7A -PMU.setDC3Voltage(3300) -print('DC3 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC3()], PMU.getDC3Voltage())) - -# LDO2 1800~3300 mV, 100mV/step, IMAX=200mA -PMU.setLDO2Voltage(1800) - -# LDO3 1800~3300 mV, 100mV/step, IMAX=200mA -PMU.setLDO3Voltage(1800) - -# LDOio 1800~3300 mV, 100mV/step, IMAX=50mA -PMU.setLDOioVoltage(3300) - -# Enable power output channel -PMU.enableDC1() -PMU.enableDC2() -PMU.enableDC3() -PMU.enableLDO2() -PMU.enableLDO3() -PMU.enableLDOio() - -print('===================================') -print('DC1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC1()], PMU.getDC1Voltage())) -print('DC2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC2()], PMU.getDC2Voltage())) -print('DC3 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC3()], PMU.getDC3Voltage())) -print('===================================') - -print('LDO2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableLDO2()], PMU.getLDO2Voltage())) -print('LDO3 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableLDO3()], PMU.getLDO3Voltage())) -print('LDOio : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableLDOio()], PMU.getLDOioVoltage())) -print('===================================') - - -# Set the time of pressing the button to turn off -powerOff = ['4', '6', '8', '10'] -PMU.setPowerKeyPressOffTime(PMU.XPOWERS_POWEROFF_6S) -opt = PMU.getPowerKeyPressOffTime() -print('PowerKeyPressOffTime: %s Sceond' % powerOff[opt]) - - -# Set the button power-on press time -powerOn = ['128ms', '512ms', '1000ms', '2000ms'] -PMU.setPowerKeyPressOnTime(PMU.XPOWERS_POWERON_2S) -opt = PMU.getPowerKeyPressOnTime() -print('PowerKeyPressOnTime: %s ' % powerOn[opt]) - - -print('===================================') - -# It is necessary to disable the detection function of the TS pin on the board -# without the battery temperature detection function, otherwise it will cause abnormal charging -PMU.disableTSPinMeasure() - -PMU.enableTemperatureMeasure() -# PMU.disableTemperatureMeasure() - -# Enable internal ADC detection -PMU.enableBattDetection() -PMU.enableVbusVoltageMeasure() -PMU.enableBattVoltageMeasure() -PMU.enableSystemVoltageMeasure() - -''' -The default setting is CHGLED is automatically controlled by the PMU. -- XPOWERS_CHG_LED_OFF, -- XPOWERS_CHG_LED_BLINK_1HZ, -- XPOWERS_CHG_LED_BLINK_4HZ, -- XPOWERS_CHG_LED_ON, -- XPOWERS_CHG_LED_CTRL_CHG, -''' -PMU.setChargingLedMode(PMU.XPOWERS_CHG_LED_OFF) - - -# Disable all interrupts -PMU.disableIRQ(PMU.XPOWERS_AXP192_ALL_IRQ) -# Clear all interrupt flags -PMU.clearIrqStatus() -# Enable the required interrupt function -PMU.enableIRQ( - PMU.XPOWERS_AXP192_BAT_INSERT_IRQ | PMU.XPOWERS_AXP192_BAT_REMOVE_IRQ | # BATTERY - PMU.XPOWERS_AXP192_VBUS_INSERT_IRQ | PMU.XPOWERS_AXP192_VBUS_REMOVE_IRQ | # VBUS - PMU.XPOWERS_AXP192_PKEY_SHORT_IRQ | PMU.XPOWERS_AXP192_PKEY_LONG_IRQ | # POWER KEY - PMU.XPOWERS_AXP192_BAT_CHG_DONE_IRQ | PMU.XPOWERS_AXP192_BAT_CHG_START_IRQ | # CHARGE - # PMU.XPOWERS_AXP192_PKEY_NEGATIVE_IRQ | PMU.XPOWERS_AXP192_PKEY_POSITIVE_IRQ | # POWER KEY - PMU.XPOWERS_AXP192_TIMER_TIMEOUT_IRQ # Timer -) - - -# Set constant current charge current limit -PMU.setChargerConstantCurr(PMU.XPOWERS_AXP192_CHG_CUR_280MA) -# Set stop charging termination current -PMU.setChargerTerminationCurr(PMU.XPOWERS_AXP192_CHG_ITERM_LESS_10_PERCENT) - -# Set charge cut-off voltage -PMU.setChargeTargetVoltage(PMU.XPOWERS_AXP192_CHG_VOL_4V2) - - -PMU.clearIrqStatus() - -# Set the timing after one minute, the isWdtExpireIrq will be triggered in the loop interrupt function -PMU.setTimerout(1) - -data = [1, 2, 3, 4] -print('Write buffer to pmu') -PMU.writeDataBuffer(data, 4) -print('Read buffer from pmu') -tmp = PMU.readDataBuffer(4) -print(tmp) - - -if implementation.name == 'micropython': - irq = Pin(IRQ, Pin.IN, Pin.PULL_UP) - irq.irq(trigger=Pin.IRQ_FALLING, handler=__callback) -if implementation.name == 'circuitpython': - irq = digitalio.DigitalInOut(IRQ) - irq.switch_to_input() - - -while True: - if implementation.name == 'circuitpython': - if irq.value == False: - pmu_flag = True - - if pmu_flag: - pmu_flag = False - mask = PMU.getIrqStatus() - print('pmu_flag:', end='') - print(bin(mask)) - - if PMU.isAcinOverVoltageIrq(): - print("IRQ ---> isAcinOverVoltageIrq") - if PMU.isAcinInserIrq(): - print("IRQ ---> isAcinInserIrq") - if PMU.isAcinRemoveIrq(): - print("IRQ ---> isAcinRemoveIrq") - if PMU.isVbusOverVoltageIrq(): - print("IRQ ---> isVbusOverVoltageIrq") - if PMU.isVbusInsertIrq(): - print("IRQ ---> isVbusInsertIrq") - if PMU.isVbusRemoveIrq(): - print("IRQ ---> isVbusRemoveIrq") - if PMU.isVbusLowVholdIrq(): - print("IRQ ---> isVbusLowVholdIrq") - if PMU.isBatInsertIrq(): - print("IRQ ---> isBatInsertIrq") - if PMU.isBatRemoveIrq(): - print("IRQ ---> isBatRemoveIrq") - if PMU.isBattEnterActivateIrq(): - print("IRQ ---> isBattEnterActivateIrq") - if PMU.isBattExitActivateIrq(): - print("IRQ ---> isBattExitActivateIrq") - if PMU.isBatChargeStartIrq(): - print("IRQ ---> isBatChargeStartIrq") - if PMU.isBatChargeDoneIrq(): - print("IRQ ---> isBatChargeDoneIrq") - if PMU.isBattTempHighIrq(): - print("IRQ ---> isBattTempHighIrq") - if PMU.isBattTempLowIrq(): - print("IRQ ---> isBattTempLowIrq") - if PMU.isChipOverTemperatureIrq(): - print("IRQ ---> isChipOverTemperatureIrq") - if PMU.isChargingCurrentLessIrq(): - print("IRQ ---> isChargingCurrentLessIrq") - if PMU.isDC1VoltageLessIrq(): - print("IRQ ---> isDC1VoltageLessIrq") - if PMU.isDC2VoltageLessIrq(): - print("IRQ ---> isDC2VoltageLessIrq") - if PMU.isDC3VoltageLessIrq(): - print("IRQ ---> isDC3VoltageLessIrq") - if PMU.isPekeyShortPressIrq(): - print("IRQ ---> isPekeyShortPress") - if PMU.isPekeyLongPressIrq(): - print("IRQ ---> isPekeyLongPress") - if PMU.isNOEPowerOnIrq(): - print("IRQ ---> isNOEPowerOnIrq") - if PMU.isNOEPowerDownIrq(): - print("IRQ ---> isNOEPowerDownIrq") - if PMU.isVbusEffectiveIrq(): - print("IRQ ---> isVbusEffectiveIrq") - if PMU.isVbusInvalidIrq(): - print("IRQ ---> isVbusInvalidIrq") - if PMU.isVbusSessionIrq(): - print("IRQ ---> isVbusSessionIrq") - if PMU.isVbusSessionEndIrq(): - print("IRQ ---> isVbusSessionEndIrq") - if PMU.isLowVoltageLevel2Irq(): - print("IRQ ---> isLowVoltageLevel2Irq") - if PMU.isWdtExpireIrq(): - print("IRQ ---> isWdtExpire") - # Clear the timer state and continue to the next timer - PMU.clearTimerFlag() - - if PMU.isGpio2EdgeTriggerIrq(): - print("IRQ ---> isGpio2EdgeTriggerIrq") - if PMU.isGpio1EdgeTriggerIrq(): - print("IRQ ---> isGpio1EdgeTriggerIrq") - if PMU.isGpio0EdgeTriggerIrq(): - print("IRQ ---> isGpio0EdgeTriggerIrq") - # Clear PMU Interrupt Status Register - PMU.clearIrqStatus() - - PMU.setChargingLedMode((PMU.XPOWERS_CHG_LED_OFF, PMU.XPOWERS_CHG_LED_ON)[ - PMU.getChargingLedMode() == PMU.XPOWERS_CHG_LED_OFF]) - - print("getBattVoltage:{0}mV".format(PMU.getBattVoltage())) - print("getSystemVoltage:{0}mV".format(PMU.getSystemVoltage())) - print("getBatteryPercent:{0}%".format(PMU.getBatteryPercent())) - print("getTemperature:{0}%".format(PMU.getTemperature())) - - print("isCharging:{0}".format(PMU.isCharging())) - print("isDischarge:{0}".format(PMU.isDischarge())) - print("isVbusIn:{0}".format(PMU.isVbusIn())) - - time.sleep(0.8) diff --git a/libdeps/XPowersLib/Micropython/examples/AXP192_AnalogRead.py b/libdeps/XPowersLib/Micropython/examples/AXP192_AnalogRead.py deleted file mode 100644 index eea76d8..0000000 --- a/libdeps/XPowersLib/Micropython/examples/AXP192_AnalogRead.py +++ /dev/null @@ -1,64 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP192_AnalogRead.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' -from AXP192 import * -import time - -SDA = None -SCL = None -I2CBUS = None -if implementation.name == 'micropython': - from machine import Pin, I2C - SDA = 21 - SCL = 22 - IRQ = 35 - I2CBUS = I2C(scl=Pin(SCL), sda=Pin(SDA)) -if implementation.name == 'circuitpython': - from board import * - import busio - SDA = IO15 - SCL = IO7 - IRQ = IO6 - I2CBUS = busio.I2C(SCL, SDA) - - -PMU = AXP192(I2CBUS, addr=AXP192_SLAVE_ADDRESS) -print('getID:%s' % hex(PMU.getChipID())) - - -val = 0 -while True: - IO0 = PMU.analogRead(PMU.PMU_GPIO0) - IO1 = PMU.analogRead(PMU.PMU_GPIO1) - # IO2 = PMU.analogRead(PMU_GPIO2) # not support - # IO3 = PMU.analogRead(PMU_GPIO3) # not support - # IO4 = PMU.analogRead(PMU_GPIO4) # not support - # IO5 = PMU.analogRead(PMU_GPIO5) # not support - print('IO0:{0} IO1:{1} '.format(IO0, IO1)) - - time.sleep(1.5) diff --git a/libdeps/XPowersLib/Micropython/examples/AXP192_GpioInput.py b/libdeps/XPowersLib/Micropython/examples/AXP192_GpioInput.py deleted file mode 100644 index ef37091..0000000 --- a/libdeps/XPowersLib/Micropython/examples/AXP192_GpioInput.py +++ /dev/null @@ -1,74 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP192_GpioInput.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' -from AXP192 import * -import time - -SDA = None -SCL = None -IRQ = None -I2CBUS = None -if implementation.name == 'micropython': - from machine import Pin, I2C - SDA = 21 - SCL = 22 - IRQ = 35 - I2CBUS = I2C(scl=Pin(SCL), sda=Pin(SDA)) -if implementation.name == 'circuitpython': - from board import * - import busio - SDA = IO15 - SCL = IO7 - IRQ = IO6 - I2CBUS = busio.I2C(SCL, SDA) - - -PMU = AXP192(I2CBUS, addr=AXP192_SLAVE_ADDRESS) -print('getID:%s' % hex(PMU.getChipID())) - -PMU.pinMode(PMU.PMU_GPIO0, PMU.INPUT_PULLDOWN) -PMU.pinMode(PMU.PMU_GPIO1, PMU.INPUT_PULLDOWN) -PMU.pinMode(PMU.PMU_GPIO2, PMU.INPUT_PULLDOWN) -PMU.pinMode(PMU.PMU_GPIO3, PMU.INPUT) -PMU.pinMode(PMU.PMU_GPIO4, PMU.INPUT) -PMU.pinMode(PMU.PMU_GPIO5, PMU.INPUT) - -print('AXP192 GPIO 3 ~ 5 is a floating input, please ensure there is an external pull-up or pull-down resistor') - -while True: - IO0 = PMU.digitalRead(PMU.PMU_GPIO0) - IO1 = PMU.digitalRead(PMU.PMU_GPIO1) - IO2 = PMU.digitalRead(PMU.PMU_GPIO2) - IO3 = PMU.digitalRead(PMU.PMU_GPIO3) - IO4 = PMU.digitalRead(PMU.PMU_GPIO4) - IO5 = PMU.digitalRead(PMU.PMU_GPIO5) - - print('IO0:{0} IO1:{1} IO2:{2} IO3:{3} IO4:{4} IO5:{5} '.format( - IO0, IO1, IO2, IO3, IO4, IO5)) - - time.sleep(1.5) diff --git a/libdeps/XPowersLib/Micropython/examples/AXP2101_AllFunction.py b/libdeps/XPowersLib/Micropython/examples/AXP2101_AllFunction.py deleted file mode 100644 index a516620..0000000 --- a/libdeps/XPowersLib/Micropython/examples/AXP2101_AllFunction.py +++ /dev/null @@ -1,369 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP2101_AllFunction.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' -from AXP2101 import * -import time - -SDA = None -SCL = None -IRQ = None -I2CBUS = None - -if implementation.name == 'micropython': - from machine import Pin, I2C - SDA = 21 - SCL = 22 - IRQ = 35 - I2CBUS = I2C(scl=Pin(SCL), sda=Pin(SDA)) -if implementation.name == 'circuitpython': - import digitalio - import board - import busio - SDA = board.IO42 - SCL = board.IO41 - IRQ = board.IO6 - I2CBUS = busio.I2C(SCL, SDA) -pmu_flag = False -irq = None - - -def __callback(args): - global pmu_flag - pmu_flag = True - # print('callback') - - -PMU = AXP2101(I2CBUS, addr=AXP2101_SLAVE_ADDRESS) - -id = PMU.getChipID() -if id != XPOWERS_AXP2101_CHIP_ID: - print("PMU is not online...") - while True: - pass - -print('getID:%s' % hex(PMU.getChipID())) - -# Set the minimum common working voltage of the PMU VBUS input, -# below this value will turn off the PMU -PMU.setVbusVoltageLimit(PMU.XPOWERS_AXP2101_VBUS_VOL_LIM_4V36) - -# Set the maximum current of the PMU VBUS input, -# higher than this value will turn off the PMU -PMU.setVbusCurrentLimit(PMU.XPOWERS_AXP2101_VBUS_CUR_LIM_1500MA) - -# Get the VSYS shutdown voltage -vol = PMU.getSysPowerDownVoltage() -print('-> getSysPowerDownVoltage:%u' % vol) - -# Set VSY off voltage as 2600mV, Adjustment range 2600mV ~ 3300mV -PMU.setSysPowerDownVoltage(2600) - -vol = PMU.getSysPowerDownVoltage() -print('-> getSysPowerDownVoltage:%u' % vol) - -# DC1 IMAX = 2A -# 1500~3400mV, 100mV/step, 20steps -PMU.setDC1Voltage(3300) -# print('DC1 : %s Voltage:%u mV ' % PMU.isEnableDC1() ? '+': '-', PMU.getDC1Voltage()) -print('DC1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC1()], PMU.getDC1Voltage())) - - -# DC2 IMAX = 2A -# 500~1200mV 10mV/step, 71steps -# 1220~1540mV 20mV/step, 17steps -PMU.setDC2Voltage(1000) -print(PMU.isEnableDC2()) -print('DC2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC2()], PMU.getDC2Voltage())) - -# DC3 IMAX = 2A -# 500~1200mV, 10mV/step, 71steps -# 1220~1540mV, 20mV/step, 17steps -# 1600~3400mV, 100mV/step, 19steps -PMU.setDC3Voltage(3300) -print('DC3 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC3()], PMU.getDC3Voltage())) - -# DCDC4 IMAX = 1.5A -# 500~1200mV, 10mV/step, 71steps -# 1220~1840mV, 20mV/step, 32steps -PMU.setDC4Voltage(1000) -print('DC4 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC4()], PMU.getDC4Voltage())) - -# DC5 IMAX = 2A -# 1200mV -# 1400~3700mV, 100mV/step, 24steps -PMU.setDC5Voltage(3300) -print('DC5 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC5()], PMU.getDC5Voltage())) - -# ALDO1 IMAX = 300mA -# 500~3500mV, 100mV/step, 31steps -PMU.setALDO1Voltage(3300) - -# ALDO2 IMAX = 300mA -# 500~3500mV, 100mV/step, 31steps -PMU.setALDO2Voltage(3300) - -# ALDO3 IMAX = 300mA -# 500~3500mV, 100mV/step, 31steps -PMU.setALDO3Voltage(3300) - -# ALDO4 IMAX = 300mA -# 500~3500mV, 100mV/step, 31steps -PMU.setALDO4Voltage(3300) - -# BLDO1 IMAX = 300mA -# 500~3500mV, 100mV/step, 31steps -PMU.setBLDO1Voltage(3300) - -# BLDO2 IMAX = 300mA -# 500~3500mV, 100mV/step, 31steps -PMU.setBLDO2Voltage(3300) - -# CPUSLDO IMAX = 30mA -# 500~1400mV, 50mV/step, 19steps -PMU.setCPUSLDOVoltage(1000) - -# DLDO1 IMAX = 300mA -# 500~3400mV, 100mV/step, 29steps -PMU.setDLDO1Voltage(3300) - -# DLDO2 IMAX = 300mA -# 500~1400mV, 50mV/step, 2steps -PMU.setDLDO2Voltage(3300) - -# PMU.enableDC1() -PMU.enableDC2() -PMU.enableDC3() -PMU.enableDC4() -PMU.enableDC5() -PMU.enableALDO1() -PMU.enableALDO2() -PMU.enableALDO3() -PMU.enableALDO4() -PMU.enableBLDO1() -PMU.enableBLDO2() -PMU.enableCPUSLDO() -PMU.enableDLDO1() -PMU.enableDLDO2() - -print('===================================') -print('DC1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC1()], PMU.getDC1Voltage())) -print('DC2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC2()], PMU.getDC2Voltage())) -print('DC3 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC3()], PMU.getDC3Voltage())) -print('DC4 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC4()], PMU.getDC4Voltage())) -print('DC5 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDC5()], PMU.getDC5Voltage())) -print('===================================') -print('ALDO1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableALDO1()], PMU.getALDO1Voltage())) -print('ALDO2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableALDO2()], PMU.getALDO2Voltage())) -print('ALDO3 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableALDO3()], PMU.getALDO3Voltage())) -print('ALDO4 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableALDO4()], PMU.getALDO4Voltage())) -print('===================================') -print('BLDO1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableBLDO1()], PMU.getBLDO1Voltage())) -print('BLDO2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableBLDO2()], PMU.getBLDO2Voltage())) -print('===================================') -print('CPUSLDO: {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableCPUSLDO()], PMU.getCPUSLDOVoltage())) -print('===================================') -print('DLDO1 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDLDO1()], PMU.getDLDO1Voltage())) -print('DLDO2 : {0} Voltage:{1} mV '.format( - ('-', '+')[PMU.isEnableDLDO2()], PMU.getDLDO2Voltage())) -print('===================================') - -# Set the time of pressing the button to turn off -powerOff = ['4', '6', '8', '10'] -PMU.setPowerKeyPressOffTime(PMU.XPOWERS_POWEROFF_6S) -opt = PMU.getPowerKeyPressOffTime() -print('PowerKeyPressOffTime: %s Sceond' % powerOff[opt]) - - -# Set the button power-on press time -powerOn = ['128ms', '512ms', '1000ms', '2000ms'] -PMU.setPowerKeyPressOnTime(PMU.XPOWERS_POWERON_2S) -opt = PMU.getPowerKeyPressOnTime() -print('PowerKeyPressOnTime: %s ' % powerOn[opt]) - - -print('===================================') - -# DCDC 120 % (130 %) high voltage turn off PMIC function -en = PMU.getDCHighVoltagePowerDownEn() -print('getDCHighVoltagePowerDownEn:%s' % ('DISABLE', 'ENABLE')[en]) - -# DCDC1 85 % low voltage turn off PMIC function -en = PMU.getDC1LowVoltagePowerDownEn() -print('getDC1LowVoltagePowerDownEn:%s' % ('DISABLE', 'ENABLE')[en]) - -# DCDC2 85 % low voltage turn off PMIC function -en = PMU.getDC2LowVoltagePowerDownEn() -print('getDC2LowVoltagePowerDownEn:%s' % ('DISABLE', 'ENABLE')[en]) - -# DCDC3 85 % low voltage turn off PMIC function -en = PMU.getDC3LowVoltagePowerDownEn() -print('getDC3LowVoltagePowerDownEn:%s' % ('DISABLE', 'ENABLE')[en]) - -# DCDC4 85 % low voltage turn off PMIC function -en = PMU.getDC4LowVoltagePowerDownEn() -print('getDC4LowVoltagePowerDownEn:%s' % ('DISABLE', 'ENABLE')[en]) - -# DCDC5 85 % low voltage turn off PMIC function -en = PMU.getDC5LowVoltagePowerDownEn() -print('getDC5LowVoltagePowerDownEn:%s' % ('DISABLE', 'ENABLE')[en]) - - -# PMU.setDCHighVoltagePowerDown(true) -# PMU.setDC1LowVoltagePowerDown(true) -# PMU.setDC2LowVoltagePowerDown(true) -# PMU.setDC3LowVoltagePowerDown(true) -# PMU.setDC4LowVoltagePowerDown(true) -# PMU.setDC5LowVoltagePowerDown(true) - -# It is necessary to disable the detection function of the TS pin on the board -# without the battery temperature detection function, otherwise it will cause abnormal charging -PMU.disableTSPinMeasure() - -# PMU.enableTemperatureMeasure() - -# Enable internal ADC detection -PMU.enableBattDetection() -PMU.enableVbusVoltageMeasure() -PMU.enableBattVoltageMeasure() -PMU.enableSystemVoltageMeasure() - -''' -The default setting is CHGLED is automatically controlled by the PMU. -- XPOWERS_CHG_LED_OFF, -- XPOWERS_CHG_LED_BLINK_1HZ, -- XPOWERS_CHG_LED_BLINK_4HZ, -- XPOWERS_CHG_LED_ON, -- XPOWERS_CHG_LED_CTRL_CHG, -''' -PMU.setChargingLedMode(PMU.XPOWERS_CHG_LED_OFF) - - -# Disable all interrupts -PMU.disableIRQ(PMU.XPOWERS_AXP2101_ALL_IRQ) -# Clear all interrupt flags -PMU.clearIrqStatus() -# Enable the required interrupt function -PMU.enableIRQ( - PMU.XPOWERS_AXP2101_BAT_INSERT_IRQ | PMU.XPOWERS_AXP2101_BAT_REMOVE_IRQ | # BATTERY - PMU.XPOWERS_AXP2101_VBUS_INSERT_IRQ | PMU.XPOWERS_AXP2101_VBUS_REMOVE_IRQ | # VBUS - PMU.XPOWERS_AXP2101_PKEY_SHORT_IRQ | PMU.XPOWERS_AXP2101_PKEY_LONG_IRQ | # POWER KEY - PMU.XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | PMU.XPOWERS_AXP2101_BAT_CHG_START_IRQ # CHARGE - # PMU.XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ | PMU.XPOWERS_AXP2101_PKEY_POSITIVE_IRQ | # POWER KEY -) - -# Set the precharge charging current -PMU.setPrechargeCurr(PMU.XPOWERS_AXP2101_PRECHARGE_50MA) -# Set constant current charge current limit -PMU.setChargerConstantCurr(PMU.XPOWERS_AXP2101_CHG_CUR_200MA) -# Set stop charging termination current -PMU.setChargerTerminationCurr(PMU.XPOWERS_AXP2101_CHG_ITERM_25MA) - -# Set charge cut-off voltage -PMU.setChargeTargetVoltage(PMU.XPOWERS_AXP2101_CHG_VOL_4V1) - -# Set the watchdog trigger event type -PMU.setWatchdogConfig(PMU.XPOWERS_AXP2101_WDT_IRQ_TO_PIN) -# Set watchdog timeout -PMU.setWatchdogTimeout(PMU.XPOWERS_AXP2101_WDT_TIMEOUT_4S) -# Enable watchdog to trigger interrupt event -# PMU.enableWatchdog() - -PMU.disableWatchdog() - -PMU.clearIrqStatus() - - -data = [1, 2, 3, 4] -print('Write buffer to pmu') -PMU.writeDataBuffer(data, 4) -print('Read buffer from pmu') -tmp = PMU.readDataBuffer(4) -print(tmp) - - -if implementation.name == 'micropython': - irq = Pin(IRQ, Pin.IN, Pin.PULL_UP) - irq.irq(trigger=Pin.IRQ_FALLING, handler=__callback) -if implementation.name == 'circuitpython': - irq = digitalio.DigitalInOut(IRQ) - irq.switch_to_input() - - -while True: - if implementation.name == 'circuitpython': - if irq.value == False: - pmu_flag = True - - if pmu_flag: - pmu_flag = False - mask = PMU.getIrqStatus() - print('pmu_flag:', end='') - print(bin(mask)) - - if PMU.isPekeyShortPressIrq(): - print("IRQ ---> isPekeyShortPress") - if PMU.isPekeyLongPressIrq(): - print("IRQ ---> isPekeyLongPress") - if PMU.isPekeyNegativeIrq(): - print("IRQ ---> isPekeyNegative") - if PMU.isPekeyPositiveIrq(): - print("IRQ ---> isPekeyPositive") - if PMU.isWdtExpireIrq(): - print("IRQ ---> isWdtExpire") - - PMU.clearIrqStatus() - - PMU.setChargingLedMode((PMU.XPOWERS_CHG_LED_OFF, PMU.XPOWERS_CHG_LED_ON)[ - PMU.getChargingLedMode() == PMU.XPOWERS_CHG_LED_OFF]) - print("getBattVoltage:{0}mV".format(PMU.getBattVoltage())) - print("getSystemVoltage:{0}mV".format(PMU.getSystemVoltage())) - print("getBatteryPercent:{0}%".format(PMU.getBatteryPercent())) - - print("isCharging:{0}".format(PMU.isCharging())) - print("isDischarge:{0}".format(PMU.isDischarge())) - print("isStandby:{0}".format(PMU.isStandby())) - - time.sleep(0.8) diff --git a/libdeps/XPowersLib/Micropython/examples/AXP2101_Interrupt.py b/libdeps/XPowersLib/Micropython/examples/AXP2101_Interrupt.py deleted file mode 100644 index aef9c74..0000000 --- a/libdeps/XPowersLib/Micropython/examples/AXP2101_Interrupt.py +++ /dev/null @@ -1,184 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP2101_Interrupt.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' -from AXP2101 import * -import time - -SDA = None -SCL = None -I2CBUS = None - -if implementation.name == 'micropython': - from machine import Pin, I2C - SDA = 21 - SCL = 22 - IRQ = 35 - I2CBUS = I2C(scl=Pin(SCL), sda=Pin(SDA)) -if implementation.name == 'circuitpython': - import digitalio - import board - import busio - SDA = board.IO42 - SCL = board.IO41 - IRQ = board.IO6 - I2CBUS = busio.I2C(SCL, SDA) - -irq = None -pmu_flag = False - - -def __callback(args): - global pmu_flag - pmu_flag = True - - -PMU = AXP2101(I2CBUS, addr=AXP2101_SLAVE_ADDRESS) -print('getID:%s' % hex(PMU.getChipID())) - -PMU.disableIRQ(PMU.XPOWERS_AXP2101_ALL_IRQ) -# Clear all interrupt flags -PMU.clearIrqStatus() -PMU.printIntRegister() - -PMU.enableIRQ(PMU.XPOWERS_AXP2101_PKEY_SHORT_IRQ | - PMU.XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ) -# Print AXP2101 interrupt control register -PMU.printIntRegister() - -# PMU.enableIRQ( -# PMU.XPOWERS_AXP2101_BAT_INSERT_IRQ | PMU.XPOWERS_AXP2101_BAT_REMOVE_IRQ | # BATTERY -# PMU.XPOWERS_AXP2101_VBUS_INSERT_IRQ | PMU.XPOWERS_AXP2101_VBUS_REMOVE_IRQ | # VBUS -# PMU.XPOWERS_AXP2101_PKEY_SHORT_IRQ | PMU.XPOWERS_AXP2101_PKEY_LONG_IRQ | # POWER KEY -# PMU.XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | PMU.XPOWERS_AXP2101_BAT_CHG_START_IRQ # CHARGE -# ) - -PMU.enableIRQ(PMU.XPOWERS_AXP2101_BAT_NOR_UNDER_TEMP_IRQ) -# Print AXP2101 interrupt control register -PMU.printIntRegister() - -PMU.enableIRQ(PMU.XPOWERS_AXP2101_PKEY_SHORT_IRQ | - PMU.XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ) -# Print AXP2101 interrupt control register -PMU.printIntRegister() - -PMU.enableIRQ(PMU.XPOWERS_AXP2101_BAT_OVER_VOL_IRQ) -# Print AXP2101 interrupt control register -PMU.printIntRegister() - -if implementation.name == 'micropython': - irq = Pin(IRQ, Pin.IN, Pin.PULL_UP) - irq.irq(trigger=Pin.IRQ_FALLING, handler=__callback) -if implementation.name == 'circuitpython': - irq = digitalio.DigitalInOut(IRQ) - irq.switch_to_input() - -while True: - if implementation.name == 'circuitpython': - if irq.value == False: - pmu_flag = True - - if pmu_flag: - pmu_flag = False - # Get PMU Interrupt Status Register - status = PMU.getIrqStatus() - print("STATUS => HEX:") - print(hex(status)) - - if PMU.isDropWarningLevel2Irq(): - print("isDropWarningLevel2") - - if PMU.isDropWarningLevel1Irq(): - print("isDropWarningLevel1") - - if PMU.isGaugeWdtTimeoutIrq(): - print("isWdtTimeout") - - if PMU.isBatChargerOverTemperatureIrq(): - print("isBatChargeOverTemperature") - - if PMU.isBatWorkOverTemperatureIrq(): - print("isBatWorkOverTemperature") - - if PMU.isBatWorkUnderTemperatureIrq(): - print("isBatWorkUnderTemperature") - - if PMU.isVbusInsertIrq(): - print("isVbusInsert") - - if PMU.isVbusRemoveIrq(): - print("isVbusRemove") - - if PMU.isBatInsertIrq(): - print("isBatInsert") - - if PMU.isBatRemoveIrq(): - print("isBatRemove") - - if PMU.isPekeyShortPressIrq(): - print("isPekeyShortPress") - - if PMU.isPekeyLongPressIrq(): - print("isPekeyLongPress") - - if PMU.isPekeyNegativeIrq(): - print("isPekeyNegative") - - if PMU.isPekeyPositiveIrq(): - print("isPekeyPositive") - - if PMU.isWdtExpireIrq(): - print("isWdtExpire") - - if PMU.isLdoOverCurrentIrq(): - print("isLdoOverCurrentIrq") - - if PMU.isBatfetOverCurrentIrq(): - print("isBatfetOverCurrentIrq") - - if PMU.isBatChargeDoneIrq(): - print("isBatChargeDone") - - if PMU.isBatChargeStartIrq(): - print("isBatChargeStart") - - if PMU.isBatDieOverTemperatureIrq(): - print("isBatDieOverTemperature") - - if PMU.isChargeOverTimeoutIrq(): - print("isChargeOverTimeout") - - if PMU.isBatOverVoltageIrq(): - print("isBatOverVoltage") - - # Clear PMU Interrupt Status Register - PMU.clearIrqStatus() - - # Print AXP2101 interrupt control register - PMU.printIntRegister() - - time.sleep(0.2) diff --git a/libdeps/XPowersLib/Micropython/src/AXP192.py b/libdeps/XPowersLib/Micropython/src/AXP192.py deleted file mode 100644 index 959db3b..0000000 --- a/libdeps/XPowersLib/Micropython/src/AXP192.py +++ /dev/null @@ -1,1684 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP192.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' - -from I2CInterface import * -import math - -_AXP192_CHIP_ID = const(0x03) -_AXP192_STATUS = const(0x00) -_AXP192_MODE_CHGSTATUS = const(0x01) -_AXP192_OTG_STATUS = const(0x02) -_AXP192_IC_TYPE = const(0x03) -_AXP192_DATA_BUFFER1 = const(0x06) -_AXP192_DATA_BUFFER2 = const(0x07) -_AXP192_DATA_BUFFER3 = const(0x08) -_AXP192_DATA_BUFFER4 = const(0x09) -_AXP192_DATA_BUFFER5 = const(0x0A) -_AXP192_DATA_BUFFER6 = const(0x0B) -_AXP192_DATA_BUFFER_SIZE = const(6) -_AXP192_LDO23_DC123_EXT_CTL = const(0x12) -_AXP192_DC2OUT_VOL = const(0x23) -_AXP192_DC2_DVM = const(0x25) -_AXP192_DC3OUT_VOL = const(0x27) -_AXP192_LDO24OUT_VOL = const(0x28) -_AXP192_LDO3OUT_VOL = const(0x29) -_AXP192_IPS_SET = const(0x30) -_AXP192_VOFF_SET = const(0x31) -_AXP192_OFF_CTL = const(0x32) -_AXP192_CHARGE1 = const(0x33) -_AXP192_CHARGE2 = const(0x34) -_AXP192_BACKUP_CHG = const(0x35) -_AXP192_POK_SET = const(0x36) -_AXP192_DCDC_FREQSET = const(0x37) -_AXP192_VLTF_CHGSET = const(0x38) -_AXP192_VHTF_CHGSET = const(0x39) -_AXP192_APS_WARNING1 = const(0x3A) -_AXP192_APS_WARNING2 = const(0x3B) -_AXP192_TLTF_DISCHGSET = const(0x3C) -_AXP192_THTF_DISCHGSET = const(0x3D) -_AXP192_DCDC_MODESET = const(0x80) -_AXP192_ADC_EN1 = const(0x82) -_AXP192_ADC_EN2 = const(0x83) -_AXP192_ADC_SPEED = const(0x84) -_AXP192_ADC_INPUTRANGE = const(0x85) -_AXP192_ADC_IRQ_RETFSET = const(0x86) -_AXP192_ADC_IRQ_FETFSET = const(0x87) -_AXP192_TIMER_CTL = const(0x8A) -_AXP192_VBUS_DET_SRP = const(0x8B) -_AXP192_HOTOVER_CTL = const(0x8F) -_AXP192_PWM1_FREQ_SET = const(0x98) -_AXP192_PWM1_DUTY_SET1 = const(0x99) -_AXP192_PWM1_DUTY_SET2 = const(0x9A) -_AXP192_PWM2_FREQ_SET = const(0x9B) -_AXP192_PWM2_DUTY_SET1 = const(0x9C) -_AXP192_PWM2_DUTY_SET2 = const(0x9D) -# INTERRUPT REGISTER -_AXP192_INTEN1 = const(0x40) -_AXP192_INTEN2 = const(0x41) -_AXP192_INTEN3 = const(0x42) -_AXP192_INTEN4 = const(0x43) -_AXP192_INTEN5 = const(0x4A) -# INTERRUPT STATUS REGISTER -_AXP192_INTSTS1 = const(0x44) -_AXP192_INTSTS2 = const(0x45) -_AXP192_INTSTS3 = const(0x46) -_AXP192_INTSTS4 = const(0x47) -_AXP192_INTSTS5 = const(0x4D) -_AXP192_INTSTS_CNT = const(5) -_AXP192_DC1_VLOTAGE = const(0x26) -_AXP192_LDO23OUT_VOL = const(0x28) -_AXP192_GPIO0_CTL = const(0x90) -_AXP192_GPIO0_VOL = const(0x91) -_AXP192_GPIO1_CTL = const(0X92) -_AXP192_GPIO2_CTL = const(0x93) -_AXP192_GPIO012_SIGNAL = const(0x94) -_AXP192_GPIO34_CTL = const(0x95) -_AXP192_GPIO34_SIGNAL = const(0x96) -_AXP192_GPIO012_PULLDOWN = const(0x97) -_AXP192_GPIO5_CTL = const(0x9E) -_AXP192_GPIO0_VOL_ADC_H8 = const(0x64) -_AXP192_GPIO0_VOL_ADC_L4 = const(0x65) -_AXP192_GPIO1_VOL_ADC_H8 = const(0x66) -_AXP192_GPIO1_VOL_ADC_L4 = const(0x67) -_AXP192_GPIO2_VOL_ADC_H8 = const(0x68) -_AXP192_GPIO2_VOL_ADC_L4 = const(0x69) -_AXP192_GPIO3_VOL_ADC_H8 = const(0x6A) -_AXP192_GPIO3_VOL_ADC_L4 = const(0x6B) -_AXP192_GPIO_COUNT = const(5) -_AXP192_GPIO0_STEP = const(0.5) -_AXP192_GPIO1_STEP = const(0.5) -_AXP192_TS_IN_H8 = const(0x62) -_AXP192_TS_IN_L4 = const(0x63) -_AXP192_BAT_AVERCHGCUR_H8 = const(0x7A) -_AXP192_BAT_AVERCHGCUR_L5 = const(0x7B) -_AXP192_ACIN_VOL_H8 = const(0x56) -_AXP192_ACIN_VOL_L4 = const(0x57) -_AXP192_ACIN_CUR_H8 = const(0x58) -_AXP192_ACIN_CUR_L4 = const(0x59) -_AXP192_VBUS_VOL_H8 = const(0x5A) -_AXP192_VBUS_VOL_L4 = const(0x5B) -_AXP192_VBUS_CUR_H8 = const(0x5C) -_AXP192_VBUS_CUR_L4 = const(0x5D) -_AXP192_BAT_AVERDISCHGCUR_H8 = const(0x7C) -_AXP192_BAT_AVERDISCHGCUR_L5 = const(0x7D) -_AXP192_APS_AVERVOL_H8 = const(0x7E) -_AXP192_APS_AVERVOL_L4 = const(0x7F) -_AXP192_BAT_AVERVOL_H8 = const(0x78) -_AXP192_BAT_AVERVOL_L4 = const(0x79) -_AXP192_BAT_CHGCOULOMB3 = const(0xB0) -_AXP192_BAT_CHGCOULOMB2 = const(0xB1) -_AXP192_BAT_CHGCOULOMB1 = const(0xB2) -_AXP192_BAT_CHGCOULOMB0 = const(0xB3) -_AXP192_BAT_DISCHGCOULOMB3 = const(0xB4) -_AXP192_BAT_DISCHGCOULOMB2 = const(0xB5) -_AXP192_BAT_DISCHGCOULOMB1 = const(0xB6) -_AXP192_BAT_DISCHGCOULOMB0 = const(0xB7) -_AXP192_COULOMB_CTL = const(0xB8) -_AXP192_BATT_VOLTAGE_STEP = const(1.1) -_AXP192_BATT_DISCHARGE_CUR_STEP = const(0.5) -_AXP192_BATT_CHARGE_CUR_STEP = const(0.5) -_AXP192_ACIN_VOLTAGE_STEP = const(1.7) -_AXP192_ACIN_CUR_STEP = const(0.625) -_AXP192_VBUS_VOLTAGE_STEP = const(1.7) -_AXP192_VBUS_CUR_STEP = const(0.375) -_AXP192_APS_VOLTAGE_STEP = const(1.4) -_AXP192_TS_PIN_OUT_STEP = const(0.8) -_AXP192_LDO2_VOL_MIN = const(1800) -_AXP192_LDO2_VOL_MAX = const(3300) -_AXP192_LDO2_VOL_STEPS = const(100) -_AXP192_LDO2_VOL_BIT_MASK = const(4) -_AXP192_LDO3_VOL_MIN = const(1800) -_AXP192_LDO3_VOL_MAX = const(3300) -_AXP192_LDO3_VOL_STEPS = const(100) -_AXP192_DC1_VOL_STEPS = const(25) -_AXP192_DC1_VOL_MIN = const(700) -_AXP192_DC1_VOL_MAX = const(3500) -_AXP192_DC2_VOL_STEPS = const(25) -_AXP192_DC2_VOL_MIN = const(700) -_AXP192_DC2_VOL_MAX = const(3500) -_AXP192_DC3_VOL_STEPS = const(25) -_AXP192_DC3_VOL_MIN = const(700) -_AXP192_DC3_VOL_MAX = const(3500) -_AXP192_LDOIO_VOL_STEPS = const(100) -_AXP192_LDOIO_VOL_MIN = const(1800) -_AXP192_LDOIO_VOL_MAX = const(3300) -_AXP192_SYS_VOL_STEPS = const(100) -_AXP192_VOFF_VOL_MIN = const(2600) -_AXP192_VOFF_VOL_MAX = const(3300) -_AXP192_CHG_EXT_CURR_MIN = const(300) -_AXP192_CHG_EXT_CURR_MAX = const(1000) -_AXP192_CHG_EXT_CURR_STEP = const(100) -_AXP192_INTERNAL_TEMP_H8 = const(0x5E) -_AXP192_INTERNAL_TEMP_L4 = const(0x5) -_AXP192_INTERNAL_TEMP_STEP = const(0.1) -_AXP192_INERNAL_TEMP_OFFSET = const(144.7) - -_MONITOR_TS_PIN = const(1 << 0) -_MONITOR_APS_VOLTAGE = const(1 << 1) -_MONITOR_USB_CURRENT = const(1 << 2) -_MONITOR_USB_VOLTAGE = const(1 << 3) -_MONITOR_AC_CURRENT = const(1 << 4) -_MONITOR_AC_VOLTAGE = const(1 << 5) -_MONITOR_BAT_CURRENT = const(1 << 6) -_MONITOR_BAT_VOLTAGE = const(1 << 7) -_MONITOR_ADC_IO3 = const(1 << 8) -_MONITOR_ADC_IO2 = const(1 << 9) -_MONITOR_ADC_IO1 = const(1 << 10) -_MONITOR_ADC_IO0 = const(1 << 11) -_MONITOR_TEMPERATURE = const(1 << 16) - -AXP192_SLAVE_ADDRESS = const(0x34) - - -class PMU_Gpio: - def __init__(self) -> None: - self.mode = 0 - self.val = 0 - - -class AXP192(I2CInterface): - - # ARGS ARGS ARGS ARGS ARGS ARGS ARGS ARGS ARGS - """VBUS voltage limit values""" - XPOWERS_AXP192_VBUS_VOL_LIM_4V = const(0) - XPOWERS_AXP192_VBUS_VOL_LIM_4V1 = const(1) - XPOWERS_AXP192_VBUS_VOL_LIM_4V2 = const(2) - XPOWERS_AXP192_VBUS_VOL_LIM_4V3 = const(3) - XPOWERS_AXP192_VBUS_VOL_LIM_4V4 = const(4) - XPOWERS_AXP192_VBUS_VOL_LIM_4V5 = const(5) - XPOWERS_AXP192_VBUS_VOL_LIM_4V6 = const(6) - XPOWERS_AXP192_VBUS_VOL_LIM_4V7 = const(7) - - """Power button press shutdown time values""" - XPOWERS_POWEROFF_4S = const(0) - XPOWERS_POWEROFF_6S = const(1) - XPOWERS_POWEROFF_8S = const(2) - XPOWERS_POWEROFF_10S = const(3) - - """Power on time value when the power button is pressed""" - XPOWERS_POWERON_128MS = const(0) - XPOWERS_POWERON_512MS = const(1) - XPOWERS_POWERON_1S = const(2) - XPOWERS_POWERON_2S = const(3) - - XPOWERS_AXP192_CHG_ITERM_LESS_10_PERCENT = const(0) - XPOWERS_AXP192_CHG_ITERM_LESS_15_PERCENT = const(1) - - """Precharge timeout limit values""" - XPOWERS_AXP192_PRECHG_TIMEOUT_30MIN = const(0) - XPOWERS_AXP192_PRECHG_TIMEOUT_40MIN = const(1) - XPOWERS_AXP192_PRECHG_TIMEOUT_50MIN = const(2) - XPOWERS_AXP192_PRECHG_TIMEOUT_60MIN = const(3) - - """PowerKey longpress timeout values""" - XPOWERS_AXP192_LONGPRESS_1000MS = const(0) - XPOWERS_AXP192_LONGPRESS_1500MS = const(1) - XPOWERS_AXP192_LONGPRESS_2000MS = const(2) - XPOWERS_AXP192_LONGPRESS_2500MS = const(3) - - """PMU LED indicator function values""" - XPOWERS_CHG_LED_OFF = const(0) - XPOWERS_CHG_LED_BLINK_1HZ = const(1) - XPOWERS_CHG_LED_BLINK_4HZ = const(2) - XPOWERS_CHG_LED_ON = const(3) - XPOWERS_CHG_LED_CTRL_CHG = const(4) - - XPOWERS_AXP192_CHG_CONS_TIMEOUT_7H = const(0) - XPOWERS_AXP192_CHG_CONS_TIMEOUT_8H = const(1) - XPOWERS_AXP192_CHG_CONS_TIMEOUT_9H = const(2) - XPOWERS_AXP192_CHG_CONS_TIMEOUT_10H = const(3) - - """PMU backup battery voltage values""" - XPOWERS_AXP192_BACKUP_BAT_VOL_3V1 = const(0) - XPOWERS_AXP192_BACKUP_BAT_VOL_3V = const(1) - # !NEED FIXDATASHEET ERROR! - XPOWERS_AXP192_BACKUP_BAT_VOL_3V0 = const(2) - XPOWERS_AXP192_BACKUP_BAT_VOL_2V5 = const(3) - - """PMU backup battery current values""" - XPOWERS_AXP192_BACKUP_BAT_CUR_50UA = const(0) - XPOWERS_AXP192_BACKUP_BAT_CUR_100UA = const(1) - XPOWERS_AXP192_BACKUP_BAT_CUR_200UA = const(2) - XPOWERS_AXP192_BACKUP_BAT_CUR_400UA = const(3) - - """PMU gpio values""" - PMU_GPIO0 = const(0) - PMU_GPIO1 = const(1) - PMU_GPIO2 = const(2) - PMU_GPIO3 = const(3) - PMU_GPIO4 = const(4) - PMU_GPIO5 = const(5) - PMU_TS_PIN = const(6) - - """Charging voltage limit values""" - XPOWERS_AXP192_CHG_VOL_4V1 = const(0) - XPOWERS_AXP192_CHG_VOL_4V15 = const(1) - XPOWERS_AXP192_CHG_VOL_4V2 = const(2) - XPOWERS_AXP192_CHG_VOL_4V36 = const(3) - - """Charging current limit values""" - XPOWERS_AXP192_CHG_CUR_100MA = const(0) - XPOWERS_AXP192_CHG_CUR_190MA = const(1) - XPOWERS_AXP192_CHG_CUR_280MA = const(2) - XPOWERS_AXP192_CHG_CUR_360MA = const(3) - XPOWERS_AXP192_CHG_CUR_450MA = const(4) - XPOWERS_AXP192_CHG_CUR_550MA = const(5) - XPOWERS_AXP192_CHG_CUR_630MA = const(6) - XPOWERS_AXP192_CHG_CUR_700MA = const(7) - XPOWERS_AXP192_CHG_CUR_780MA = const(8) - XPOWERS_AXP192_CHG_CUR_880MA = const(9) - XPOWERS_AXP192_CHG_CUR_960MA = const(10) - XPOWERS_AXP192_CHG_CUR_1000MA = const(11) - XPOWERS_AXP192_CHG_CUR_1080MA = const(12) - XPOWERS_AXP192_CHG_CUR_1160MA = const(13) - XPOWERS_AXP192_CHG_CUR_1240MA = const(14) - XPOWERS_AXP192_CHG_CUR_1320MA = const(15) - - """VBUS current limit values""" - XPOWERS_AXP192_VBUS_CUR_LIM_500MA = const(0) - XPOWERS_AXP192_VBUS_CUR_LIM_100MA = const(1) - XPOWERS_AXP192_VBUS_CUR_LIM_OFF = const(2) - - """PMU interrupt control mask values""" - #! IRQ1 REG 40H - # VBUS is available, but lower than V HOLD, IRQ enable - XPOWERS_AXP192_VBUS_VHOLD_LOW_IRQ = const(1 << 1) - # VBUS removed, IRQ enable - XPOWERS_AXP192_VBUS_REMOVE_IRQ = const(1 << 2) - # VBUS connected, IRQ enable - XPOWERS_AXP192_VBUS_INSERT_IRQ = const(1 << 3) - # VBUS over-voltage, IRQ enable - XPOWERS_AXP192_VBUS_OVER_VOL_IRQ = const(1 << 4) - # ACIN removed, IRQ enable - XPOWERS_AXP192_ACIN_REMOVED_IRQ = const(1 << 5) - # ACIN connected, IRQ enable - XPOWERS_AXP192_ACIN_CONNECT_IRQ = const(1 << 6) - # ACIN over-voltage, IRQ enable - XPOWERS_AXP192_ACIN_OVER_VOL_IRQ = const(1 << 7) - #! IRQ2 REG 41H - # Battery low-temperature, IRQ enable - XPOWERS_AXP192_BATT_LOW_TEMP_IRQ = const(1 << 8) - # Battery over-temperature, IRQ enable - XPOWERS_AXP192_BATT_OVER_TEMP_IRQ = const(1 << 9) - # Charge finished, IRQ enable - XPOWERS_AXP192_BAT_CHG_DONE_IRQ = const(1 << 10) - # Be charging, IRQ enable - XPOWERS_AXP192_BAT_CHG_START_IRQ = const(1 << 11) - # Exit battery activate mode, IRQ enable - XPOWERS_AXP192_BATT_EXIT_ACTIVATE_IRQ = const(1 << 12) - # Battery activate mode, IRQ enable - XPOWERS_AXP192_BATT_ACTIVATE_IRQ = const(1 << 13) - # Battery removed, IRQ enable - XPOWERS_AXP192_BAT_REMOVE_IRQ = const(1 << 14) - # Battery connected, IRQ enable - XPOWERS_AXP192_BAT_INSERT_IRQ = const(1 << 15) - #! IRQ3 REG 42H - # PEK long press, IRQ enable - XPOWERS_AXP192_PKEY_LONG_IRQ = const(1 << 16) - # PEK short press, IRQ enable - XPOWERS_AXP192_PKEY_SHORT_IRQ = const(1 << 17) - # **Reserved and unchangeable BIT 2 - # DC-DC3output voltage is lower than the set value, IRQ enable - XPOWERS_AXP192_DC3_LOW_VOL_IRQ = const(1 << 19) - # DC-DC2 output voltage is lower than the set value, IRQ enable - XPOWERS_AXP192_DC2_LOW_VOL_IRQ = const(1 << 20) - # DC-DC1 output voltage is lower than the set value, IRQ enable - XPOWERS_AXP192_DC1_LOW_VOL_IRQ = const(1 << 21) - # Charge current is lower than the set current, IRQ enable - XPOWERS_AXP192_CHARGE_LOW_CUR_IRQ = const(1 << 22) - # XPOWERS internal over-temperature, IRQ enable - XPOWERS_AXP192_CHIP_TEMP_HIGH_IRQ = const(1 << 23) - #! IRQ4 REG 43H - # APS low-voltage, IRQ enable - XPOWERS_AXP192_APS_LOW_VOL_LEVEL_IRQ = const(1 << 24) - # **Reserved and unchangeable BIT 1 - # VBUS Session End IRQ enable - XPOWERS_AXP192_VBUS_SESSION_END_IRQ = const(1 << 26) - # VBUS Session A/B IRQ enable - XPOWERS_AXP192_VBUS_SESSION_AB_IRQ = const(1 << 27) - # VBUS invalid, IRQ enable - XPOWERS_AXP192_VBUS_INVALID_IRQ = const(1 << 28) - # VBUS valid, IRQ enable - XPOWERS_AXP192_VBUS_VAILD_IRQ = const(1 << 29) - # N_OE shutdown, IRQ enable - XPOWERS_AXP192_NOE_OFF_IRQ = const(1 << 30) - # N_OE startup, IRQ enable - XPOWERS_AXP192_NOE_ON_IRQ = const(1 << 31) - #! IRQ5 REG 4AH - # GPIO0 input edge trigger, IRQ enable - XPOWERS_AXP192_GPIO0_EDGE_TRIGGER_IRQ = const(1 << 32) - # GPIO1input edge trigger or ADC input, IRQ enable - XPOWERS_AXP192_GPIO1_EDGE_TRIGGER_IRQ = const(1 << 33) - # GPIO2input edge trigger, IRQ enable - XPOWERS_AXP192_GPIO2_EDGE_TRIGGER_IRQ = const(1 << 34) - # **Reserved and unchangeable BIT 3 - # **Reserved and unchangeable BIT 4 - # **Reserved and unchangeable BIT 5 - # **Reserved and unchangeable BIT 6 - # Timer timeout, IRQ enable - XPOWERS_AXP192_TIMER_TIMEOUT_IRQ = const(1 << 39) - XPOWERS_AXP192_ALL_IRQ = const(0xFFFFFFFFFF) - - LOW = const(0x0) - HIGH = const(0x1) - - # GPIO FUNCTIONS - INPUT = const(0x01) - OUTPUT = const(0x03) - PULLUP = const(0x04) - INPUT_PULLUP = const(0x05) - PULLDOWN = const(0x08) - INPUT_PULLDOWN = const(0x09) - ANALOG = const(0x10) - - # INT - RISING = const(0x01) - FALLING = const(0x02) - - def __init__(self, i2c_bus: I2C, addr: int = AXP192_SLAVE_ADDRESS) -> None: - super().__init__(i2c_bus, addr) - print('AXP192 __init__') - - if self.getChipID() != _AXP192_CHIP_ID: - raise RuntimeError( - "Failed to find %s - check your wiring!" % self.__class__.__name__ - ) - - self.statusRegister = [0] * _AXP192_INTSTS_CNT - - self.intRegister = [0] * _AXP192_INTSTS_CNT - self.gpio = [PMU_Gpio(), PMU_Gpio(), PMU_Gpio(), - PMU_Gpio(), PMU_Gpio(), PMU_Gpio()] - - def isAcinVbusStart(self) -> bool: - return bool(super().getRegisterBit(_AXP192_STATUS, 0)) - - def isDischarge(self) -> bool: - return not bool(super().getRegisterBit(_AXP192_STATUS, 2)) - - def isVbusIn(void) -> bool: - return bool(super().getRegisterBit(_AXP192_STATUS, 5)) - - def isAcinEfficient(self) -> bool: - return bool(super().getRegisterBit(_AXP192_STATUS, 6)) - - def isAcinIn(self) -> bool: - return bool(super().getRegisterBit(_AXP192_STATUS, 7)) - - def isOverTemperature(self) -> bool: - return bool(super().getRegisterBit(_AXP192_MODE_CHGSTATUS, 7)) - - def isCharging(self) -> bool: - return bool(super().getRegisterBit(_AXP192_MODE_CHGSTATUS, 6)) - - def isBatteryConnect(self) -> bool: - return bool(super().getRegisterBit(_AXP192_MODE_CHGSTATUS, 5)) - - def isBattInActiveMode(self) -> bool: - return bool(super().getRegisterBit(_AXP192_MODE_CHGSTATUS, 3)) - - def isChargeCurrLessPreset(self) -> bool: - return bool(super().getRegisterBit(_AXP192_MODE_CHGSTATUS, 2)) - - def enableVbusVoltageLimit(self) -> None: - super().setRegisterBit(_AXP192_IPS_SET, 6) - - def disableVbusVoltageLimit(self) -> None: - super().clrRegisterBit(_AXP192_IPS_SET, 6) - - def setVbusVoltageLimit(self, opt: int) -> None: - val = super().readRegister(_AXP192_IPS_SET)[0] - val &= 0xC7 - super().writeRegister(_AXP192_IPS_SET, val | (opt << 3)) - - # @brief Set VBUS Current Input Limit. - # @param opt: View the related chip type _AXP192_vbus_cur_limit_t enumeration - # parameters in "XPowersParams.hpp" - - def setVbusCurrentLimit(self, opt: int) -> None: - if opt == self.XPOWERS_AXP192_VBUS_CUR_LIM_500MA: - super().setRegisterBit(_AXP192_IPS_SET, 1) - super().clrRegisterBit(_AXP192_IPS_SET, 0) - elif opt == self.XPOWERS_AXP192_VBUS_CUR_LIM_100MA: - super().setRegisterBit(_AXP192_IPS_SET, 1) - super().setRegisterBit(_AXP192_IPS_SET, 0) - elif opt == self.XPOWERS_AXP192_VBUS_CUR_LIM_OFF: - super().clrRegisterBit(_AXP192_IPS_SET, 1) - - # @brief Get VBUS Current Input Limit. - # @retval View the related chip type _AXP192_vbus_cur_limit_t enumeration - # parameters in "XPowersParams.hpp" - def getVbusCurrentLimit(self) -> int: - if super().getRegisterBit(_AXP192_IPS_SET, 1) == 0: - return self.XPOWERS_AXP192_VBUS_CUR_LIM_OFF - if super().getRegisterBit(_AXP192_IPS_SET, 0): - return self.XPOWERS_AXP192_VBUS_CUR_LIM_100MA - return self.XPOWERS_AXP192_VBUS_CUR_LIM_500MA - - # Set the minimum system operating voltage inside the PMU, - # below this value will shut down the PMU,Adjustment range 2600mV ~ 3300mV - def setSysPowerDownVoltage(self, millivolt: int) -> bool: - if millivolt % _AXP192_SYS_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_SYS_VOL_STEPS) - if millivolt < _AXP192_VOFF_VOL_MIN: - raise ValueError("Mistake ! SYS minimum output voltage is %umV" % - _AXP192_VOFF_VOL_MIN) - elif millivolt > _AXP192_VOFF_VOL_MAX: - raise ValueError("Mistake ! SYS maximum output voltage is %umV" % - _AXP192_VOFF_VOL_MAX) - val = super().readRegister(_AXP192_VOFF_SET)[0] - val &= 0xF8 - val |= (int)((millivolt - _AXP192_VOFF_VOL_MIN) / - _AXP192_SYS_VOL_STEPS) - super().writeRegister(_AXP192_VOFF_SET, val) - - def getSysPowerDownVoltage(self) -> int: - val = super().readRegister(_AXP192_VOFF_SET)[0] - val &= 0x07 - return (val * _AXP192_SYS_VOL_STEPS) + _AXP192_VOFF_VOL_MIN - - # @brief Set shutdown, calling shutdown will turn off all power channels, - # only VRTC belongs to normal power supply - def shutdown(self) -> None: - super().setRegisterBit(_AXP192_OFF_CTL, 7) - - # Charge setting - def enableCharge(self) -> None: - super().setRegisterBit(_AXP192_CHARGE1, 7) - - def disableCharge(self) -> None: - super().clrRegisterBit(_AXP192_CHARGE1, 7) - - # @brief Set charge target voltage. - # @param opt: See _AXP192_chg_vol_t enum for details. - def setChargeTargetVoltage(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError( - "Charger target voltage must be a value within 0-3!") - val = super().readRegister(_AXP192_CHARGE1)[0] - val &= 0x9F - super().writeRegister(_AXP192_CHARGE1, val | (opt << 5)) - - # @brief Get charge target voltage settings. - # @retval See _AXP192_chg_vol_t enum for details. - def getChargeTargetVoltage(self) -> int: - val = super().readRegister(_AXP192_CHARGE1)[0] - return (val & 0x60) >> 5 - - # @brief Set charge current settings. - # @retval See _AXP192_chg_curr_t enum for details. - - def setChargerConstantCurr(self, opt: int) -> bool: - if not 0 <= opt <= 15: - raise ValueError( - "Charger current must be a value within 0-15!") - val = super().readRegister(_AXP192_CHARGE1)[0] - val &= 0xF0 - super().writeRegister(_AXP192_CHARGE1, val | opt) - - # @brief Get charge current settings. - # @retval See _AXP192_chg_curr_t enum for details. - def getChargerConstantCurr(self) -> int: - val = super().readRegister(_AXP192_CHARGE1)[0] & 0x0F - return val - - def setChargerTerminationCurr(self, opt: int) -> None: - if opt == self.XPOWERS_AXP192_CHG_ITERM_LESS_10_PERCENT: - super().clrRegisterBit(_AXP192_CHARGE1, 0) - elif opt == self.XPOWERS_AXP192_CHG_ITERM_LESS_15_PERCENT: - super().setRegisterBit(_AXP192_CHARGE1, 0) - - def getChargerTerminationCurr(self) -> int: - return super().getRegisterBit(_AXP192_CHARGE1, 4) - - def setPrechargeTimeout(self, opt: int): - val = super().readRegister(_AXP192_CHARGE2)[0] - val &= 0x3F - super().writeRegister(_AXP192_CHARGE2, val | (opt << 6)) - - # External channel charge current setting,Range:300~1000mA - def setChargerExternChannelCurr(self, milliampere: int) -> None: - if milliampere % _AXP192_CHG_EXT_CURR_STEP: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_CHG_EXT_CURR_STEP) - if milliampere < _AXP192_CHG_EXT_CURR_MIN: - raise ValueError("Mistake ! The minimum external path charge current setting is: %umA" % - _AXP192_CHG_EXT_CURR_MIN) - elif milliampere > _AXP192_CHG_EXT_CURR_MAX: - raise ValueError("Mistake ! The maximum external channel charge current setting is: %umA" % - _AXP192_CHG_EXT_CURR_MAX) - val = super().readRegister(_AXP192_CHARGE2)[0] - val &= 0xC7 - val |= (int)((milliampere - _AXP192_CHG_EXT_CURR_MIN) / - _AXP192_CHG_EXT_CURR_STEP) - super().writeRegister(_AXP192_CHARGE2, val) - - def enableChargerExternChannel(self) -> None: - super().setRegisterBit(_AXP192_CHARGE2, 2) - - def disableChargerExternChannel(self) -> None: - super().clrRegisterBit(_AXP192_CHARGE2, 2) - - # Timeout setting in constant current mode - def setChargerConstantTimeout(self, opt: int) -> None: - val = super().readRegister(_AXP192_CHARGE2)[0] - val &= 0xFC - super().writeRegister(_AXP192_CHARGE2, val | opt) - - def enableBackupBattCharger(self) -> None: - super().setRegisterBit(_AXP192_BACKUP_CHG, 7) - - def disableBackupBattCharger(self) -> None: - super().clrRegisterBit(_AXP192_BACKUP_CHG, 7) - - def isEnableBackupCharger(self) -> bool: - return bool(super().getRegisterBit(_AXP192_BACKUP_CHG, 7)) - - def setBackupBattChargerVoltage(self, opt: int) -> int: - val = super().readRegister(_AXP192_BACKUP_CHG)[0] - val &= 0x9F - super().writeRegister(_AXP192_BACKUP_CHG, val | (opt << 5)) - - def setBackupBattChargerCurr(self, opt: int): - val = super().readRegister(_AXP192_BACKUP_CHG)[0] - val &= 0xFC - super().writeRegister(_AXP192_BACKUP_CHG, val | opt) - - # Temperature - def getTemperature(self) -> float: - return super().readRegisterH8L4(_AXP192_INTERNAL_TEMP_H8, _AXP192_INTERNAL_TEMP_L4) * _AXP192_INTERNAL_TEMP_STEP - _AXP192_INERNAL_TEMP_OFFSET - - def enableTemperatureMeasure(self) -> None: - super().setRegisterBit(_AXP192_ADC_EN2, 7) - - def disableTemperatureMeasure(self) -> None: - super().clrRegisterBit(_AXP192_ADC_EN2, 7) - - # Power control LDOio functions - def isEnableLDOio(self) -> bool: - return bool(super().readRegister(_AXP192_GPIO0_CTL)[0] & 0x02) - - def enableLDOio(self) -> None: - val = super().readRegister(_AXP192_GPIO0_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO0_CTL, val | 0x02) - - def disableLDOio(self) -> None: - val = super().readRegister(_AXP192_GPIO0_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO0_CTL, val) - - def setLDOioVoltage(self, millivolt: int) -> None: - if millivolt % _AXP192_LDOIO_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_LDOIO_VOL_STEPS) - if millivolt < _AXP192_LDOIO_VOL_MIN: - raise ValueError("Mistake ! LDOIO minimum output voltage is %umV" % - _AXP192_LDOIO_VOL_MIN) - elif millivolt > _AXP192_LDOIO_VOL_MAX: - raise ValueError("Mistake ! LDOIO maximum output voltage is %umV" % - _AXP192_LDOIO_VOL_MAX) - val = super().readRegister(_AXP192_GPIO0_VOL)[0] - val |= ((int)((millivolt - _AXP192_LDOIO_VOL_MIN) / - _AXP192_LDOIO_VOL_STEPS) << 4) - super().writeRegister(_AXP192_GPIO0_VOL, val) - - def getLDOioVoltage(self) -> int: - val = super().readRegister(_AXP192_GPIO0_VOL)[0] - val >>= 4 - val *= _AXP192_LDOIO_VOL_STEPS - val += _AXP192_LDOIO_VOL_MIN - return val - - # Power control LDO2 functions - def isEnableLDO2(self) -> bool: - return bool(super().getRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 2)) - - def enableLDO2(self) -> None: - super().setRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 2) - - def disableLDO2(self) -> None: - super().clrRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 2) - - def setLDO2Voltage(self, millivolt: int) -> None: - if millivolt % _AXP192_LDO2_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_LDO2_VOL_STEPS) - if millivolt < _AXP192_LDO2_VOL_MIN: - raise ValueError("Mistake ! LDO2 minimum output voltage is %umV" % - _AXP192_LDO2_VOL_MIN) - elif millivolt > _AXP192_LDO2_VOL_MAX: - raise ValueError("Mistake ! LDO2 maximum output voltage is %umV" % - _AXP192_LDO2_VOL_MAX) - val = super().readRegister(_AXP192_LDO23OUT_VOL)[0] - val &= 0x0F - super().writeRegister(_AXP192_LDO23OUT_VOL, val | ((int)((millivolt - - _AXP192_LDO2_VOL_MIN) / _AXP192_LDO2_VOL_STEPS) << _AXP192_LDO2_VOL_BIT_MASK)) - - def getLDO2Voltage(self) -> int: - val = super().readRegister(_AXP192_LDO23OUT_VOL)[0] & 0xF0 - return (val >> _AXP192_LDO2_VOL_BIT_MASK) * _AXP192_LDO2_VOL_STEPS + _AXP192_LDO2_VOL_MIN - - # Power control LDO3 functions - - def isEnableLDO3(self) -> bool: - return bool(super().getRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 3)) - - def enableLDO3(self) -> None: - super().setRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 3) - - def disableLDO3(self) -> None: - super().clrRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 3) - - def setLDO3Voltage(self, millivolt: int) -> None: - if millivolt % _AXP192_LDO3_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_LDO3_VOL_STEPS) - if millivolt < _AXP192_LDO3_VOL_MIN: - raise ValueError("Mistake ! LDO3 minimum output voltage is %umV" % - _AXP192_LDO3_VOL_MIN) - elif millivolt > _AXP192_LDO3_VOL_MAX: - raise ValueError("Mistake ! LDO3 maximum output voltage is %umV" % - _AXP192_LDO3_VOL_MAX) - val = super().readRegister(_AXP192_LDO23OUT_VOL)[0] & 0xF0 - super().writeRegister(_AXP192_LDO23OUT_VOL, val | (int)( - (millivolt - _AXP192_LDO3_VOL_MIN) / _AXP192_LDO3_VOL_STEPS)) - - def getLDO3Voltage(self) -> int: - val = super().readRegister(_AXP192_LDO23OUT_VOL)[0] - val &= 0x0F - return (val * _AXP192_LDO3_VOL_STEPS) + _AXP192_LDO3_VOL_MIN - - # Power control DCDC1 functions - def setDC1PwmMode(self) -> None: - val = super().readRegister(_AXP192_DCDC_MODESET)[0] & 0xF7 - super().writeRegister(_AXP192_DCDC_MODESET, val | 0x08) - - def setDC1AutoMode(self) -> None: - val = super().readRegister(_AXP192_DCDC_MODESET)[0] & 0xF7 - super().writeRegister(_AXP192_DCDC_MODESET, val) - - def isEnableDC1(self) -> bool: - return bool(super().getRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 0)) - - def enableDC1(self) -> None: - super().setRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 0) - - def disableDC1(self) -> None: - super().clrRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 0) - - def setDC1Voltage(self, millivolt) -> None: - if millivolt % _AXP192_DC1_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_DC1_VOL_STEPS) - if millivolt < _AXP192_DC1_VOL_STEPS: - raise ValueError("Mistake ! DCDC1 minimum output voltage is %umV" % - _AXP192_DC1_VOL_STEPS) - elif millivolt > _AXP192_DC1_VOL_MAX: - raise ValueError("Mistake ! DCDC1 maximum output voltage is %umV" % - _AXP192_DC1_VOL_MAX) - val = super().readRegister(_AXP192_DC1_VLOTAGE)[0] - val &= 0x80 - val |= (int)((millivolt - _AXP192_DC1_VOL_MIN) / - _AXP192_DC1_VOL_STEPS) - super().writeRegister(_AXP192_DC1_VLOTAGE, val) - - def getDC1Voltage(self) -> int: - val = super().readRegister(_AXP192_DC1_VLOTAGE)[0] & 0x7F - return val * _AXP192_DC1_VOL_STEPS + _AXP192_DC1_VOL_MIN - - # Power control DCDC2 functions - - def setDC2PwmMode(self) -> None: - val = super().readRegister(_AXP192_DCDC_MODESET)[0] & 0xFB - super().writeRegister(_AXP192_DCDC_MODESET, val | 0x04) - - def setDC2AutoMode(self) -> None: - val = super().readRegister(_AXP192_DCDC_MODESET)[0] & 0xFB - super().writeRegister(_AXP192_DCDC_MODESET, val) - - def enableDC2VRC(self) -> None: - val = super().readRegister(_AXP192_DC2_DVM)[0] - super().writeRegister(_AXP192_DC2_DVM, val | 0x04) - - def disableDC2VRC(self) -> None: - val = super().readRegister(_AXP192_DC2_DVM)[0] - super().writeRegister(_AXP192_DC2_DVM, val & 0xFB) - - def setDC2VRC(self, opts: int) -> None: - if opts > 1: - raise ValueError( - "DCDC VRC a value within 0-1!") - val = super().readRegister(_AXP192_DC2_DVM)[0] & 0xFE - super().writeRegister(_AXP192_DC2_DVM, val | opts) - - def isEnableDC2VRC(self) -> bool: - return (super().readRegister(_AXP192_DC2_DVM)[0] & 0x04) == 0x04 - - def isEnableDC2(self) -> bool: - return bool(super().getRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 4)) - - def enableDC2(self) -> None: - super().setRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 4) - - def disableDC2(self) -> None: - super().clrRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 4) - - def setDC2Voltage(self, millivolt: int) -> None: - if millivolt % _AXP192_DC2_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_DC2_VOL_STEPS) - if millivolt < _AXP192_DC2_VOL_MIN: - raise ValueError("Mistake ! DCDC2 minimum output voltage is %umV" % - _AXP192_DC2_VOL_MIN) - elif millivolt > _AXP192_DC2_VOL_MAX: - raise ValueError("Mistake ! DCDC2 maximum output voltage is %umV" % - _AXP192_DC2_VOL_MAX) - val = super().readRegister(_AXP192_DC2OUT_VOL)[0] - val &= 0x80 - val |= (int)((millivolt - _AXP192_DC2_VOL_MIN) / - _AXP192_DC2_VOL_STEPS) - super().writeRegister(_AXP192_DC2OUT_VOL, val) - - def getDC2Voltage(self) -> int: - val = super().readRegister(_AXP192_DC2OUT_VOL)[0] - return (val * _AXP192_DC2_VOL_STEPS) + _AXP192_DC2_VOL_MIN - - # Power control DCDC3 functions - def setDC3PwmMode(self) -> None: - val = super().readRegister(_AXP192_DCDC_MODESET)[0] & 0xFD - super().writeRegister(_AXP192_DCDC_MODESET, val | 0x02) - - def setDC3AutoMode(self) -> None: - val = super().readRegister(_AXP192_DCDC_MODESET)[0] & 0xFD - super().writeRegister(_AXP192_DCDC_MODESET, val) - - def isEnableDC3(self) -> bool: - return bool(super().getRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 1)) - - def enableDC3(self) -> None: - super().setRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 1) - - def disableDC3(self) -> None: - super().clrRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 1) - - def setDC3Voltage(self, millivolt: int) -> None: - if millivolt % _AXP192_DC3_VOL_STEPS: - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP192_DC3_VOL_STEPS) - if millivolt < _AXP192_DC3_VOL_MIN: - raise ValueError("Mistake ! DCDC3 minimum output voltage is %umV" % - _AXP192_DC3_VOL_MIN) - elif millivolt > _AXP192_DC3_VOL_MAX: - raise ValueError("Mistake ! DCDC3 maximum output voltage is %umV" % - _AXP192_DC3_VOL_MAX) - super().writeRegister(_AXP192_DC3OUT_VOL, (int)( - (millivolt - _AXP192_DC3_VOL_MIN) / _AXP192_DC3_VOL_STEPS)) - - def getDC3Voltage(self) -> int: - val = super().readRegister(_AXP192_DC3OUT_VOL)[0] - return (val * _AXP192_DC3_VOL_STEPS) + _AXP192_DC3_VOL_MIN - - # Power control EXTEN functions - def enableExternalPin(self) -> None: - super().setRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 6) - - def disableExternalPin(self) -> None: - super().clrRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 6) - - def isEnableExternalPin(self) -> bool: - return bool(super().getRegisterBit(_AXP192_LDO23_DC123_EXT_CTL, 6)) - - # Interrupt status functions - # @brief Get the interrupt controller mask value. - # @retval Mask value corresponds to _AXP192_irq_t , - def getIrqStatus(self) -> int: - self.statusRegister = super().readRegister(_AXP192_INTSTS1, 5) - return (self.statusRegister[4]) << 32 |\ - (self.statusRegister[3]) << 24 |\ - (self.statusRegister[2]) << 16 |\ - (self.statusRegister[1]) << 8 |\ - (self.statusRegister[0]) - - # @brief Clear interrupt controller state. - def clearIrqStatus(self) -> None: - for i in range(_AXP192_INTSTS_CNT-1): - super().writeRegister(_AXP192_INTSTS1 + i, 0xFF) - super().writeRegister(_AXP192_INTSTS5, 0xFF) - - # @brief Enable PMU interrupt control mask . - # @ param opt: View the related chip type _AXP192_irq_t enumeration - # parameters in "XPowersParams.hpp" - def enableIRQ(self, opt: int) -> None: - self._setInterruptImpl(opt, True) - - # @brief Disable PMU interrupt control mask . - # @ param opt: View the related chip type _AXP192_irq_t enumeration - # parameters in "XPowersParams.hpp" - def disableIRQ(self, opt: int) -> None: - self._setInterruptImpl(opt, False) - - # IRQ STATUS 0 - def isAcinOverVoltageIrq(self) -> bool: - mask = self.XPOWERS_AXP192_ACIN_OVER_VOL_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isAcinInserIrq(self) -> bool: - mask = self.XPOWERS_AXP192_ACIN_CONNECT_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isAcinRemoveIrq(self) -> bool: - mask = self.XPOWERS_AXP192_ACIN_REMOVED_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isVbusOverVoltageIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_OVER_VOL_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isVbusInsertIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_INSERT_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isVbusRemoveIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_REMOVE_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isVbusLowVholdIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_VHOLD_LOW_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - # IRQ STATUS 1 - - def isBatInsertIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BAT_INSERT_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBatRemoveIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BAT_REMOVE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBattEnterActivateIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BATT_ACTIVATE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBattExitActivateIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BATT_EXIT_ACTIVATE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBatChargeStartIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BAT_CHG_START_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBatChargeDoneIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BAT_CHG_DONE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBattTempHighIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BATT_OVER_TEMP_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBattTempLowIrq(self) -> bool: - mask = self.XPOWERS_AXP192_BATT_LOW_TEMP_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - # IRQ STATUS 2 - def isChipOverTemperatureIrq(self) -> bool: - mask = self.XPOWERS_AXP192_CHIP_TEMP_HIGH_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isChargingCurrentLessIrq(self) -> bool: - mask = self.XPOWERS_AXP192_CHARGE_LOW_CUR_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isDC1VoltageLessIrq(self) -> bool: - mask = self.XPOWERS_AXP192_DC1_LOW_VOL_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isDC2VoltageLessIrq(self) -> bool: - mask = self.XPOWERS_AXP192_DC2_LOW_VOL_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isDC3VoltageLessIrq(self) -> bool: - mask = self.XPOWERS_AXP192_DC3_LOW_VOL_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isPekeyShortPressIrq(self) -> bool: - mask = self.XPOWERS_AXP192_PKEY_SHORT_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isPekeyLongPressIrq(self) -> bool: - mask = self.XPOWERS_AXP192_PKEY_LONG_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - # IRQ STATUS 3 - - def isNOEPowerOnIrq(self) -> bool: - mask = self.XPOWERS_AXP192_NOE_ON_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - def isNOEPowerDownIrq(self) -> bool: - mask = self.XPOWERS_AXP192_NOE_OFF_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - def isVbusEffectiveIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_VAILD_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - def isVbusInvalidIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_INVALID_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - def isVbusSessionIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_SESSION_AB_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - def isVbusSessionEndIrq(self) -> bool: - mask = self.XPOWERS_AXP192_VBUS_SESSION_END_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - def isLowVoltageLevel2Irq(self) -> bool: - mask = self.XPOWERS_AXP192_APS_LOW_VOL_LEVEL_IRQ >> 24 - if self.intRegister[3] & mask: - return super()._IS_BIT_SET(self.statusRegister[3], mask) - else: - return False - - # IRQ STATUS 4 - def isWdtExpireIrq(self) -> bool: - mask = self.XPOWERS_AXP192_TIMER_TIMEOUT_IRQ >> 32 - if self.intRegister[4] & mask: - return super()._IS_BIT_SET(self.statusRegister[4], mask) - else: - return False - - def isGpio2EdgeTriggerIrq(self) -> bool: - mask = self.XPOWERS_AXP192_GPIO2_EDGE_TRIGGER_IRQ >> 32 - if self.intRegister[4] & mask: - return super()._IS_BIT_SET(self.statusRegister[4], mask) - else: - return False - - def isGpio1EdgeTriggerIrq(self) -> bool: - mask = self.XPOWERS_AXP192_GPIO1_EDGE_TRIGGER_IRQ >> 32 - if self.intRegister[4] & mask: - return super()._IS_BIT_SET(self.statusRegister[4], mask) - else: - return False - - def isGpio0EdgeTriggerIrq(self) -> bool: - mask = self.XPOWERS_AXP192_GPIO0_EDGE_TRIGGER_IRQ >> 32 - if self.intRegister[4] & mask: - return super()._IS_BIT_SET(self.statusRegister[4], mask) - else: - return False - - # ADC Functions - def enableBattDetection(self) -> None: - super().setRegisterBit(_AXP192_OFF_CTL, 6) - - def disableBattDetection(self) -> None: - super().clrRegisterBit(_AXP192_OFF_CTL, 6) - - def enableVbusVoltageMeasure(self) -> None: - self._setSignalCaptureImpl( - _MONITOR_USB_CURRENT | _MONITOR_USB_VOLTAGE, True) - - def disableVbusVoltageMeasure(self) -> None: - self._setSignalCaptureImpl( - _MONITOR_USB_CURRENT | _MONITOR_USB_VOLTAGE, False) - - def enableBattVoltageMeasure(self) -> None: - self._setSignalCaptureImpl( - _MONITOR_BAT_CURRENT | _MONITOR_BAT_VOLTAGE, True) - - def disableBattVoltageMeasure(self) -> None: - self._setSignalCaptureImpl( - _MONITOR_BAT_CURRENT | _MONITOR_BAT_VOLTAGE, False) - - def enableSystemVoltageMeasure(self) -> None: - self._setSignalCaptureImpl(_MONITOR_APS_VOLTAGE, True) - - def disableSystemVoltageMeasure(self) -> None: - self._setSignalCaptureImpl(_MONITOR_APS_VOLTAGE, False) - - def enableTSPinMeasure(self) -> None: - self._setSignalCaptureImpl(_MONITOR_TS_PIN, True) - - def disableTSPinMeasure(self) -> None: - self._setSignalCaptureImpl(_MONITOR_TS_PIN, False) - - def enableAdcChannel(self, opts: int) -> None: - self._setSignalCaptureImpl(opts, True) - - def disableAdcChannel(self, opts: int) -> None: - self._setSignalCaptureImpl(opts, False) - - def getVbusVoltage(self) -> int: - if not self.isVbusIn(): - return 0 - return super().readRegisterH8L4(_AXP192_VBUS_VOL_H8, - _AXP192_VBUS_VOL_L4 - ) * _AXP192_VBUS_VOLTAGE_STEP - - def getVbusCurrent(self) -> float: - if not self.isVbusIn(): - return 0 - return super().readRegisterH8L4(_AXP192_VBUS_CUR_H8, - _AXP192_VBUS_CUR_L4 - ) * _AXP192_VBUS_CUR_STEP - - def getBattVoltage(self) -> float: - if not self.isBatteryConnect(): - return 0 - return super().readRegisterH8L4(_AXP192_BAT_AVERVOL_H8, - _AXP192_BAT_AVERVOL_L4 - ) * _AXP192_BATT_VOLTAGE_STEP - - def getBattDischargeCurrent(self) -> float: - if not self.isBatteryConnect(): - return 0 - return super().readRegisterH8L5(_AXP192_BAT_AVERDISCHGCUR_H8, - _AXP192_BAT_AVERDISCHGCUR_L5) * _AXP192_BATT_DISCHARGE_CUR_STEP - - def getAcinVoltage(self) -> float: - if not self.isAcinIn(): - return 0 - return super().readRegisterH8L4(_AXP192_ACIN_VOL_H8, _AXP192_ACIN_VOL_L4) * _AXP192_ACIN_VOLTAGE_STEP - - def getAcinCurrent(self) -> float: - if not self.isAcinIn(): - return 0 - return super().readRegisterH8L4(_AXP192_ACIN_CUR_H8, _AXP192_ACIN_CUR_L4) * _AXP192_ACIN_CUR_STEP - - def getSystemVoltage(self) -> float: - return super().readRegisterH8L4(_AXP192_APS_AVERVOL_H8, _AXP192_APS_AVERVOL_L4) * _AXP192_APS_VOLTAGE_STEP - - # Timer Control - def setTimerout(self, minute: int) -> None: - super().writeRegister(_AXP192_TIMER_CTL, 0x80 | minute) - - def disableTimer(self) -> None: - super().writeRegister(_AXP192_TIMER_CTL, 0x80) - - def clearTimerFlag(self) -> None: - super().setRegisterBit(_AXP192_TIMER_CTL, 7) - - # Data Buffer - def writeDataBuffer(self, data: list, size: int) -> None: - if size > _AXP192_DATA_BUFFER_SIZE: - raise ValueError('Out of range!') - for i in range(size): - super().writeRegister(_AXP192_DATA_BUFFER1 + i, data[i]) - - def readDataBuffer(self, size: int) -> list: - if size > _AXP192_DATA_BUFFER_SIZE: - raise ValueError('Out of range!') - data = [0]*size - for i in range(size): - data[i] = super().readRegister(_AXP192_DATA_BUFFER1 + i)[0] - return list(data) - - # Charge led functions - # @brief Set charging led mode. - # @retval See xpowers_chg_led_mode_t enum for details. - def setChargingLedMode(self, mode: int) -> None: - range = [self.XPOWERS_CHG_LED_OFF, self.XPOWERS_CHG_LED_BLINK_1HZ, - self.XPOWERS_CHG_LED_BLINK_4HZ, self.XPOWERS_CHG_LED_ON] - if mode in range: - val = super().readRegister(_AXP192_OFF_CTL)[0] - val &= 0xC7 - val |= 0x08 # use manual ctrl - val |= (mode << 4) - super().writeRegister(_AXP192_OFF_CTL, val) - else: - super().clrRegisterBit(_AXP192_OFF_CTL, 3) - - def getChargingLedMode(self) -> int: - if not bool(super().getRegisterBit(_AXP192_OFF_CTL, 3)): - return self.XPOWERS_CHG_LED_CTRL_CHG - val = super().readRegister(_AXP192_OFF_CTL)[0] - val &= 0x30 - return val >> 4 - - # Coulomb counter control - def enableCoulomb(self) -> None: - super().setRegisterBit(_AXP192_COULOMB_CTL, 7) - - def disableCoulomb(self) -> None: - super().clrRegisterBit(_AXP192_COULOMB_CTL, 7) - - def stopCoulomb(self) -> None: - super().setRegisterBit(_AXP192_COULOMB_CTL, 6) - - def clearCoulomb(self) -> None: - super().setRegisterBit(_AXP192_COULOMB_CTL, 5) - - def getBattChargeCoulomb(self) -> int: - data = [0]*4 - data[0] = super().readRegister(_AXP192_BAT_CHGCOULOMB3)[0] - data[1] = super().readRegister(_AXP192_BAT_CHGCOULOMB2)[0] - data[2] = super().readRegister(_AXP192_BAT_CHGCOULOMB1)[0] - data[3] = super().readRegister(_AXP192_BAT_CHGCOULOMB0)[0] - return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3] - - def getBattDischargeCoulomb(self) -> int: - data = [0]*4 - data[0] = super().readRegister(_AXP192_BAT_DISCHGCOULOMB3)[0] - data[1] = super().readRegister(_AXP192_BAT_DISCHGCOULOMB2)[0] - data[2] = super().readRegister(_AXP192_BAT_DISCHGCOULOMB1)[0] - data[3] = super().readRegister(_AXP192_BAT_DISCHGCOULOMB0)[0] - return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3] - - def getAdcSamplingRate(self) -> int: - val = super().readRegister(_AXP192_ADC_SPEED)[0] - return 25 * math.pow(2, (val & 0xC0) >> 6) - - def getCoulombData(self) -> float: - charge = self.getBattChargeCoulomb() - discharge = self.getBattDischargeCoulomb() - rate = self.getAdcSamplingRate() - return 65536.0 * 0.5 * (charge - discharge) / 3600.0 / rate - - # GPIO control functions - def getBatteryChargeCurrent(self) -> float: - return super().readRegisterH8L5( - _AXP192_BAT_AVERCHGCUR_H8, - _AXP192_BAT_AVERCHGCUR_L5 - ) * _AXP192_BATT_CHARGE_CUR_STEP - - def getGpio0Voltage(self) -> int: - return super().readRegisterH8L4(_AXP192_GPIO0_VOL_ADC_H8, _AXP192_GPIO0_VOL_ADC_L4) * _AXP192_GPIO0_STEP * 1000 - - def getGpio1Voltage(self) -> int: - return super().readRegisterH8L4(_AXP192_GPIO1_VOL_ADC_H8, _AXP192_GPIO1_VOL_ADC_L4) * _AXP192_GPIO1_STEP * 1000 - - def pwmSetup(self, channel: int, freq: int, duty: int) -> None: - # PWM输出频率 = 2.25MHz / (X+1) / Y1 - # PWM输出占空比 = Y2 / Y1 - if channel == 0: - super().writeRegister(_AXP192_PWM1_FREQ_SET, freq) - super().writeRegister(_AXP192_PWM1_DUTY_SET1, duty >> 8) - super().writeRegister(_AXP192_PWM1_DUTY_SET2, duty & 0xFF) - elif channel == 1: - super().writeRegister(_AXP192_PWM2_FREQ_SET, freq) - super().writeRegister(_AXP192_PWM2_DUTY_SET1, duty >> 8) - super().writeRegister(_AXP192_PWM2_DUTY_SET2, duty & 0xFF) - - def pwmEnable(self, channel) -> None: - if channel == 0: - val = super().readRegister(_AXP192_GPIO1_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO1_CTL, val | 0x02) - elif channel == 1: - val = super().readRegister(_AXP192_GPIO2_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO2_CTL, val | 0x02) - - def getBatteryPercent(self) -> int: - if not self.isBatteryConnect(): - return -1 - table = [3000, 3650, 3700, 3740, 3760, 3795, - 3840, 3910, 3980, 4070, 4150] - voltage = self.getBattVoltage() - if voltage < table[0]: - return 0 - for i in range(11): - if voltage < table[i]: - return i * 10 - (10 * (int)(table[i] - voltage)) / (int)(table[i] - table[i - 1]) - return 100 - - def getChipID(self) -> int: - return super().readRegister(_AXP192_IC_TYPE)[0] - - # GPIO setting - - def pinMode(self, pin: int, mode: int) -> None: - if pin == self.PMU_GPIO0: - ''' - * 000: NMOS open-drain output - * 001: Universal input function - * 010: Low noise LDO - * 011: reserved - * 100: ADC input - * 101: Low output - * 11X: Floating - ''' - if mode == self.INPUT or mode == self.INPUT_PULLDOWN: - if self.gpio[pin].mode != self.INPUT: - self.gpio[pin].mode = self.INPUT - val = super().readRegister(_AXP192_GPIO0_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO0_CTL, val | 0x01) - # Set pull-down mode - val = super().readRegister(_AXP192_GPIO012_PULLDOWN)[0] & 0xFE - if mode == self.INPUT_PULLDOWN: - super().writeRegister(_AXP192_GPIO012_PULLDOWN, val | 0x01) - else: - super().writeRegister(_AXP192_GPIO012_PULLDOWN, val) - - elif pin == self.PMU_GPIO1: - ''' - * 000: NMOS open-drain output - * 001: Universal input function - * 010: PWM1 output, high level is VINT, not Can add less than 100K pull-down resistance - * 011: reserved - * 100: ADC input - * 101: Low output - * 11X: Floating - ''' - if mode == self.INPUT or mode == self.INPUT_PULLDOWN: - if self.gpio[pin].mode != self.INPUT: - self.gpio[pin].mode = self.INPUT - val = super().readRegister(_AXP192_GPIO1_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO1_CTL, val | 0x01) - # Set pull-down mode - val = super().readRegister(_AXP192_GPIO012_PULLDOWN)[0] & 0xFD - if mode == self.INPUT_PULLDOWN: - super().writeRegister(_AXP192_GPIO012_PULLDOWN, val | 0x02) - else: - super().writeRegister(_AXP192_GPIO012_PULLDOWN, val) - - elif pin == self.PMU_GPIO2: - ''' - * 000: NMOS open-drain output - * 001: Universal input function - * 010: PWM2 output, high level is VINT, not Can add less than 100K pull-down resistance - * 011: reserved - * 100: ADC input - * 101: Low output - * 11X: Floating - ''' - if mode == self.INPUT or mode == self.INPUT_PULLDOWN: - if self.gpio[pin].mode != self.INPUT: - self.gpio[pin].mode = self.INPUT - val = super().readRegister(_AXP192_GPIO2_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO2_CTL, val | 0x01) - - # Set pull-down mode - val = super().readRegister(_AXP192_GPIO012_PULLDOWN)[0] & 0xFB - if mode == self.INPUT_PULLDOWN: - super().writeRegister(_AXP192_GPIO012_PULLDOWN, val | 0x04) - else: - super().writeRegister(_AXP192_GPIO012_PULLDOWN, val) - elif pin == self.PMU_GPIO3: - ''' - * 00: External charging control - * 01: NMOS open-drain output port 3 - * 10: Universal input port 3 - * 11: ADC input - ''' - if mode == self.INPUT: - if self.gpio[pin].mode != self.INPUT: - self.gpio[pin].mode = self.INPUT - val = super().readRegister(_AXP192_GPIO34_CTL)[0] & 0xFC - super().writeRegister(_AXP192_GPIO34_CTL, val | 0x82) - - elif pin == self.PMU_GPIO4: - ''' - * 00: External charging control - * 01: NMOS open-drain output port 4 - * 10: Universal input port 4 - * 11: undefined - ''' - if mode == self.INPUT: - if self.gpio[pin].mode != self.INPUT: - self.gpio[pin].mode = self.INPUT - val = super().readRegister(_AXP192_GPIO34_CTL)[0] & 0xF3 - super().writeRegister(_AXP192_GPIO34_CTL, val | 0x88) - - elif pin == self.PMU_GPIO5: - if mode == self.INPUT: - if self.gpio[pin].mode != self.INPUT: - self.gpio[pin].mode = self.INPUT - - val = super().readRegister(_AXP192_GPIO5_CTL)[0] & 0xBF - super().writeRegister(_AXP192_GPIO5_CTL, val | 0x40) - else: - print('gpio is invalid') - - def digitalRead(self, pin: int) -> bool: - if pin == self.PMU_GPIO0: - return bool(super().getRegisterBit(_AXP192_GPIO012_SIGNAL, 4)) - elif pin == self.PMU_GPIO1: - return bool(super().getRegisterBit(_AXP192_GPIO012_SIGNAL, 5)) - elif pin == self.PMU_GPIO2: - return bool(super().getRegisterBit(_AXP192_GPIO012_SIGNAL, 6)) - elif pin == self.PMU_GPIO3: - return bool(super().getRegisterBit(_AXP192_GPIO34_SIGNAL, 4)) - elif pin == self.PMU_GPIO4: - return bool(super().getRegisterBit(_AXP192_GPIO34_SIGNAL, 5)) - elif pin == self.PMU_GPIO5: - return bool(super().getRegisterBit(_AXP192_GPIO5_CTL, 4)) - else: - print('gpio is invalid') - return 0 - - def digitalWrite(self, pin: int, val: int) -> None: - if pin == self.PMU_GPIO0: - if self.gpio[pin].mode != self.OUTPUT: - self.gpio[pin].mode = self.OUTPUT - reg = super().readRegister(_AXP192_GPIO0_CTL)[0] & 0xF8 - val = (reg, (reg | 0x05))[val] - print(bin(val)) - super().writeRegister(_AXP192_GPIO0_CTL, val) - - elif pin == self.PMU_GPIO1: - if self.gpio[pin].mode != self.OUTPUT: - self.gpio[pin].mode = self.OUTPUT - reg = super().readRegister(_AXP192_GPIO1_CTL)[0] & 0xF8 - val = (reg, (reg | 0x05))[val] - super().writeRegister(_AXP192_GPIO1_CTL, val) - - elif pin == self.PMU_GPIO2: - if self.gpio[pin].mode != self.OUTPUT: - self.gpio[pin].mode = self.OUTPUT - reg = super().readRegister(_AXP192_GPIO2_CTL)[0] & 0xF8 - val = (reg, (reg | 0x05))[val] - super().writeRegister(_AXP192_GPIO2_CTL, val) - - elif pin == self.PMU_GPIO3: - if self.gpio[pin].mode != self.OUTPUT: - self.gpio[pin].mode = self.OUTPUT - reg = super().readRegister(_AXP192_GPIO34_CTL)[0] & 0xFC - super().writeRegister(_AXP192_GPIO34_CTL, reg | 0x01) - - reg = super().readRegister(_AXP192_GPIO34_SIGNAL)[0] & 0xF7 - val = (reg, (reg | 0x01))[val] - super().writeRegister(_AXP192_GPIO34_SIGNAL, val) - - elif pin == self.PMU_GPIO4: - if self.gpio[pin].mode != self.OUTPUT: - self.gpio[pin].mode = self.OUTPUT - reg = super().readRegister(_AXP192_GPIO34_CTL)[0] & 0xF3 - super().writeRegister(_AXP192_GPIO34_CTL, reg | 0x04) - - reg = super().readRegister(_AXP192_GPIO34_SIGNAL)[0] & 0xEF - val = (reg, (reg | 0x01))[val] - super().writeRegister(_AXP192_GPIO34_SIGNAL, val) - - elif pin == self.PMU_GPIO5: - if self.gpio[pin].mode != self.OUTPUT: - self.gpio[pin].mode = self.OUTPUT - reg = super().readRegister(_AXP192_GPIO5_CTL)[0] & 0xBF - super().writeRegister(_AXP192_GPIO5_CTL, reg) - - reg = super().readRegister(_AXP192_GPIO5_CTL)[0] & 0xDF - val = (reg, (reg | 0x01))[val] - super().writeRegister(_AXP192_GPIO5_CTL, val) - else: - print('gpio is invalid') - - # ! Need FIX - def analogRead(self, pin: int) -> int: - if pin == self.PMU_GPIO0: - if self.gpio[pin].mode != self.ANALOG: - # Enable GPIO ADC Function - val = super().readRegister(_AXP192_GPIO0_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO0_CTL, val | 0x04) - - # Enable ADC2 / GPIO0 - # val = super().readRegister(_AXP192_ADC_EN2)[0] | 0x08 - # super().writeRegister(_AXP192_ADC_EN2, val ) - super().setRegisterBit(_AXP192_ADC_EN2, 3) - - # Set adc input range 0~2.0475V - super().clrRegisterBit(_AXP192_ADC_INPUTRANGE, 0) - self.gpio[pin].mode = self.ANALOG - - return super().readRegisterH8L4(_AXP192_GPIO0_VOL_ADC_H8, _AXP192_GPIO0_VOL_ADC_L4) - - elif pin == self.PMU_GPIO1: - if self.gpio[pin].mode != self.ANALOG: - # Enable GPIO ADC Function - val = super().readRegister(_AXP192_GPIO1_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO1_CTL, val | 0x04) - - # Enable ADC2 / GPIO1 - # val = super().readRegister(_AXP192_ADC_EN2)[0] | 0x04 - # super().writeRegister(_AXP192_ADC_EN2, val ) - super().setRegisterBit(_AXP192_ADC_EN2, 2) - - # Set adc input range 0~2.0475V - super().clrRegisterBit(_AXP192_ADC_INPUTRANGE, 1) - self.gpio[pin].mode = self.ANALOG - - return super().readRegisterH8L4(_AXP192_GPIO1_VOL_ADC_H8, _AXP192_GPIO1_VOL_ADC_L4) - - elif pin == self.PMU_GPIO2: - if self.gpio[pin].mode != self.ANALOG: - # Enable GPIO ADC Function - val = super().readRegister(_AXP192_GPIO1_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO1_CTL, val | 0x04) - # Enable ADC2 / GPIO1 - # val = super().readRegister(_AXP192_ADC_EN2)[0] | 0x02 - # super().writeRegister(_AXP192_ADC_EN2, val ) - super().setRegisterBit(_AXP192_ADC_EN2, 1) - - # Set adc input range 0~2.0475V - super().clrRegisterBit(_AXP192_ADC_INPUTRANGE, 2) - self.gpio[pin].mode = self.ANALOG - - return super().readRegisterH8L4(_AXP192_GPIO2_VOL_ADC_H8, _AXP192_GPIO2_VOL_ADC_L4) - - elif pin == self.PMU_GPIO3: - if self.gpio[pin].mode != self.ANALOG: - # Enable GPIO ADC Function - val = super().readRegister(_AXP192_GPIO1_CTL)[0] & 0xF8 - super().writeRegister(_AXP192_GPIO1_CTL, val | 0x04) - - # Enable ADC2 / GPIO1 - super().setRegisterBit(_AXP192_ADC_EN2, 0) - - # Set adc input range 0~2.0475V - super().clrRegisterBit(_AXP192_ADC_INPUTRANGE, 3) - self.gpio[pin].mode = self.ANALOG - - return super().readRegisterH8L4(_AXP192_GPIO3_VOL_ADC_H8, _AXP192_GPIO3_VOL_ADC_L4) - - elif pin == self.PMU_TS_PIN: - if self.gpio[pin].mode != self.ANALOG: - # Enable TS PIN ADC Function - super().setRegisterBit(_AXP192_ADC_SPEED, 2) - # val = super().readRegister(_AXP192_ADC_SPEED)[0] & 0xFB - # super().writeRegister(_AXP192_ADC_SPEED, val | 0x04) - self.gpio[pin].mode = self.ANALOG - - return super().readRegisterH8L4(_AXP192_TS_IN_H8, _AXP192_TS_IN_L4) - else: - print('gpio is invalid') - - return 0 - - # Sleep function - - def enableSleep(self) -> None: - super().setRegisterBit(_AXP192_VOFF_SET, 3) - - # Pekey function - # @brief Set the PEKEY power-on long press time. - # @param opt: See xpowers_press_on_time_t enum for details. - def setPowerKeyPressOnTime(self, opt: int) -> None: - val = super().readRegister(_AXP192_POK_SET)[0] - super().writeRegister(_AXP192_POK_SET, (val & 0x3F) | (opt << 6)) - - # @brief Get the PEKEY power-on long press time. - # @retval See xpowers_press_on_time_t enum for details. - - def getPowerKeyPressOnTime(self) -> int: - val = super().readRegister(_AXP192_POK_SET)[0] - return (val & 0xC0) >> 6 - - # @brief Set the PEKEY power-off long press time. - # @ param opt: See xpowers_press_off_time_t enum for details. - - def setPowerKeyPressOffTime(self, opt: int) -> None: - val = super().readRegister(_AXP192_POK_SET)[0] - super().writeRegister(_AXP192_POK_SET, (val & 0xFC) | opt) - - # @brief Get the PEKEY power-off long press time. - # @retval See xpowers_press_off_time_t enum for details. - def getPowerKeyPressOffTime(self) -> int: - val = super().readRegister(_AXP192_POK_SET)[0] - return (val & 0x03) - - def setPowerKeyLongPressOnTime(self, opt: int) -> None: - val = super().readRegister(_AXP192_POK_SET)[0] - super().writeRegister(_AXP192_POK_SET, (val & 0xCF) | (opt << 4)) - - def enablePowerKeyLongPressPowerOff(self) -> None: - super().setRegisterBit(_AXP192_POK_SET, 3) - - def disablePowerKeyLongPressPowerOff(self) -> None: - super().clrRegisterBit(_AXP192_POK_SET, 3) - - # Interrupt control functions - def _setInterruptImpl(self, opts: int, enable: bool) -> None: - # log_d("%s %s - 0x%llx\n", __func__, enable ? "ENABLE": "DISABLE", opts) - if opts & 0xFF: - value = opts & 0xFF - data = super().readRegister(_AXP192_INTEN1)[0] - self.intRegister[0] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP192_INTEN1, self.intRegister[0]) - - if opts & 0xFF00: - value = opts >> 8 - data = super().readRegister(_AXP192_INTEN2)[0] - self.intRegister[1] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP192_INTEN2, self.intRegister[1]) - - if opts & 0xFF0000: - value = opts >> 16 - data = super().readRegister(_AXP192_INTEN3)[0] - self.intRegister[2] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP192_INTEN3, self.intRegister[2]) - - if opts & 0xFF000000: - value = opts >> 24 - data = super().readRegister(_AXP192_INTEN4)[0] - self.intRegister[3] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP192_INTEN4, self.intRegister[3]) - - if opts & 0xFF00000000: - value = opts >> 32 - data = super().readRegister(_AXP192_INTEN5)[0] - self.intRegister[4] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP192_INTEN5, self.intRegister[4]) - - # Signal Capture control functions - def _setSignalCaptureImpl(self, opts: int, enable: bool) -> None: - if opts & 0xFF: - value = super().readRegister(_AXP192_ADC_EN1)[0] - value = ((value & (~opts)), (value | opts))[enable] - super().writeRegister(_AXP192_ADC_EN1, value) - - if opts & 0xFF00: - opts >>= 8 - value = super().readRegister(_AXP192_ADC_EN2)[0] - value = ((value & (~opts)), (value | opts))[enable] - super().writeRegister(_AXP192_ADC_EN2, value) diff --git a/libdeps/XPowersLib/Micropython/src/AXP2101.py b/libdeps/XPowersLib/Micropython/src/AXP2101.py deleted file mode 100644 index fe3bac4..0000000 --- a/libdeps/XPowersLib/Micropython/src/AXP2101.py +++ /dev/null @@ -1,2191 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file AXP2101.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' - -from I2CInterface import * - - -_AXP2101_STATUS1 = const(0x00) -_AXP2101_STATUS2 = const(0x01) -_AXP2101_IC_TYPE = const(0x03) -_AXP2101_DATA_BUFFER1 = const(0x04) -_AXP2101_DATA_BUFFER2 = const(0x05) -_AXP2101_DATA_BUFFER3 = const(0x06) -_AXP2101_DATA_BUFFER4 = const(0x07) -_AXP2101_DATA_BUFFER_SIZE = const(4) -_AXP2101_COMMON_CONFIG = const(0x10) -_AXP2101_BATFET_CTRL = const(0x12) -_AXP2101_DIE_TEMP_CTRL = const(0x13) -_AXP2101_MIN_SYS_VOL_CTRL = const(0x14) -_AXP2101_INPUT_VOL_LIMIT_CTRL = const(0x15) -_AXP2101_INPUT_CUR_LIMIT_CTRL = const(0x16) -_AXP2101_RESET_FUEL_GAUGE = const(0x17) -_AXP2101_CHARGE_GAUGE_WDT_CTRL = const(0x18) -_AXP2101_WDT_CTRL = const(0x19) -_AXP2101_LOW_BAT_WARN_SET = const(0x1A) -_AXP2101_PWRON_STATUS = const(0x20) -_AXP2101_PWROFF_STATUS = const(0x21) -_AXP2101_PWROFF_EN = const(0x22) -_AXP2101_DC_OVP_UVP_CTRL = const(0x23) -_AXP2101_VOFF_SET = const(0x24) -_AXP2101_PWROK_SEQU_CTRL = const(0x25) -_AXP2101_SLEEP_WAKEUP_CTRL = const(0x26) -_AXP2101_IRQ_OFF_ON_LEVEL_CTRL = const(0x27) -_AXP2101_FAST_PWRON_SET0 = const(0x28) -_AXP2101_FAST_PWRON_SET1 = const(0x29) -_AXP2101_FAST_PWRON_SET2 = const(0x2A) -_AXP2101_FAST_PWRON_CTRL = const(0x2B) -_AXP2101_ADC_CHANNEL_CTRL = const(0x30) -_AXP2101_ADC_DATA_RELUST0 = const(0x34) -_AXP2101_ADC_DATA_RELUST1 = const(0x35) -_AXP2101_ADC_DATA_RELUST2 = const(0x36) -_AXP2101_ADC_DATA_RELUST3 = const(0x37) -_AXP2101_ADC_DATA_RELUST4 = const(0x38) -_AXP2101_ADC_DATA_RELUST5 = const(0x39) -_AXP2101_ADC_DATA_RELUST6 = const(0x3A) -_AXP2101_ADC_DATA_RELUST7 = const(0x3B) -_AXP2101_ADC_DATA_RELUST8 = const(0x3C) -_AXP2101_ADC_DATA_RELUST9 = const(0x3D) -# INTERRUPT REGISTER -_AXP2101_INTEN1 = const(0x40) -_AXP2101_INTEN2 = const(0x41) -_AXP2101_INTEN3 = const(0x42) -# INTERRUPT STATUS REGISTER -_AXP2101_INTSTS1 = const(0x48) -_AXP2101_INTSTS2 = const(0x49) -_AXP2101_INTSTS3 = const(0x4A) -_AXP2101_INTSTS_CNT = const(3) -_AXP2101_TS_PIN_CTRL = const(0x50) -_AXP2101_TS_HYSL2H_SET = const(0x52) -_AXP2101_TS_LYSL2H_SET = const(0x53) -_AXP2101_VLTF_CHG_SET = const(0x54) -_AXP2101_VHLTF_CHG_SET = const(0x55) -_AXP2101_VLTF_WORK_SET = const(0x56) -_AXP2101_VHLTF_WORK_SET = const(0x57) -_AXP2101_JIETA_EN_CTRL = const(0x58) -_AXP2101_JIETA_SET0 = const(0x59) -_AXP2101_JIETA_SET1 = const(0x5A) -_AXP2101_JIETA_SET2 = const(0x5B) -_AXP2101_IPRECHG_SET = const(0x61) -_AXP2101_ICC_CHG_SET = const(0x62) -_AXP2101_ITERM_CHG_SET_CTRL = const(0x63) -_AXP2101_CV_CHG_VOL_SET = const(0x64) -_AXP2101_THE_REGU_THRES_SET = const(0x65) -_AXP2101_CHG_TIMEOUT_SET_CTRL = const(0x67) -_AXP2101_BAT_DET_CTRL = const(0x68) -_AXP2101_CHGLED_SET_CTRL = const(0x69) -_AXP2101_BTN_VOL_MIN = const(2600) -_AXP2101_BTN_VOL_MAX = const(3300) -_AXP2101_BTN_VOL_STEPS = const(100) -_AXP2101_BTN_BAT_CHG_VOL_SET = const(0x6A) -_AXP2101_DC_ONOFF_DVM_CTRL = const(0x80) -_AXP2101_DC_FORCE_PWM_CTRL = const(0x81) -_AXP2101_DC_VOL0_CTRL = const(0x82) -_AXP2101_DC_VOL1_CTRL = const(0x83) -_AXP2101_DC_VOL2_CTRL = const(0x84) -_AXP2101_DC_VOL3_CTRL = const(0x85) -_AXP2101_DC_VOL4_CTRL = const(0x86) -_AXP2101_LDO_ONOFF_CTRL0 = const(0x90) -_AXP2101_LDO_ONOFF_CTRL1 = const(0x91) -_AXP2101_LDO_VOL0_CTRL = const(0x92) -_AXP2101_LDO_VOL1_CTRL = const(0x93) -_AXP2101_LDO_VOL2_CTRL = const(0x94) -_AXP2101_LDO_VOL3_CTRL = const(0x95) -_AXP2101_LDO_VOL4_CTRL = const(0x96) -_AXP2101_LDO_VOL5_CTRL = const(0x97) -_AXP2101_LDO_VOL6_CTRL = const(0x98) -_AXP2101_LDO_VOL7_CTRL = const(0x99) -_AXP2101_LDO_VOL8_CTRL = const(0x9A) -_AXP2101_BAT_PARAME = const(0xA1) -_AXP2101_FUEL_GAUGE_CTRL = const(0xA2) -_AXP2101_BAT_PERCENT_DATA = const(0xA4) -# DCDC 1~5 -_AXP2101_DCDC1_VOL_MIN = const(1500) -_AXP2101_DCDC1_VOL_MAX = const(3400) -_AXP2101_DCDC1_VOL_STEPS = const(100) -_AXP2101_DCDC2_VOL1_MIN = const(500) -_AXP2101_DCDC2_VOL1_MAX = const(1200) -_AXP2101_DCDC2_VOL2_MIN = const(1220) -_AXP2101_DCDC2_VOL2_MAX = const(1540) -_AXP2101_DCDC2_VOL_STEPS1 = const(10) -_AXP2101_DCDC2_VOL_STEPS2 = const(20) -_AXP2101_DCDC2_VOL_STEPS1_BASE = const(0) -_AXP2101_DCDC2_VOL_STEPS2_BASE = const(71) -_AXP2101_DCDC3_VOL1_MIN = const(500) -_AXP2101_DCDC3_VOL1_MAX = const(1200) -_AXP2101_DCDC3_VOL2_MIN = const(1220) -_AXP2101_DCDC3_VOL2_MAX = const(1540) -_AXP2101_DCDC3_VOL3_MIN = const(1600) -_AXP2101_DCDC3_VOL3_MAX = const(3400) -_AXP2101_DCDC3_VOL_MIN = const(500) -_AXP2101_DCDC3_VOL_MAX = const(3400) -_AXP2101_DCDC3_VOL_STEPS1 = const(10) -_AXP2101_DCDC3_VOL_STEPS2 = const(20) -_AXP2101_DCDC3_VOL_STEPS3 = const(100) -_AXP2101_DCDC3_VOL_STEPS1_BASE = const(0) -_AXP2101_DCDC3_VOL_STEPS2_BASE = const(71) -_AXP2101_DCDC3_VOL_STEPS3_BASE = const(88) -_AXP2101_DCDC4_VOL1_MIN = const(500) -_AXP2101_DCDC4_VOL1_MAX = const(1200) -_AXP2101_DCDC4_VOL2_MIN = const(1220) -_AXP2101_DCDC4_VOL2_MAX = const(1840) -_AXP2101_DCDC4_VOL_STEPS1 = const(10) -_AXP2101_DCDC4_VOL_STEPS2 = const(20) -_AXP2101_DCDC4_VOL_STEPS1_BASE = const(0) -_AXP2101_DCDC4_VOL_STEPS2_BASE = const(71) -_AXP2101_DCDC5_VOL_1200MV = const(1200) -_AXP2101_DCDC5_VOL_VAL = const(0x19) -_AXP2101_DCDC5_VOL_MIN = const(1400) -_AXP2101_DCDC5_VOL_MAX = const(3700) -_AXP2101_DCDC5_VOL_STEPS = const(100) -_AXP2101_VSYS_VOL_THRESHOLD_MIN = const(2600) -_AXP2101_VSYS_VOL_THRESHOLD_MAX = const(3300) -_AXP2101_VSYS_VOL_THRESHOLD_STEPS = const(100) -# ALDO 1~4 -_AXP2101_ALDO1_VOL_MIN = const(500) -_AXP2101_ALDO1_VOL_MAX = const(3500) -_AXP2101_ALDO1_VOL_STEPS = const(100) -_AXP2101_ALDO2_VOL_MIN = const(500) -_AXP2101_ALDO2_VOL_MAX = const(3500) -_AXP2101_ALDO2_VOL_STEPS = const(100) -_AXP2101_ALDO3_VOL_MIN = const(500) -_AXP2101_ALDO3_VOL_MAX = const(3500) -_AXP2101_ALDO3_VOL_STEPS = const(100) -_AXP2101_ALDO4_VOL_MIN = const(500) -_AXP2101_ALDO4_VOL_MAX = const(3500) -_AXP2101_ALDO4_VOL_STEPS = const(100) -# BLDO 1~2 -_AXP2101_BLDO1_VOL_MIN = const(500) -_AXP2101_BLDO1_VOL_MAX = const(3500) -_AXP2101_BLDO1_VOL_STEPS = const(100) -_AXP2101_BLDO2_VOL_MIN = const(500) -_AXP2101_BLDO2_VOL_MAX = const(3500) -_AXP2101_BLDO2_VOL_STEPS = const(100) -# CPUSLDO -_AXP2101_CPUSLDO_VOL_MIN = const(500) -_AXP2101_CPUSLDO_VOL_MAX = const(1400) -_AXP2101_CPUSLDO_VOL_STEPS = const(50) -# DLDO 1~2 -_AXP2101_DLDO1_VOL_MIN = const(500) -_AXP2101_DLDO1_VOL_MAX = const(3400) -_AXP2101_DLDO1_VOL_STEPS = const(100) -_AXP2101_DLDO2_VOL_MIN = const(500) -_AXP2101_DLDO2_VOL_MAX = const(3400) -_AXP2101_DLDO2_VOL_STEPS = const(100) - -AXP2101_SLAVE_ADDRESS = const(0x34) -XPOWERS_AXP2101_CHIP_ID = const(0x4A) - - -class AXP2101(I2CInterface): - - # ARGS ARGS ARGS ARGS ARGS ARGS ARGS ARGS ARGS - - """Power ON OFF IRQ timmint control values""" - XPOWERS_AXP2101_IRQ_TIME_1S = const(0) - XPOWERS_AXP2101_IRQ_TIME_1S5 = const(1) - XPOWERS_AXP2101_IRQ_TIME_2S = const(2) - XPOWERS_AXP2101_PRESSOFF_2S5 = const(3) - - """Precharge current limit values""" - XPOWERS_AXP2101_PRECHARGE_25MA = const(1) - XPOWERS_AXP2101_PRECHARGE_50MA = const(2) - XPOWERS_AXP2101_PRECHARGE_75MA = const(3) - XPOWERS_AXP2101_PRECHARGE_100MA = const(4) - XPOWERS_AXP2101_PRECHARGE_125MA = const(5) - XPOWERS_AXP2101_PRECHARGE_150MA = const(6) - XPOWERS_AXP2101_PRECHARGE_175MA = const(7) - XPOWERS_AXP2101_PRECHARGE_200MA = const(8) - - """Charging termination of current limit""" - XPOWERS_AXP2101_CHG_ITERM_0MA = const(0) - XPOWERS_AXP2101_CHG_ITERM_25MA = const(1) - XPOWERS_AXP2101_CHG_ITERM_50MA = const(2) - XPOWERS_AXP2101_CHG_ITERM_75MA = const(3) - XPOWERS_AXP2101_CHG_ITERM_100MA = const(4) - XPOWERS_AXP2101_CHG_ITERM_125MA = const(5) - XPOWERS_AXP2101_CHG_ITERM_150MA = const(6) - XPOWERS_AXP2101_CHG_ITERM_175MA = const(7) - XPOWERS_AXP2101_CHG_ITERM_200MA = const(8) - - """Thermal regulation threshold setting""" - XPOWERS_AXP2101_THREMAL_60DEG = const(0) - XPOWERS_AXP2101_THREMAL_80DEG = const(1) - XPOWERS_AXP2101_THREMAL_100DEG = const(2) - XPOWERS_AXP2101_THREMAL_120DEG = const(3) - - """Charging status values""" - XPOWERS_AXP2101_CHG_TRI_STATE = const(0) # tri_charge - XPOWERS_AXP2101_CHG_PRE_STATE = const(1) # pre_charge - XPOWERS_AXP2101_CHG_CC_STATE = const(2) # constant charge - XPOWERS_AXP2101_CHG_CV_STATE = const(3) # constant voltage - XPOWERS_AXP2101_CHG_DONE_STATE = const(4) # charge done - XPOWERS_AXP2101_CHG_STOP_STATE = const(5) # not charge - - """PMU wakeup method values""" - XPOWERS_AXP2101_WAKEUP_IRQ_PIN_TO_LOW = const(1 << 4) - XPOWERS_AXP2101_WAKEUP_PWROK_TO_LOW = const(1 << 3) - XPOWERS_AXP2101_WAKEUP_DC_DLO_SELECT = const(1 << 2) - - """Fast Power On start sequence values""" - XPOWERS_AXP2101_FAST_DCDC1 = const(0) - XPOWERS_AXP2101_FAST_DCDC2 = const(1) - XPOWERS_AXP2101_FAST_DCDC3 = const(2) - XPOWERS_AXP2101_FAST_DCDC4 = const(3) - XPOWERS_AXP2101_FAST_DCDC5 = const(4) - XPOWERS_AXP2101_FAST_ALDO1 = const(5) - XPOWERS_AXP2101_FAST_ALDO2 = const(6) - XPOWERS_AXP2101_FAST_ALDO3 = const(7) - XPOWERS_AXP2101_FAST_ALDO4 = const(8) - XPOWERS_AXP2101_FAST_BLDO1 = const(9) - XPOWERS_AXP2101_FAST_BLDO2 = const(10) - XPOWERS_AXP2101_FAST_CPUSLDO = const(11) - XPOWERS_AXP2101_FAST_DLDO1 = const(12) - XPOWERS_AXP2101_FAST_DLDO2 = const(13) - - """Fast Power On start sequence values""" - XPOWERS_AXP2101_SEQUENCE_LEVEL_0 = const(0) - XPOWERS_AXP2101_SEQUENCE_LEVEL_1 = const(1) - XPOWERS_AXP2101_SEQUENCE_LEVEL_2 = const(2) - XPOWERS_AXP2101_SEQUENCE_DISABLE = const(3) - - """Watchdog config values""" - # Just interrupt to pin - XPOWERS_AXP2101_WDT_IRQ_TO_PIN = const(0) - # IRQ to pin and reset pmu system - XPOWERS_AXP2101_WDT_IRQ_AND_RSET = const(1) - # IRQ to pin and reset pmu systempull down pwrok - XPOWERS_AXP2101_WDT_IRQ_AND_RSET_PD_PWROK = const(2) - # IRQ to pin and reset pmu systemturn off dcdc & ldo pull down pwrok - XPOWERS_AXP2101_WDT_IRQ_AND_RSET_ALL_OFF = const(3) - - """Watchdog timeout values""" - XPOWERS_AXP2101_WDT_TIMEOUT_1S = const(0) - XPOWERS_AXP2101_WDT_TIMEOUT_2S = const(1) - XPOWERS_AXP2101_WDT_TIMEOUT_4S = const(2) - XPOWERS_AXP2101_WDT_TIMEOUT_8S = const(3) - XPOWERS_AXP2101_WDT_TIMEOUT_16S = const(4) - XPOWERS_AXP2101_WDT_TIMEOUT_32S = const(5) - XPOWERS_AXP2101_WDT_TIMEOUT_64S = const(6) - XPOWERS_AXP2101_WDT_TIMEOUT_128S = const(7) - - """VBUS voltage limit values""" - XPOWERS_AXP2101_VBUS_VOL_LIM_3V88 = const(0) - XPOWERS_AXP2101_VBUS_VOL_LIM_3V96 = const(1) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V04 = const(2) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V12 = const(3) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V20 = const(4) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V28 = const(5) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V36 = const(6) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V44 = const(7) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V52 = const(8) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V60 = const(9) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V68 = const(10) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V76 = const(11) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V84 = const(12) - XPOWERS_AXP2101_VBUS_VOL_LIM_4V92 = const(13) - XPOWERS_AXP2101_VBUS_VOL_LIM_5V = const(14) - XPOWERS_AXP2101_VBUS_VOL_LIM_5V08 = const(15) - - """VSYS power supply voltage limit values""" - XPOWERS_AXP2101_VSYS_VOL_4V1 = const(0) - XPOWERS_AXP2101_VSYS_VOL_4V2 = const(1) - XPOWERS_AXP2101_VSYS_VOL_4V3 = const(2) - XPOWERS_AXP2101_VSYS_VOL_4V4 = const(3) - XPOWERS_AXP2101_VSYS_VOL_4V5 = const(4) - XPOWERS_AXP2101_VSYS_VOL_4V6 = const(5) - XPOWERS_AXP2101_VSYS_VOL_4V7 = const(6) - XPOWERS_AXP2101_VSYS_VOL_4V8 = const(7) - - """Power on source values""" - # POWERON low for on level when POWERON Mode as POWERON Source - XPOWER_POWERON_SRC_POWERON_LOW = const(0) - # IRQ PIN Pull-down as POWERON Source - XPOWER_POWERON_SRC_IRQ_LOW = const(1) - # Vbus Insert and Good as POWERON Source - XPOWER_POWERON_SRC_VBUS_INSERT = const(2) - # Vbus Insert and Good as POWERON Source - XPOWER_POWERON_SRC_BAT_CHARGE = const(3) - # Battery Insert and Good as POWERON Source - XPOWER_POWERON_SRC_BAT_INSERT = const(4) - # POWERON always high when EN Mode as POWERON Source - XPOWER_POWERON_SRC_ENMODE = const(5) - XPOWER_POWERON_SRC_UNKONW = const(6) # Unkonw - - """Power off source values""" - # POWERON Pull down for off level when POWERON Mode as POWEROFF Source - XPOWER_POWEROFF_SRC_PWEKEY_PULLDOWN = const(0) - # Software configuration as POWEROFF Source - XPOWER_POWEROFF_SRC_SOFT_OFF = const(1) - # POWERON always low when EN Mode as POWEROFF Source - XPOWER_POWEROFF_SRC_PWEKEY_LOW = const(2) - # Vsys Under Voltage as POWEROFF Source - XPOWER_POWEROFF_SRC_UNDER_VSYS = const(3) - # VBUS Over Voltage as POWEROFF Source - XPOWER_POWEROFF_SRC_OVER_VBUS = const(4) - # DCDC Under Voltage as POWEROFF Source - XPOWER_POWEROFF_SRC_UNDER_VOL = const(5) - # DCDC Over Voltage as POWEROFF Source - XPOWER_POWEROFF_SRC_OVER_VOL = const(6) - # Die Over Temperature as POWEROFF Source - XPOWER_POWEROFF_SRC_OVER_TEMP = const(7) - XPOWER_POWEROFF_SRC_UNKONW = const(8) # Unkonw - - """Power ok signal delay values""" - XPOWER_PWROK_DELAY_8MS = const(0) - XPOWER_PWROK_DELAY_16MS = const(1) - XPOWER_PWROK_DELAY_32MS = const(2) - XPOWER_PWROK_DELAY_64MS = const(3) - - """Power button press shutdown time values""" - XPOWERS_POWEROFF_4S = const(0) - XPOWERS_POWEROFF_6S = const(1) - XPOWERS_POWEROFF_8S = const(2) - XPOWERS_POWEROFF_10S = const(3) - - """Power on time value when the power button is pressed""" - XPOWERS_POWERON_128MS = const(0) - XPOWERS_POWERON_512MS = const(1) - XPOWERS_POWERON_1S = const(2) - XPOWERS_POWERON_2S = const(3) - - """PMU LED indicator function values""" - XPOWERS_CHG_LED_OFF = const(0) - XPOWERS_CHG_LED_BLINK_1HZ = const(1) - XPOWERS_CHG_LED_BLINK_4HZ = const(2) - XPOWERS_CHG_LED_ON = const(3) - XPOWERS_CHG_LED_CTRL_CHG = const(4) - - """Charging voltage limit values""" - XPOWERS_AXP2101_CHG_VOL_4V = const(1) - XPOWERS_AXP2101_CHG_VOL_4V1 = const(2) - XPOWERS_AXP2101_CHG_VOL_4V2 = const(3) - XPOWERS_AXP2101_CHG_VOL_4V35 = const(4) - XPOWERS_AXP2101_CHG_VOL_4V4 = const(5) - - _CHG_VOL = ( - XPOWERS_AXP2101_CHG_VOL_4V, - XPOWERS_AXP2101_CHG_VOL_4V1, - XPOWERS_AXP2101_CHG_VOL_4V2, - XPOWERS_AXP2101_CHG_VOL_4V35, - XPOWERS_AXP2101_CHG_VOL_4V4 - ) - - """Charging current limit values""" - XPOWERS_AXP2101_CHG_CUR_100MA = const(4) - XPOWERS_AXP2101_CHG_CUR_125MA = const(5) - XPOWERS_AXP2101_CHG_CUR_150MA = const(6) - XPOWERS_AXP2101_CHG_CUR_175MA = const(7) - XPOWERS_AXP2101_CHG_CUR_200MA = const(8) - XPOWERS_AXP2101_CHG_CUR_300MA = const(9) - XPOWERS_AXP2101_CHG_CUR_400MA = const(10) - XPOWERS_AXP2101_CHG_CUR_500MA = const(11) - XPOWERS_AXP2101_CHG_CUR_600MA = const(12) - XPOWERS_AXP2101_CHG_CUR_700MA = const(13) - XPOWERS_AXP2101_CHG_CUR_800MA = const(14) - XPOWERS_AXP2101_CHG_CUR_900MA = const(15) - XPOWERS_AXP2101_CHG_CUR_1000MA = const(16) - - _CHG_CUR = ( - XPOWERS_AXP2101_CHG_CUR_100MA, - XPOWERS_AXP2101_CHG_CUR_125MA, - XPOWERS_AXP2101_CHG_CUR_150MA, - XPOWERS_AXP2101_CHG_CUR_175MA, - XPOWERS_AXP2101_CHG_CUR_200MA, - XPOWERS_AXP2101_CHG_CUR_300MA, - XPOWERS_AXP2101_CHG_CUR_400MA, - XPOWERS_AXP2101_CHG_CUR_500MA, - XPOWERS_AXP2101_CHG_CUR_600MA, - XPOWERS_AXP2101_CHG_CUR_700MA, - XPOWERS_AXP2101_CHG_CUR_800MA, - XPOWERS_AXP2101_CHG_CUR_900MA, - XPOWERS_AXP2101_CHG_CUR_1000MA, - ) - - """VBUS current limit values""" - XPOWERS_AXP2101_VBUS_CUR_LIM_100MA = const(0) - XPOWERS_AXP2101_VBUS_CUR_LIM_500MA = const(1) - XPOWERS_AXP2101_VBUS_CUR_LIM_900MA = const(2) - XPOWERS_AXP2101_VBUS_CUR_LIM_1000MA = const(3) - XPOWERS_AXP2101_VBUS_CUR_LIM_1500MA = const(4) - XPOWERS_AXP2101_VBUS_CUR_LIM_2000MA = const(5) - - _VBUS_LIMIT = ( - XPOWERS_AXP2101_VBUS_CUR_LIM_100MA, - XPOWERS_AXP2101_VBUS_CUR_LIM_500MA, - XPOWERS_AXP2101_VBUS_CUR_LIM_900MA, - XPOWERS_AXP2101_VBUS_CUR_LIM_1000MA, - XPOWERS_AXP2101_VBUS_CUR_LIM_1500MA, - XPOWERS_AXP2101_VBUS_CUR_LIM_2000MA, - ) - - """PMU interrupt control mask values""" - - #! IRQ1 REG 40H - XPOWERS_AXP2101_BAT_NOR_UNDER_TEMP_IRQ = const( - 1 << 0) # Battery Under Temperature in Work - XPOWERS_AXP2101_BAT_NOR_OVER_TEMP_IRQ = const( - 1 << 1) # Battery Over Temperature in Work mode - # Battery Under Temperature in Charge mode IRQ(bcut_irq) - XPOWERS_AXP2101_BAT_CHG_UNDER_TEMP_IRQ = const(1 << 2) - # Battery Over Temperature in Charge mode IRQ(bcot_irq) enable - XPOWERS_AXP2101_BAT_CHG_OVER_TEMP_IRQ = const(1 << 3) - # Gauge New SOC IRQ(lowsoc_irq) enable ??? - XPOWERS_AXP2101_GAUGE_NEW_SOC_IRQ = const(1 << 4) - # Gauge Watchdog Timeout IRQ(gwdt_irq) enable - XPOWERS_AXP2101_WDT_TIMEOUT_IRQ = const(1 << 5) - # SOC drop to Warning Level1 IRQ(socwl1_irq) enable - XPOWERS_AXP2101_WARNING_LEVEL1_IRQ = const(1 << 6) - # SOC drop to Warning Level2 IRQ(socwl2_irq) enable - XPOWERS_AXP2101_WARNING_LEVEL2_IRQ = const(1 << 7) - - #! IRQ2 REG 41H - # POWERON Positive Edge IRQ(ponpe_irq_en) enable - XPOWERS_AXP2101_PKEY_POSITIVE_IRQ = const(1 << 8) - # POWERON Negative Edge IRQ(ponne_irq_en) enable - XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ = const(1 << 9) - # POWERON Long PRESS IRQ(ponlp_irq) enable - XPOWERS_AXP2101_PKEY_LONG_IRQ = const(1 << 10) - # POWERON Short PRESS IRQ(ponsp_irq_en) enable - XPOWERS_AXP2101_PKEY_SHORT_IRQ = const(1 << 11) - # Battery Remove IRQ(bremove_irq) enable - XPOWERS_AXP2101_BAT_REMOVE_IRQ = const(1 << 12) - # Battery Insert IRQ(binsert_irq) enabl - XPOWERS_AXP2101_BAT_INSERT_IRQ = const(1 << 13) - XPOWERS_AXP2101_VBUS_REMOVE_IRQ = const( - 1 << 14) # VBUS Remove IRQ(vremove_irq) enabl - # VBUS Insert IRQ(vinsert_irq) enable - XPOWERS_AXP2101_VBUS_INSERT_IRQ = const(1 << 15) - - #! IRQ3 REG 42H - # Battery Over Voltage Protection IRQ(bovp_irq) enable - XPOWERS_AXP2101_BAT_OVER_VOL_IRQ = const(1 << 16) - # Charger Safety Timer1/2 expire IRQ(chgte_irq) enable - XPOWERS_AXP2101_CHAGER_TIMER_IRQ = const(1 << 17) - # DIE Over Temperature level1 IRQ(dotl1_irq) enable - XPOWERS_AXP2101_DIE_OVER_TEMP_IRQ = const(1 << 18) - XPOWERS_AXP2101_BAT_CHG_START_IRQ = const( - 1 << 19) # Charger start IRQ(chgst_irq) enable - # Battery charge done IRQ(chgdn_irq) enable - XPOWERS_AXP2101_BAT_CHG_DONE_IRQ = const(1 << 20) - # BATFET Over Current Protection IRQ(bocp_irq) enable - XPOWERS_AXP2101_BATFET_OVER_CURR_IRQ = const(1 << 21) - # LDO Over Current IRQ(ldooc_irq) enable - XPOWERS_AXP2101_LDO_OVER_CURR_IRQ = const(1 << 22) - # Watchdog Expire IRQ(wdexp_irq) enable - XPOWERS_AXP2101_WDT_EXPIRE_IRQ = const(1 << 23) - XPOWERS_AXP2101_ALL_IRQ = const(0xFFFFFFFF) - - def __init__(self, i2c_bus: I2C, addr: int = AXP2101_SLAVE_ADDRESS) -> None: - super().__init__(i2c_bus, addr) - print('AXP2101 __init__') - self.statusRegister = [0] * _AXP2101_INTSTS_CNT - self.intRegister = [0] * _AXP2101_INTSTS_CNT - - if self.getChipID() != XPOWERS_AXP2101_CHIP_ID: - raise RuntimeError( - "Failed to find %s - check your wiring!" % self.__class__.__name__ - ) - - # PMU status functions - def isVbusGood(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS1, 5)) - - def getBatfetState(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS1, 4)) - - # getBatPresentState - def isBatteryConnect(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS1, 3)) - - def isBatInActiveModeState(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS1, 2)) - - def getThermalRegulationStatus(self) -> bool: - return super().getRegisterBit(_AXP2101_STATUS1, 1) - - def getCurrentLimitStatus(self) -> bool: - return super().getRegisterBit(_AXP2101_STATUS1, 0) - - def isCharging(self) -> bool: - return (super().readRegister(_AXP2101_STATUS2)[0] >> 5) == 0x01 - - def isDischarge(self) -> bool: - return (super().readRegister(_AXP2101_STATUS2)[0] >> 5) == 0x02 - - def isStandby(self) -> bool: - return (super().readRegister(_AXP2101_STATUS2)[0] >> 5) == 0x00 - - def isPowerOn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS2, 4)) - - def isPowerOff(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS2, 4)) - - def isVbusIn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_STATUS2, 3) == 0) - - def getChargerStatus(self) -> None: - return super().readRegister(_AXP2101_STATUS2)[0] & 0x07 - - # Data Buffer - def writeDataBuffer(self, data: list, size: int) -> None: - if not 0 <= size <= _AXP2101_DATA_BUFFER_SIZE: - raise ValueError("size must be a value within 0-3!") - for i in range(0, size): - super().writeRegister(_AXP2101_DATA_BUFFER1 + i, data[i]) - - def readDataBuffer(self, size: int) -> list: - if not 0 <= size <= _AXP2101_DATA_BUFFER_SIZE: - raise ValueError("size must be a value within 0-3!") - return list(super().readRegister(_AXP2101_DATA_BUFFER1, size)) - - # PMU common configuration - # @brief Internal off-discharge enable for DCDC & LDO & SWITCH - def enableInternalDischarge(self) -> None: - super().setRegisterBit(_AXP2101_COMMON_CONFIG, 5) - - def disableInternalDischarge(self) -> None: - super().clrRegisterBit(_AXP2101_COMMON_CONFIG, 5) - - # @brief PWROK PIN pull low to Restart - def enablePwrOkPinPullLow(self) -> None: - super().setRegisterBit(_AXP2101_COMMON_CONFIG, 3) - - def disablePwrOkPinPullLow(self) -> None: - super().clrRegisterBit(_AXP2101_COMMON_CONFIG, 3) - - def enablePwronShutPMIC(self) -> None: - super().setRegisterBit(_AXP2101_COMMON_CONFIG, 2) - - def disablePwronShutPMIC(self) -> None: - super().clrRegisterBit(_AXP2101_COMMON_CONFIG, 2) - - # @brief Restart the SoC System, POWOFF/POWON and reset the related registers - def reset(self) -> None: - super().setRegisterBit(_AXP2101_COMMON_CONFIG, 1) - - # @brief Set shutdown, calling shutdown will turn off all power channels, - # only VRTC belongs to normal power supply - def shutdown(self) -> None: - super().setRegisterBit(_AXP2101_COMMON_CONFIG, 0) - - # @brief BATFET control / REG 12H - # @note DIE Over Temperature Protection Level1 Configuration - # @param opt: 0:115 , 1:125 , 2:135 - def setBatfetDieOverTempLevel1(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError("param must be a value within 0-3!") - val = super().readRegister(_AXP2101_BATFET_CTRL)[0] - val &= 0xF9 - super().writeRegister(_AXP2101_BATFET_CTRL, val | (opt << 1)) - - def getBatfetDieOverTempLevel1(self) -> int: - return (super().readRegister(_AXP2101_BATFET_CTRL)[0] & 0x06) - - def enableBatfetDieOverTempDetect(self) -> None: - super().setRegisterBit(_AXP2101_BATFET_CTRL, 0) - - def disableBatfetDieOverTempDetect(self) -> None: - super().clrRegisterBit(_AXP2101_BATFET_CTRL, 0) - - # @param opt: 0:115 , 1:125 , 2:135 - def setDieOverTempLevel1(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError("level must be a value within 0-3!") - val = super().readRegister(_AXP2101_DIE_TEMP_CTRL)[0] - val &= 0xF9 - super().writeRegister(_AXP2101_DIE_TEMP_CTRL, val | (opt << 1)) - - def getDieOverTempLevel1(self) -> int: - return (super().readRegister(_AXP2101_DIE_TEMP_CTRL)[0] & 0x06) - - def enableDieOverTempDetect(self) -> None: - super().setRegisterBit(_AXP2101_DIE_TEMP_CTRL, 0) - - def disableDieOverTempDetect(self) -> None: - super().clrRegisterBit(_AXP2101_DIE_TEMP_CTRL, 0) - - # Linear Charger Vsys voltage dpm - def setLinearChargerVsysDpm(self, opt: int) -> None: - # todo: - val = super().readRegister(_AXP2101_MIN_SYS_VOL_CTRL)[0] - val &= 0x8F - super().writeRegister(_AXP2101_MIN_SYS_VOL_CTRL, val | (opt << 4)) - - def getLinearChargerVsysDpm(self) -> int: - val = super().readRegister(_AXP2101_MIN_SYS_VOL_CTRL)[0] - val &= 0x70 - return (val & 0x70) >> 4 - - # Set the minimum common working voltage of the PMU VBUS input, - # below this value will turn off the PMU - def setVbusVoltageLimit(self, opt: int) -> None: - val = super().readRegister(_AXP2101_INPUT_VOL_LIMIT_CTRL)[0] - val &= 0xF0 - super().writeRegister(_AXP2101_INPUT_VOL_LIMIT_CTRL, val | (opt & 0x0F)) - - def getVbusVoltageLimit(self) -> int: - return (super().readRegister(_AXP2101_INPUT_VOL_LIMIT_CTRL)[0] & 0x0F) - - # @brief Set VBUS Current Input Limit. - # @param opt: View the related chip type _axp2101_vbus_cur_limit_t enumeration parameters in "Params.hpp" - def setVbusCurrentLimit(self, opt: int) -> None: - val = super().readRegister(_AXP2101_INPUT_CUR_LIMIT_CTRL)[0] - val &= 0xF8 - super().writeRegister(_AXP2101_INPUT_CUR_LIMIT_CTRL, val | (opt & 0x07)) - - # @brief Get VBUS Current Input Limit. - # @retval View the related chip type _axp2101_vbus_cur_limit_t enumeration parameters in "Params.hpp" - def getVbusCurrentLimit(self) -> int: - return (super().readRegister(_AXP2101_INPUT_CUR_LIMIT_CTRL)[0] & 0x07) - - # @brief Reset the fuel gauge - def resetGauge(self) -> None: - super().setRegisterBit(_AXP2101_RESET_FUEL_GAUGE, 3) - - # @brief reset the gauge besides reset - def resetGaugeBesides(self) -> None: - super().setRegisterBit(_AXP2101_RESET_FUEL_GAUGE, 2) - - # @brief Gauge Module - def enableGauge(self) -> None: - super().setRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 3) - - def disableGauge(self) -> None: - super().clrRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 3) - - # @brief Button Battery charge - def enableButtonBatteryCharge(self) -> None: - super().setRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 2) - - def disableButtonBatteryCharge(self) -> None: - super().clrRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 2) - - def isEnableButtonBatteryCharge(self) -> bool: - return super().getRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 2) - - # Button battery charge termination voltage setting - def setButtonBatteryChargeVoltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_BTN_VOL_STEPS): - raise ValueError("Mistake ! Button battery charging step voltage is %u mV" % - _AXP2101_BTN_VOL_STEPS) - if (millivolt < _AXP2101_BTN_VOL_MIN): - raise ValueError("Mistake ! The minimum charge termination voltage of the coin cell battery is %u mV" % - _AXP2101_BTN_VOL_MIN) - elif (millivolt > _AXP2101_BTN_VOL_MAX): - raise ValueError("Mistake ! The minimum charge termination voltage of the coin cell battery is %u mV" % - _AXP2101_BTN_VOL_MAX) - val = super().readRegister(_AXP2101_BTN_BAT_CHG_VOL_SET)[0] - val &= 0xF8 - val |= (int)((millivolt - _AXP2101_BTN_VOL_MIN) / _AXP2101_BTN_VOL_STEPS) - super().writeRegister(_AXP2101_BTN_BAT_CHG_VOL_SET, val) - - def getButtonBatteryVoltage(self) -> int: - val = super().readRegister(_AXP2101_BTN_BAT_CHG_VOL_SET)[0] - return (val & 0x07) * _AXP2101_BTN_VOL_STEPS + _AXP2101_BTN_VOL_MIN - - # @brief Cell Battery charge - def enableCellbatteryCharge(self) -> None: - super().setRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 1) - - def disableCellbatteryCharge(self) -> None: - super().clrRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 1) - - # @brief Watchdog Module - def enableWatchdog(self) -> None: - super().setRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 0) - self.enableIRQ(self.XPOWERS_AXP2101_WDT_EXPIRE_IRQ) - - def disableWatchdog(self) -> None: - self.disableIRQ(self.XPOWERS_AXP2101_WDT_EXPIRE_IRQ) - super().clrRegisterBit(_AXP2101_CHARGE_GAUGE_WDT_CTRL, 0) - - # @brief Watchdog Config - # @param opt: 0: IRQ Only 1: IRQ and System reset 2: IRQ, System Reset and Pull down PWROK 1s 3: IRQ, System Reset, DCDC/LDO PWROFF & PWRON - def setWatchdogConfig(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError( - "Watchdog Config optrion must be a value within 0-3!") - val = super().readRegister(_AXP2101_WDT_CTRL)[0] - val &= 0xCF - super().writeRegister(_AXP2101_WDT_CTRL, val | (opt << 4)) - - def getWatchConfig(self) -> int: - return (super().readRegister(_AXP2101_WDT_CTRL)[0] & 0x30) >> 4 - - def clrWatchdog(self) -> None: - super().setRegisterBit(_AXP2101_WDT_CTRL, 3) - - def setWatchdogTimeout(self, opt: int) -> None: - if not 0 < opt <= 7: - raise ValueError( - "Watchdog timeout must be a value within 0-7!") - val = super().readRegister(_AXP2101_WDT_CTRL)[0] - val &= 0xF8 - super().writeRegister(_AXP2101_WDT_CTRL, val | opt) - - def getWatchdogTimerout(self) -> int: - return super().readRegister(_AXP2101_WDT_CTRL)[0] & 0x07 - - # @brief Low battery warning threshold 5-20%, 1% per step - def setLowBatWarnThreshold(self, opt: int) -> None: - if opt < 5 or opt > 20: - return - val = super().readRegister(_AXP2101_LOW_BAT_WARN_SET)[0] - val &= 0x0F - super().writeRegister(_AXP2101_LOW_BAT_WARN_SET, val | ((opt - 5) << 4)) - - def getLowBatWarnThreshold(self) -> int: - return (super().readRegister(_AXP2101_LOW_BAT_WARN_SET)[0] & 0xF0) >> 4 - - # @brief Low battery shutdown threshold 0-15%, 1% per step - def setLowBatShutdownThreshold(self, opt: int) -> None: - if opt > 15: - opt = 15 - val = super().readRegister(_AXP2101_LOW_BAT_WARN_SET)[0] - val &= 0xF0 - super().writeRegister(_AXP2101_LOW_BAT_WARN_SET, val | opt) - - def getLowBatShutdownThreshold(self) -> int: - return (super().readRegister(_AXP2101_LOW_BAT_WARN_SET)[0] & 0x0F) - - #! PWRON statu 20 - # POWERON always high when EN Mode as POWERON Source - def isPoweronAlwaysHighSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWRON_STATUS, 5)) - - # Battery Insert and Good as POWERON Source - def isBattInsertOnSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWRON_STATUS, 4)) - - # Battery Voltage > 3.3V when Charged as Source - def isBattNormalOnSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWRON_STATUS, 3)) - - # Vbus Insert and Good as POWERON Source - def isVbusInsertOnSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWRON_STATUS, 2)) - - # IRQ PIN Pull-down as POWERON Source - def isIrqLowOnSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWRON_STATUS, 1)) - - # POWERON low for on level when POWERON Mode as POWERON Source - def isPwronLowOnSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWRON_STATUS, 0)) - - def getPowerOnSource(self) -> int: - return super().readRegister(_AXP2101_PWRON_STATUS)[0] - - #! PWROFF status 21 - # Die Over Temperature as POWEROFF Source - def isOverTemperatureOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 7)) - - # DCDC Over Voltage as POWEROFF Source - def isDcOverVoltageOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 6)) - - # DCDC Under Voltage as POWEROFF Source - def isDcUnderVoltageOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 5)) - - # VBUS Over Voltage as POWEROFF Source - def isVbusOverVoltageOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 4)) - - # Vsys Under Voltage as POWEROFF Source - def isVsysUnderVoltageOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 3)) - - # POWERON always low when EN Mode as POWEROFF Source - def isPwronAlwaysLowOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 2)) - - # Software configuration as POWEROFF Source - def isSwConfigOffSource(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 1)) - - # POWERON Pull down for off level when POWERON Mode as POWEROFF Source - def isPwrSourcePullDown(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_PWROFF_STATUS, 0)) - - def getPowerOffSource(self) -> int: - return super().readRegister(_AXP2101_PWROFF_STATUS)[0] - - #!REG 22H - def enableOverTemperatureLevel2PowerOff(self) -> None: - super().setRegisterBit(_AXP2101_PWROFF_EN, 2) - - def disableOverTemperaturePowerOff(self) -> None: - super().clrRegisterBit(_AXP2101_PWROFF_EN, 2) - - def enableLongPressShutdown(self) -> None: - super().setRegisterBit(_AXP2101_PWROFF_EN, 1) - - def disableLongPressShutdown(self) -> None: - super().clrRegisterBit(_AXP2101_PWROFF_EN, 1) - - def setLongPressRestart(self) -> None: - super().setRegisterBit(_AXP2101_PWROFF_EN, 0) - - def setLongPressPowerOFF(self) -> None: - super().clrRegisterBit(_AXP2101_PWROFF_EN, 0) - - #!REG 23H - # DCDC 120%(130%) high voltage turn off PMIC function - def enableDCHighVoltageTurnOff(self) -> None: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 5) - - def disableDCHighVoltageTurnOff(self) -> None: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 5) - - # DCDC5 85% low voltage turn Off PMIC function - def enableDC5LowVoltageTurnOff(self) -> None: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 4) - - def disableDC5LowVoltageTurnOff(self) -> None: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 4) - - # DCDC4 85% low voltage turn Off PMIC function - def enableDC4LowVoltageTurnOff(self) -> None: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 3) - - def disableDC4LowVoltageTurnOff(self) -> None: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 3) - - # DCDC3 85% low voltage turn Off PMIC function - def enableDC3LowVoltageTurnOff(self) -> None: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 2) - - def disableDC3LowVoltageTurnOff(self) -> None: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 2) - - # DCDC2 85% low voltage turn Off PMIC function - def enableDC2LowVoltageTurnOff(self) -> None: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 1) - - def disableDC2LowVoltageTurnOff(self) -> None: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 1) - - # DCDC1 85% low voltage turn Off PMIC function - def enableDC1LowVoltageTurnOff(self) -> None: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 0) - - def disableDC1LowVoltageTurnOff(self) -> None: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 0) - - # Set the minimum system operating voltage inside the PMU, - # below this value will shut down the PMU,Adjustment range 2600mV~3300mV - def setSysPowerDownVoltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_VSYS_VOL_THRESHOLD_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_VSYS_VOL_THRESHOLD_STEPS) - if (millivolt < _AXP2101_VSYS_VOL_THRESHOLD_MIN): - raise ValueError("Mistake ! The minimum settable voltage of VSYS is %u mV" % - _AXP2101_VSYS_VOL_THRESHOLD_MIN) - elif (millivolt > _AXP2101_VSYS_VOL_THRESHOLD_MAX): - raise ValueError("Mistake ! The maximum settable voltage of VSYS is %u mV" % - _AXP2101_VSYS_VOL_THRESHOLD_MAX) - - val = super().readRegister(_AXP2101_VOFF_SET)[0] - val &= 0xF8 - super().writeRegister(_AXP2101_VOFF_SET, val | (int)((millivolt - - _AXP2101_VSYS_VOL_THRESHOLD_MIN) / _AXP2101_VSYS_VOL_THRESHOLD_STEPS)) - - def getSysPowerDownVoltage(self) -> int: - val = super().readRegister(_AXP2101_VOFF_SET)[0] - return (val & 0x07) * _AXP2101_VSYS_VOL_THRESHOLD_STEPS + _AXP2101_VSYS_VOL_THRESHOLD_MIN - - # PWROK setting and PWROFF sequence control 25. - # Check the PWROK Pin enable after all dcdc/ldo output valid 128ms - def enablePwrOk(self) -> None: - super().setRegisterBit(_AXP2101_PWROK_SEQU_CTRL, 4) - - def disablePwrOk(self) -> None: - super().clrRegisterBit(_AXP2101_PWROK_SEQU_CTRL, 4) - - # POWEROFF Delay 4ms after PWROK enable - def enablePowerOffDelay(self) -> None: - super().setRegisterBit(_AXP2101_PWROK_SEQU_CTRL, 3) - - # POWEROFF Delay 4ms after PWROK disable - def disablePowerOffDelay(self) -> None: - super().clrRegisterBit(_AXP2101_PWROK_SEQU_CTRL, 3) - - # POWEROFF Sequence Control the reverse of the Startup - def enablePowerSequence(self) -> None: - super().setRegisterBit(_AXP2101_PWROK_SEQU_CTRL, 2) - - # POWEROFF Sequence Control at the same time - def disablePowerSequence(self) -> None: - super().clrRegisterBit(_AXP2101_PWROK_SEQU_CTRL, 2) - - # Delay of PWROK after all power output good - def setPwrOkDelay(self, opt: int) -> None: - val = super().readRegister(_AXP2101_PWROK_SEQU_CTRL)[0] - val &= 0xFC - super().writeRegister(_AXP2101_PWROK_SEQU_CTRL, val | opt) - - def getPwrOkDelay(self) -> int: - return (super().readRegister(_AXP2101_PWROK_SEQU_CTRL)[0] & 0x03) - - # Sleep and 26 - def wakeupControl(self, opt: int, enable: bool) -> None: - val = super().readRegister(_AXP2101_SLEEP_WAKEUP_CTRL)[0] - if enable: - val |= opt - else: - val &= (~opt) - super().writeRegister(_AXP2101_SLEEP_WAKEUP_CTRL, val) - - def enableWakeup(self) -> None: - super().setRegisterBit(_AXP2101_SLEEP_WAKEUP_CTRL, 1) - - def disableWakeup(self) -> None: - super().clrRegisterBit(_AXP2101_SLEEP_WAKEUP_CTRL, 1) - - def enableSleep(self) -> None: - super().setRegisterBit(_AXP2101_SLEEP_WAKEUP_CTRL, 0) - - def disableSleep(self) -> None: - super().clrRegisterBit(_AXP2101_SLEEP_WAKEUP_CTRL, 0) - - # RQLEVEL/OFFLEVEL/ONLEVEL setting 27 - # @brief IRQLEVEL configur - # @param opt: 0:1s 1:1.5s 2:2s 3:2.5s - def setIrqLevel(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError('IRQ level must be a value within 0-3!') - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - val &= 0xFC - super().writeRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 4)) - - # @brief OFFLEVEL configuration - # @param opt: 0:4s 1:6s 2:8s 3:10s - def setOffLevel(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError('OFF level must be a value within 0-3!') - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - super().writeRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 2)) - - # @brief ONLEVEL configuration - # @param opt: 0:128ms 1:512ms 2:1s 3:2s - def setOnLevel(self, opt: int) -> None: - if not 0 <= opt <= 3: - raise ValueError('ON level must be a value within 0-3!') - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - super().writeRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | opt) - - # Fast pwron setting 0 28 - # Fast Power On Start Sequence - def setDc4FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | ((opt & 0x3) << 6)) - - def setDc3FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | ((opt & 0x3) << 4)) - - def setDc2FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | ((opt & 0x3) << 2)) - - def setDc1FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | (opt & 0x3)) - - # Fast pwron setting 1 29 - def setAldo3FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | ((opt & 0x3) << 6)) - - def setAldo2FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | ((opt & 0x3) << 4)) - - def setAldo1FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | ((opt & 0x3) << 2)) - - def setDc5FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | (opt & 0x3)) - - # Fast pwron setting 2 2A - def setCpuldoFastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | ((opt & 0x3) << 6)) - - def setBldo2FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | ((opt & 0x3) << 4)) - - def setBldo1FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | ((opt & 0x3) << 2)) - - def setAldo4FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | (opt & 0x3)) - - # Fast pwron setting 3 2B - def setDldo2FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_CTRL)[0] - super().writeRegister(_AXP2101_FAST_PWRON_CTRL, val | ((opt & 0x3) << 2)) - - def setDldo1FastStartSequence(self, opt: int) -> None: - val = super().readRegister(_AXP2101_FAST_PWRON_CTRL)[0] - super().writeRegister(_AXP2101_FAST_PWRON_CTRL, val | (opt & 0x3)) - - # @brief Setting Fast Power On Start Sequence - def setFastPowerOnLevel(self, opt, seq_level) -> None: - if opt == self.XPOWERSAXP2101_FAST_DCDC1: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | seq_level) - elif opt == self.XPOWERSAXP2101_FAST_DCDC2: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | (seq_level << 2)) - elif opt == self.XPOWERSAXP2101_FAST_DCDC3: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | (seq_level << 4)) - elif opt == self.XPOWERSAXP2101_FAST_DCDC4: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val | (seq_level << 6)) - elif opt == self.XPOWERSAXP2101_FAST_DCDC5: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | seq_level) - elif opt == self.XPOWERSAXP2101_FAST_ALDO1: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | (seq_level << 2)) - elif opt == self.XPOWERSAXP2101_FAST_ALDO2: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | (seq_level << 4)) - elif opt == self.XPOWERSAXP2101_FAST_ALDO3: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val | (seq_level << 6)) - elif opt == self.XPOWERSAXP2101_FAST_ALDO4: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | seq_level) - elif opt == self.XPOWERSAXP2101_FAST_BLDO1: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | (seq_level << 2)) - elif opt == self.XPOWERSAXP2101_FAST_BLDO2: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | (seq_level << 4)) - elif opt == self.XPOWERSAXP2101_FAST_CPUSLDO: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val | (seq_level << 6)) - elif opt == self.XPOWERSAXP2101_FAST_DLDO1: - val = super().readRegister(_AXP2101_FAST_PWRON_CTRL)[0] - super().writeRegister(_AXP2101_FAST_PWRON_CTRL, val | seq_level) - elif opt == self.XPOWERSAXP2101_FAST_DLDO2: - val = super().readRegister(_AXP2101_FAST_PWRON_CTRL)[0] - super().writeRegister(_AXP2101_FAST_PWRON_CTRL, val | (seq_level << 2)) - - def disableFastPowerOn(self, opt: int) -> None: - if opt == self.XPOWERSAXP2101_FAST_DCDC1: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val & 0xFC) - elif opt == self.XPOWERSAXP2101_FAST_DCDC2: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val & 0xF3) - elif opt == self.XPOWERSAXP2101_FAST_DCDC3: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val & 0xCF) - elif opt == self.XPOWERSAXP2101_FAST_DCDC4: - val = super().readRegister(_AXP2101_FAST_PWRON_SET0)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET0, val & 0x3F) - elif opt == self.XPOWERSAXP2101_FAST_DCDC5: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val & 0xFC) - elif opt == self.XPOWERSAXP2101_FAST_ALDO1: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val & 0xF3) - elif opt == self.XPOWERSAXP2101_FAST_ALDO2: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val & 0xCF) - elif opt == self.XPOWERSAXP2101_FAST_ALDO3: - val = super().readRegister(_AXP2101_FAST_PWRON_SET1)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET1, val & 0x3F) - elif opt == self.XPOWERSAXP2101_FAST_ALDO4: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val & 0xFC) - elif opt == self.XPOWERSAXP2101_FAST_BLDO1: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val & 0xF3) - elif opt == self.XPOWERSAXP2101_FAST_BLDO2: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val & 0xCF) - elif opt == self.XPOWERSAXP2101_FAST_CPUSLDO: - val = super().readRegister(_AXP2101_FAST_PWRON_SET2)[0] - super().writeRegister(_AXP2101_FAST_PWRON_SET2, val & 0x3F) - elif opt == self.XPOWERSAXP2101_FAST_DLDO1: - val = super().readRegister(_AXP2101_FAST_PWRON_CTRL)[0] - super().writeRegister(_AXP2101_FAST_PWRON_CTRL, val & 0xFC) - elif opt == self.XPOWERSAXP2101_FAST_DLDO2: - val = super().readRegister(_AXP2101_FAST_PWRON_CTRL)[0] - super().writeRegister(_AXP2101_FAST_PWRON_CTRL, val & 0xF3) - - def enableFastPowerOnCtrl(self) -> None: - super().setRegisterBit(_AXP2101_FAST_PWRON_CTRL, 7) - - def disableFastPowerOnCtrl(self) -> None: - super().clrRegisterBit(_AXP2101_FAST_PWRON_CTRL, 7) - - def enableFastWakeup(self) -> None: - super().setRegisterBit(_AXP2101_FAST_PWRON_CTRL, 6) - - def disableFastWakeup(self) -> None: - super().clrRegisterBit(_AXP2101_FAST_PWRON_CTRL, 6) - - # DCDC 120%(130%) high voltage turn off PMIC function - def setDCHighVoltagePowerDown(self, en: bool) -> None: - if en: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 5) - else: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 5) - - def getDCHighVoltagePowerDownEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 5)) - - # DCDCS force PWM control - def setDcUVPDebounceTime(self, opt: int) -> None: - val = super().readRegister(_AXP2101_DC_FORCE_PWM_CTRL)[0] - val &= 0xFC - super().writeRegister(_AXP2101_DC_FORCE_PWM_CTRL, val | opt) - - def settDC1WorkModeToPwm(self, enable: bool) -> None: - if enable: - super().setRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 2) - else: - super().clrRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 2) - - def settDC2WorkModeToPwm(self, enable: bool) -> None: - if enable: - super().setRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 3) - else: - super().clrRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 3) - - def settDC3WorkModeToPwm(self, enable: bool) -> None: - if enable: - super().setRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 4) - else: - super().clrRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 4) - - def settDC4WorkModeToPwm(self, enable: bool) -> None: - if enable: - super().setRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 5) - else: - super().clrRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 5) - - # 1 = 100khz 0=50khz - def setDCFreqSpreadRange(self, opt: int) -> None: - if not 0 <= opt <= 1: - raise ValueError( - 'set DCDC freq spread range must be a value within 0-1!') - if opt: - super().setRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 6) - else: - super().clrRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 6) - - def setDCFreqSpreadRangeEn(self, en: bool) -> None: - if en: - super().setRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 7) - else: - super().clrRegisterBit(_AXP2101_DC_FORCE_PWM_CTRL, 7) - - # Power control DCDC1 functions - def isEnableDC1(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 0)) - - def enableDC1(self) -> None: - super().setRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 0) - - def disableDC1(self) -> None: - super().clrRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 0) - - def setDC1Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_DCDC1_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_DCDC1_VOL_STEPS) - if (millivolt < _AXP2101_DCDC1_VOL_MIN): - raise ValueError("Mistake ! DC1 minimum voltage is %u mV" % - _AXP2101_DCDC1_VOL_MIN) - elif (millivolt > _AXP2101_DCDC1_VOL_MAX): - raise ValueError("Mistake ! DC1 maximum voltage is %u mV" % - _AXP2101_DCDC1_VOL_MAX) - super().writeRegister(_AXP2101_DC_VOL0_CTRL, (int)((millivolt - - _AXP2101_DCDC1_VOL_MIN) / _AXP2101_DCDC1_VOL_STEPS)) - - def getDC1Voltage(self) -> int: - return (super().readRegister(_AXP2101_DC_VOL0_CTRL)[0] & 0x1F) * _AXP2101_DCDC1_VOL_STEPS + _AXP2101_DCDC1_VOL_MIN - - # DCDC1 85% low voltage turn off PMIC function - def setDC1LowVoltagePowerDown(self, en): - if en: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 0) - else: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 0) - - def getDC1LowVoltagePowerDownEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 0)) - - # Power control DCDC2 functions - def isEnableDC2(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 1)) - - def enableDC2(self) -> None: - super().setRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 1) - - def disableDC2(self) -> None: - super().clrRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 1) - - def setDC2Voltage(self, millivolt: int) -> None: - val = super().readRegister(_AXP2101_DC_VOL1_CTRL)[0] - val &= 0x80 - if (millivolt >= _AXP2101_DCDC2_VOL1_MIN and millivolt <= _AXP2101_DCDC2_VOL1_MAX): - if (millivolt % _AXP2101_DCDC2_VOL_STEPS1): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC2_VOL_STEPS1) - super().writeRegister(_AXP2101_DC_VOL1_CTRL, val | (int)((millivolt - - _AXP2101_DCDC2_VOL1_MIN) / _AXP2101_DCDC2_VOL_STEPS1)) - elif (millivolt >= _AXP2101_DCDC2_VOL2_MIN and millivolt <= _AXP2101_DCDC2_VOL2_MAX): - if (millivolt % _AXP2101_DCDC2_VOL_STEPS2): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC2_VOL_STEPS2) - val |= (int)((((millivolt - _AXP2101_DCDC2_VOL2_MIN) / - _AXP2101_DCDC2_VOL_STEPS2) + _AXP2101_DCDC2_VOL_STEPS2_BASE)) - super().writeRegister(_AXP2101_DC_VOL1_CTRL, val) - - def getDC2Voltage(self) -> int: - val = super().readRegister(_AXP2101_DC_VOL1_CTRL)[0] - val &= 0x7F - if (val < _AXP2101_DCDC2_VOL_STEPS2_BASE): - return (val * _AXP2101_DCDC2_VOL_STEPS1) + _AXP2101_DCDC2_VOL1_MIN - return (val * _AXP2101_DCDC2_VOL_STEPS2) - 200 - - def getDC2WorkMode(self) -> int: - return super().getRegisterBit(_AXP2101_DCDC2_VOL_STEPS2, 7) - - def setDC2LowVoltagePowerDown(self, en: bool) -> None: - if en: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 1) - else: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 1) - - def getDC2LowVoltagePowerDownEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 1)) - - # Power control DCDC3 functions - def isEnableDC3(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 2)) - - def enableDC3(self) -> None: - super().setRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 2) - - def disableDC3(self) -> None: - super().clrRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 2) - - # 0.5~1.2V,10mV/step,71steps - # 1.22~1.54V,20mV/step,17steps - # 1.6~3.4V,100mV/step,19steps - def setDC3Voltage(self, millivolt: int) -> None: - val = super().readRegister(_AXP2101_DC_VOL2_CTRL)[0] - val &= 0x80 - if (millivolt >= _AXP2101_DCDC3_VOL1_MIN and millivolt <= _AXP2101_DCDC3_VOL1_MAX): - if (millivolt % _AXP2101_DCDC3_VOL_STEPS1): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC3_VOL_STEPS1) - super().writeRegister(_AXP2101_DC_VOL2_CTRL, val | (int)((millivolt - - _AXP2101_DCDC3_VOL_MIN) / _AXP2101_DCDC3_VOL_STEPS1)) - elif (millivolt >= _AXP2101_DCDC3_VOL2_MIN and millivolt <= _AXP2101_DCDC3_VOL2_MAX): - if (millivolt % _AXP2101_DCDC3_VOL_STEPS2): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC3_VOL_STEPS2) - val |= (int)(((millivolt - _AXP2101_DCDC3_VOL2_MIN) / - _AXP2101_DCDC3_VOL_STEPS2) + _AXP2101_DCDC3_VOL_STEPS2_BASE) - super().writeRegister(_AXP2101_DC_VOL2_CTRL, val) - elif (millivolt >= _AXP2101_DCDC3_VOL3_MIN and millivolt <= _AXP2101_DCDC3_VOL3_MAX): - if (millivolt % _AXP2101_DCDC3_VOL_STEPS3): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC3_VOL_STEPS3) - val |= (int)(((millivolt - _AXP2101_DCDC3_VOL3_MIN) / - _AXP2101_DCDC3_VOL_STEPS3) + _AXP2101_DCDC3_VOL_STEPS3_BASE) - super().writeRegister(_AXP2101_DC_VOL2_CTRL, val) - - def getDC3Voltage(self) -> int: - val = super().readRegister(_AXP2101_DC_VOL2_CTRL)[0] & 0x7F - if (val < _AXP2101_DCDC3_VOL_STEPS2_BASE): - return (val * _AXP2101_DCDC3_VOL_STEPS1) + _AXP2101_DCDC3_VOL_MIN - elif (val >= _AXP2101_DCDC3_VOL_STEPS2_BASE and val < _AXP2101_DCDC3_VOL_STEPS3_BASE): - return (val * _AXP2101_DCDC3_VOL_STEPS2) - 200 - return (val * _AXP2101_DCDC3_VOL_STEPS3) - 7200 - - def getDC3WorkMode(self) -> None: - return super().getRegisterBit(_AXP2101_DC_VOL2_CTRL, 7) - - # DCDC3 85% low voltage turn off PMIC function - def setDC3LowVoltagePowerDown(self, en: bool) -> None: - if en: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 2) - else: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 2) - - def getDC3LowVoltagePowerDownEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 2)) - - # Power control DCDC4 functions - # 0.5~1.2V,10mV/step,71steps - # 1.22~1.84V,20mV/step,32steps - def isEnableDC4(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 3)) - - def enableDC4(self) -> None: - super().setRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 3) - - def disableDC4(self) -> None: - super().clrRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 3) - - def setDC4Voltage(self, millivolt: int) -> None: - val = super().readRegister(_AXP2101_DC_VOL3_CTRL)[0] - val &= 0x80 - if (millivolt >= _AXP2101_DCDC4_VOL1_MIN and millivolt <= _AXP2101_DCDC4_VOL1_MAX): - if (millivolt % _AXP2101_DCDC4_VOL_STEPS1): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC4_VOL_STEPS1) - super().writeRegister(_AXP2101_DC_VOL3_CTRL, val | (int)((millivolt - - _AXP2101_DCDC4_VOL1_MIN) / _AXP2101_DCDC4_VOL_STEPS1)) - elif (millivolt >= _AXP2101_DCDC4_VOL2_MIN and millivolt <= _AXP2101_DCDC4_VOL2_MAX): - if (millivolt % _AXP2101_DCDC4_VOL_STEPS2): - raise ValueError("Mistake ! The steps is must %umV" % - _AXP2101_DCDC4_VOL_STEPS2) - val |= (int)(((millivolt - _AXP2101_DCDC4_VOL2_MIN) / - _AXP2101_DCDC4_VOL_STEPS2) + _AXP2101_DCDC4_VOL_STEPS2_BASE) - super().writeRegister(_AXP2101_DC_VOL3_CTRL, val) - - def getDC4Voltage(self) -> int: - val = super().readRegister(_AXP2101_DC_VOL3_CTRL)[0] - val &= 0x7F - if (val < _AXP2101_DCDC4_VOL_STEPS2_BASE): - return (val * _AXP2101_DCDC4_VOL_STEPS1) + _AXP2101_DCDC4_VOL1_MIN - return (val * _AXP2101_DCDC4_VOL_STEPS2) - 200 - - # DCDC4 85% low voltage turn off PMIC function - def setDC4LowVoltagePowerDown(self, en: bool) -> None: - if en: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 3) - else: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 3) - - def getDC4LowVoltagePowerDownEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 3)) - - # Power control DCDC5 functions,Output to gpio pin - def isEnableDC5(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 4)) - - def enableDC5(self) -> None: - super().setRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 4) - - def disableDC5(self) -> None: - super().clrRegisterBit(_AXP2101_DC_ONOFF_DVM_CTRL, 4) - - def setDC5Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_DCDC5_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_DCDC5_VOL_STEPS) - if (millivolt != _AXP2101_DCDC5_VOL_1200MV and millivolt < _AXP2101_DCDC5_VOL_MIN): - raise ValueError("Mistake ! DC5 minimum voltage is %umV ,%umV" % - (_AXP2101_DCDC5_VOL_1200MV, _AXP2101_DCDC5_VOL_MIN)) - elif (millivolt > _AXP2101_DCDC5_VOL_MAX): - raise ValueError("Mistake ! DC5 maximum voltage is %umV" % - _AXP2101_DCDC5_VOL_MAX) - - val = super().readRegister(_AXP2101_DC_VOL4_CTRL)[0] - val &= 0xE0 - if (millivolt == _AXP2101_DCDC5_VOL_1200MV): - super().writeRegister(_AXP2101_DC_VOL4_CTRL, - val | _AXP2101_DCDC5_VOL_VAL) - val |= (int)((millivolt - _AXP2101_DCDC5_VOL_MIN) / - _AXP2101_DCDC5_VOL_STEPS) - super().writeRegister(_AXP2101_DC_VOL4_CTRL, val) - - def getDC5Voltage(self) -> int: - val = super().readRegister(_AXP2101_DC_VOL4_CTRL)[0] - val &= 0x1F - if (val == _AXP2101_DCDC5_VOL_VAL): - return _AXP2101_DCDC5_VOL_1200MV - return (val * _AXP2101_DCDC5_VOL_STEPS) + _AXP2101_DCDC5_VOL_MIN - - def isDC5FreqCompensationEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_VOL4_CTRL, 5)) - - def enableDC5FreqCompensation(self) -> None: - super().setRegisterBit(_AXP2101_DC_VOL4_CTRL, 5) - - def disableFreqCompensation(self) -> None: - super().clrRegisterBit(_AXP2101_DC_VOL4_CTRL, 5) - - # DCDC4 85% low voltage turn off PMIC function - def setDC5LowVoltagePowerDown(self, en: bool) -> None: - if en: - super().setRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 4) - else: - super().clrRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 4) - - def getDC5LowVoltagePowerDownEn(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_DC_OVP_UVP_CTRL, 4)) - - # Power control ALDO1 functions - def isEnableALDO1(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 0)) - - def enableALDO1(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 0) - - def disableALDO1(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 0) - - def setALDO1Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_ALDO1_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_ALDO1_VOL_STEPS) - if (millivolt < _AXP2101_ALDO1_VOL_MIN): - raise ValueError("Mistake ! ALDO1 minimum output voltage is %umV" % - _AXP2101_ALDO1_VOL_MIN) - elif (millivolt > _AXP2101_ALDO1_VOL_MAX): - raise ValueError("Mistake ! ALDO1 maximum output voltage is %umV" % - _AXP2101_ALDO1_VOL_MAX) - - val = super().readRegister(_AXP2101_LDO_VOL0_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_ALDO1_VOL_MIN) / - _AXP2101_ALDO1_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL0_CTRL, val) - - def getALDO1Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL0_CTRL)[0] & 0x1F - return val * _AXP2101_ALDO1_VOL_STEPS + _AXP2101_ALDO1_VOL_MIN - - # Power control ALDO2 functions - def isEnableALDO2(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 1)) - - def enableALDO2(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 1) - - def disableALDO2(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 1) - - def setALDO2Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_ALDO2_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_ALDO2_VOL_STEPS) - if (millivolt < _AXP2101_ALDO2_VOL_MIN): - raise ValueError("Mistake ! ALDO2 minimum output voltage is %umV" % - _AXP2101_ALDO2_VOL_MIN) - elif (millivolt > _AXP2101_ALDO2_VOL_MAX): - raise ValueError("Mistake ! ALDO2 maximum output voltage is %umV" % - _AXP2101_ALDO2_VOL_MAX) - - val = super().readRegister(_AXP2101_LDO_VOL1_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_ALDO2_VOL_MIN) / - _AXP2101_ALDO2_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL1_CTRL, val) - - def getALDO2Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL1_CTRL)[0] & 0x1F - return val * _AXP2101_ALDO2_VOL_STEPS + _AXP2101_ALDO2_VOL_MIN - - # Power control ALDO3 functions - def isEnableALDO3(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 2)) - - def enableALDO3(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 2) - - def disableALDO3(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 2) - - def setALDO3Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_ALDO3_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_ALDO3_VOL_STEPS) - if (millivolt < _AXP2101_ALDO3_VOL_MIN): - raise ValueError("Mistake ! ALDO3 minimum output voltage is %umV" % - _AXP2101_ALDO3_VOL_MIN) - elif (millivolt > _AXP2101_ALDO3_VOL_MAX): - raise ValueError("Mistake ! ALDO3 maximum output voltage is %umV" % - _AXP2101_ALDO3_VOL_MAX) - - val = super().readRegister(_AXP2101_LDO_VOL2_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_ALDO3_VOL_MIN) / - _AXP2101_ALDO3_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL2_CTRL, val) - - def getALDO3Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL2_CTRL)[0] & 0x1F - return val * _AXP2101_ALDO3_VOL_STEPS + _AXP2101_ALDO3_VOL_MIN - - # Power control ALDO4 functions - def isEnableALDO4(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 3)) - - def enableALDO4(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 3) - - def disableALDO4(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 3) - - def setALDO4Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_ALDO4_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_ALDO4_VOL_STEPS) - if (millivolt < _AXP2101_ALDO4_VOL_MIN): - raise ValueError("Mistake ! ALDO4 minimum output voltage is %umV" % - _AXP2101_ALDO4_VOL_MIN) - elif (millivolt > _AXP2101_ALDO4_VOL_MAX): - raise ValueError("Mistake ! ALDO4 maximum output voltage is %umV" % - _AXP2101_ALDO4_VOL_MAX) - val = super().readRegister(_AXP2101_LDO_VOL3_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_ALDO4_VOL_MIN) / - _AXP2101_ALDO4_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL3_CTRL, val) - - def getALDO4Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL3_CTRL)[0] & 0x1F - return val * _AXP2101_ALDO4_VOL_STEPS + _AXP2101_ALDO4_VOL_MIN - - # Power control BLDO1 functions - def isEnableBLDO1(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 4)) - - def enableBLDO1(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 4) - - def disableBLDO1(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 4) - - def setBLDO1Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_BLDO1_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_BLDO1_VOL_STEPS) - if (millivolt < _AXP2101_BLDO1_VOL_MIN): - raise ValueError("Mistake ! BLDO1 minimum output voltage is %umV" % - _AXP2101_BLDO1_VOL_MIN) - elif (millivolt > _AXP2101_BLDO1_VOL_MAX): - raise ValueError("Mistake ! BLDO1 maximum output voltage is %umV" % - _AXP2101_BLDO1_VOL_MAX) - val = super().readRegister(_AXP2101_LDO_VOL4_CTRL)[0] - val &= 0xE0 - val |= (int)((millivolt - _AXP2101_BLDO1_VOL_MIN) / - _AXP2101_BLDO1_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL4_CTRL, val) - - def getBLDO1Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL4_CTRL)[0] - val &= 0x1F - return val * _AXP2101_BLDO1_VOL_STEPS + _AXP2101_BLDO1_VOL_MIN - - # Power control BLDO2 functions - def isEnableBLDO2(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 5)) - - def enableBLDO2(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 5) - - def disableBLDO2(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 5) - - def setBLDO2Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_BLDO2_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_BLDO2_VOL_STEPS) - if (millivolt < _AXP2101_BLDO2_VOL_MIN): - raise ValueError("Mistake ! BLDO2 minimum output voltage is %umV" % - _AXP2101_BLDO2_VOL_MIN) - elif (millivolt > _AXP2101_BLDO2_VOL_MAX): - raise ValueError("Mistake ! BLDO2 maximum output voltage is %umV" % - _AXP2101_BLDO2_VOL_MAX) - val = super().readRegister(_AXP2101_LDO_VOL5_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_BLDO2_VOL_MIN) / - _AXP2101_BLDO2_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL5_CTRL, val) - - def getBLDO2Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL5_CTRL)[0] - val &= 0x1F - return val * _AXP2101_BLDO2_VOL_STEPS + _AXP2101_BLDO2_VOL_MIN - - # Power control CPUSLDO functions - def isEnableCPUSLDO(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 6)) - - def enableCPUSLDO(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 6) - - def disableCPUSLDO(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 6) - - def setCPUSLDOVoltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_CPUSLDO_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_CPUSLDO_VOL_STEPS) - if (millivolt < _AXP2101_CPUSLDO_VOL_MIN): - raise ValueError("Mistake ! CPULDO minimum output voltage is %umV" % - _AXP2101_CPUSLDO_VOL_MIN) - elif (millivolt > _AXP2101_CPUSLDO_VOL_MAX): - raise ValueError("Mistake ! CPULDO maximum output voltage is %umV" % - _AXP2101_CPUSLDO_VOL_MAX) - val = super().readRegister(_AXP2101_LDO_VOL6_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_CPUSLDO_VOL_MIN) / - _AXP2101_CPUSLDO_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL6_CTRL, val) - - def getCPUSLDOVoltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL6_CTRL)[0] - val &= 0x1F - return val * _AXP2101_CPUSLDO_VOL_STEPS + _AXP2101_CPUSLDO_VOL_MIN - - # Power control DLDO1 functions - def isEnableDLDO1(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 7)) - - def enableDLDO1(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 7) - - def disableDLDO1(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL0, 7) - - def setDLDO1Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_DLDO1_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_DLDO1_VOL_STEPS) - if (millivolt < _AXP2101_DLDO1_VOL_MIN): - raise ValueError("Mistake ! DLDO1 minimum output voltage is %umV" % - _AXP2101_DLDO1_VOL_MIN) - elif (millivolt > _AXP2101_DLDO1_VOL_MAX): - raise ValueError("Mistake ! DLDO1 maximum output voltage is %umV" % - _AXP2101_DLDO1_VOL_MAX) - val = super().readRegister(_AXP2101_LDO_VOL7_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_DLDO1_VOL_MIN) / - _AXP2101_DLDO1_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL7_CTRL, val) - - def getDLDO1Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL7_CTRL)[0] - val &= 0x1F - return val * _AXP2101_DLDO1_VOL_STEPS + _AXP2101_DLDO1_VOL_MIN - - # Power control DLDO2 functions - def isEnableDLDO2(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_LDO_ONOFF_CTRL1, 0)) - - def enableDLDO2(self) -> None: - super().setRegisterBit(_AXP2101_LDO_ONOFF_CTRL1, 0) - - def disableDLDO2(self) -> None: - super().clrRegisterBit(_AXP2101_LDO_ONOFF_CTRL1, 0) - - def setDLDO2Voltage(self, millivolt: int) -> None: - if (millivolt % _AXP2101_DLDO2_VOL_STEPS): - raise ValueError("Mistake ! The steps is must %u mV" % - _AXP2101_DLDO2_VOL_STEPS) - if (millivolt < _AXP2101_DLDO2_VOL_MIN): - raise ValueError("Mistake ! DLDO2 minimum output voltage is %umV" % - _AXP2101_DLDO2_VOL_MIN) - elif (millivolt > _AXP2101_DLDO2_VOL_MAX): - raise ValueError("Mistake ! DLDO2 maximum output voltage is %umV" % - _AXP2101_DLDO2_VOL_MAX) - val = super().readRegister(_AXP2101_LDO_VOL8_CTRL)[0] & 0xE0 - val |= (int)((millivolt - _AXP2101_DLDO2_VOL_MIN) / - _AXP2101_DLDO2_VOL_STEPS) - super().writeRegister(_AXP2101_LDO_VOL8_CTRL, val) - - def getDLDO2Voltage(self) -> int: - val = super().readRegister(_AXP2101_LDO_VOL8_CTRL)[0] - val &= 0x1F - return val * _AXP2101_DLDO2_VOL_STEPS + _AXP2101_DLDO2_VOL_MIN - - # Power ON OFF IRQ TIMMING Control method - def setIrqLevelTime(self, opt: int): - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - val &= 0xCF - super().writeRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 4)) - - def getIrqLevelTime(self) -> int: - return ((super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] & 0x30) >> 4) - - # @brief Set the PEKEY power-on long press time. - # @param opt: See _press_on_time_t enum for details. - def setPowerKeyPressOnTime(self, opt: int): - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - val &= 0xFC - super().writeRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | opt) - - # @brief Get the PEKEY power-on long press time. - # @retval See _press_on_time_t enum for details. - def getPowerKeyPressOnTime(self) -> int: - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - return (val & 0x03) - - # @brief Set the PEKEY power-off long press time. - # @param opt: See _press_off_time_t enum for details. - # @retval - def setPowerKeyPressOffTime(self, opt: int): - val = super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] - val &= 0xF3 - super().writeRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL, val | (opt << 2)) - - # @brief Get the PEKEY power-off long press time. - # @retval See _press_off_time_t enum for details. - def getPowerKeyPressOffTime(self) -> int: - return ((super().readRegister(_AXP2101_IRQ_OFF_ON_LEVEL_CTRL)[0] & 0x0C) >> 2) - - # ADC Control method - def enableGeneralAdcChannel(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 5) - - def disableGeneralAdcChannel(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 5) - - def enableTemperatureMeasure(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 4) - - def disableTemperatureMeasure(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 4) - - def getTemperature(self) -> float: - raw = super().readRegisterH6L8(_AXP2101_ADC_DATA_RELUST8, _AXP2101_ADC_DATA_RELUST9) - return (22.0 + (7274 - raw) / 20.0) - - def enableSystemVoltageMeasure(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 3) - - def disableSystemVoltageMeasure(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 3) - - def getSystemVoltage(self) -> int: - return super().readRegisterH6L8(_AXP2101_ADC_DATA_RELUST6, _AXP2101_ADC_DATA_RELUST7) - - def enableVbusVoltageMeasure(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 2) - - def disableVbusVoltageMeasure(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 2) - - def getVbusVoltage(self) -> int: - return super().readRegisterH6L8(_AXP2101_ADC_DATA_RELUST4, _AXP2101_ADC_DATA_RELUST5) - - def enableTSPinMeasure(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 1) - - def disableTSPinMeasure(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 1) - - def enableTSPinLowFreqSample(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 7) - - def disableTSPinLowFreqSample(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_DATA_RELUST2, 7) - - def getTsTemperature(self) -> int: - return super().readRegisterH6L8(_AXP2101_ADC_DATA_RELUST2, _AXP2101_ADC_DATA_RELUST3) - - def enableBattVoltageMeasure(self) -> None: - super().setRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 0) - - def disableBattVoltageMeasure(self) -> None: - super().clrRegisterBit(_AXP2101_ADC_CHANNEL_CTRL, 0) - - def enableBattDetection(self) -> None: - super().setRegisterBit(_AXP2101_BAT_DET_CTRL, 0) - - def disableBattDetection(self) -> None: - super().clrRegisterBit(_AXP2101_BAT_DET_CTRL, 0) - - def getBattVoltage(self) -> int: - if not self.isBatteryConnect(): - return 0 - return super().readRegisterH5L8(_AXP2101_ADC_DATA_RELUST0, _AXP2101_ADC_DATA_RELUST1) - - def getBatteryPercent(self) -> int: - if not self.isBatteryConnect(): - return -1 - return super().readRegister(_AXP2101_BAT_PERCENT_DATA)[0] - - # CHG LED setting and control - # @brief Set charging led mode. - def setChargingLedMode(self, mode: int) -> None: - range = [self.XPOWERS_CHG_LED_OFF, self.XPOWERS_CHG_LED_BLINK_1HZ, - self.XPOWERS_CHG_LED_BLINK_4HZ, self.XPOWERS_CHG_LED_ON] - if mode in range: - val = super().readRegister(_AXP2101_CHGLED_SET_CTRL)[0] - val &= 0xC8 - val |= 0x05 # use manual ctrl - val |= (mode << 4) - super().writeRegister(_AXP2101_CHGLED_SET_CTRL, val) - else: - val = super().readRegister(_AXP2101_CHGLED_SET_CTRL)[0] - val &= 0xF9 - super().writeRegister(_AXP2101_CHGLED_SET_CTRL, val | 0x01) # use type A mode - - def getChargingLedMode(self) -> int: - val = super().readRegister(_AXP2101_CHGLED_SET_CTRL)[0] - val >>= 1 - if (val & 0x02) == 0x02: - val >>= 4 - return val & 0x03 - return self.XPOWERS_CHG_LED_CTRL_CHG - - # @brief 预充电充电电流限制 - # @note Precharge current limit 25N mA - # @param opt: 25 opt - # # @retval None - def setPrechargeCurr(self, opt: int) -> None: - val = super().readRegister(_AXP2101_IPRECHG_SET)[0] - val &= 0xFC - super().writeRegister(_AXP2101_IPRECHG_SET, val | opt) - - def getPrechargeCurr(self) -> None: - return (super().readRegister(_AXP2101_IPRECHG_SET)[0] & 0x03) - - # @brief Set charge current. - # @param opt: See _axp2101_chg_curr_t enum for details. - # @retval - def setChargerConstantCurr(self, opt: int) -> None: - if not 4 <= opt <= 16: - raise ValueError( - "Charger Constant Current must be a value within 4-16!") - val = super().readRegister(_AXP2101_ICC_CHG_SET)[0] - val &= 0xE0 - super().writeRegister(_AXP2101_ICC_CHG_SET, val | opt) - - # @brief Get charge current settings. - # @retval See _axp2101_chg_curr_t enum for details. - - def getChargerConstantCurr(self) -> int: - return (super().readRegister(_AXP2101_ICC_CHG_SET)[0] & 0x1F) - - # @brief 充电终止电流限制 - # @note Charging termination of current limit - - def setChargerTerminationCurr(self, opt: int) -> None: - val = super().readRegister(_AXP2101_ITERM_CHG_SET_CTRL)[0] - val &= 0xF0 - super().writeRegister(_AXP2101_ITERM_CHG_SET_CTRL, val | opt) - - def getChargerTerminationCurr(self) -> int: - return (super().readRegister(_AXP2101_ITERM_CHG_SET_CTRL)[0] & 0x0F) - - def enableChargerTerminationLimit(self) -> None: - val = super().readRegister(_AXP2101_ITERM_CHG_SET_CTRL)[0] - super().writeRegister(_AXP2101_ITERM_CHG_SET_CTRL, val | 0x10) - - def disableChargerTerminationLimit(self) -> None: - val = super().readRegister(_AXP2101_ITERM_CHG_SET_CTRL)[0] - super().writeRegister(_AXP2101_ITERM_CHG_SET_CTRL, val & 0xEF) - - def isChargerTerminationLimit(self) -> bool: - return bool(super().getRegisterBit(_AXP2101_ITERM_CHG_SET_CTRL, 4)) - - # @brief Set charge target voltage. - # @param opt: See _axp2101_chg_vol_t enum for details. - - def setChargeTargetVoltage(self, opt: int) -> None: - if not 1 <= opt <= 5: - raise ValueError( - "Charger target voltage must be a value within 0-3!") - val = super().readRegister(_AXP2101_CV_CHG_VOL_SET)[0] - val &= 0xFC - super().writeRegister(_AXP2101_CV_CHG_VOL_SET, val | opt) - - # @brief Get charge target voltage settings. - # @retval See _axp2101_chg_vol_t enum for details. - - def getChargeTargetVoltage(self) -> int: - return (super().readRegister(_AXP2101_CV_CHG_VOL_SET)[0] & 0x03) - - # @brief 设定热阈值 - # @note Thermal regulation threshold setting - def setThermaThreshold(self, opt: int) -> None: - val = super().readRegister(_AXP2101_THE_REGU_THRES_SET)[0] - val &= 0xFC - super().writeRegister(_AXP2101_THE_REGU_THRES_SET, val | opt) - - def getThermaThreshold(self) -> int: - return (super().readRegister(_AXP2101_THE_REGU_THRES_SET)[0] & 0x03) - - def getBatteryParameter(self) -> int: - return super().readRegister(_AXP2101_BAT_PARAME)[0] - - def fuelGaugeControl(self, writeROM: bool, enable: bool) -> int: - if writeROM: - super().clrRegisterBit(_AXP2101_FUEL_GAUGE_CTRL, 4) - else: - super().setRegisterBit(_AXP2101_FUEL_GAUGE_CTRL, 4) - - if enable: - super().setRegisterBit(_AXP2101_FUEL_GAUGE_CTRL, 0) - else: - super().clrRegisterBit(_AXP2101_FUEL_GAUGE_CTRL, 0) - - # Interrupt status/control functions - # @brief Get the interrupt controller mask value. - # @retval Mask value corresponds to _axp2101_irq_t , - - def getIrqStatus(self) -> int: - self.statusRegister = super().readRegister(_AXP2101_INTSTS1, 3) - return (self.statusRegister[0] << 16) | (self.statusRegister[1] << 8) | (self.statusRegister[2]) - - # @brief Clear interrupt controller state. - def clearIrqStatus(self) -> None: - for i in range(0, _AXP2101_INTSTS_CNT): - super().writeRegister(_AXP2101_INTSTS1 + i, 0xFF) - self.statusRegister[i] = 0 - - # @brief Enable PMU interrupt control mask . - # @param opt: View the related chip type _axp2101_irq_t enumeration parameters in "Params.hpp" - def enableIRQ(self, opt: int, debug=False) -> None: - self._setInterruptImpl(opt, True, debug) - - # @brief Disable PMU interrupt control mask . - # @param opt: View the related chip type _axp2101_irq_t enumeration parameters in "Params.hpp" - def disableIRQ(self, opt: int, debug=False) -> None: - self._setInterruptImpl(opt, False, debug) - - # IRQ STATUS 0 - def isDropWarningLevel2Irq(self) -> bool: - mask = self.XPOWERS_AXP2101_WARNING_LEVEL2_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isDropWarningLevel1Irq(self) -> bool: - mask = self.XPOWERS_AXP2101_WARNING_LEVEL1_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isGaugeWdtTimeoutIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_WDT_TIMEOUT_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isBatChargerOverTemperatureIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_CHG_OVER_TEMP_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isBatChargerUnderTemperatureIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_CHG_UNDER_TEMP_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isBatWorkOverTemperatureIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_NOR_OVER_TEMP_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - def isBatWorkUnderTemperatureIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_NOR_UNDER_TEMP_IRQ - if self.intRegister[0] & mask: - return super()._IS_BIT_SET(self.statusRegister[0], mask) - else: - return False - - # IRQ STATUS 1 - def isVbusInsertIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_VBUS_INSERT_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isVbusRemoveIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_VBUS_REMOVE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBatInsertIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_INSERT_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isBatRemoveIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_REMOVE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isPekeyShortPressIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_PKEY_SHORT_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isPekeyLongPressIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_PKEY_LONG_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isPekeyNegativeIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - def isPekeyPositiveIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_PKEY_POSITIVE_IRQ >> 8 - if self.intRegister[1] & mask: - return super()._IS_BIT_SET(self.statusRegister[1], mask) - else: - return False - - # IRQ STATUS 2 - def isWdtExpireIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_WDT_EXPIRE_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isLdoOverCurrentIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_LDO_OVER_CURR_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isBatfetOverCurrentIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BATFET_OVER_CURR_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isBatChargeDoneIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_CHG_DONE_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isBatChargeStartIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_CHG_START_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isBatDieOverTemperatureIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_DIE_OVER_TEMP_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isChargeOverTimeoutIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_CHAGER_TIMER_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def isBatOverVoltageIrq(self) -> bool: - mask = self.XPOWERS_AXP2101_BAT_OVER_VOL_IRQ >> 16 - if self.intRegister[2] & mask: - return super()._IS_BIT_SET(self.statusRegister[2], mask) - else: - return False - - def getChipID(self) -> int: - return super().readRegister(_AXP2101_IC_TYPE)[0] - - def __to_bin(self, value, num) -> str: - bin_chars = "" - tmp = value - for i in range(num): - bin_char = bin(tmp % 2)[-1] - tmp = tmp // 2 - bin_chars = bin_char + bin_chars - return bin_chars.upper() - - def _setInterruptImpl(self, opts: int, enable: bool, debug: bool) -> None: - if debug: - print(("DISABLE", "ENABLE ")[enable], end='') - print(': HEX:{:#08X}'.format(opts), end='') - print(' BIN:', end='') - print(self.__to_bin(opts, 64)) - if (opts & 0x0000FF): - value = opts & 0xFF - if debug: - print('write in ints0 0b{0}'.format(self.__to_bin(value, 8))) - data = super().readRegister(_AXP2101_INTEN1)[0] - self.intRegister[0] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP2101_INTEN1, self.intRegister[0]) - if (opts & 0x00FF00): - value = opts >> 8 - if debug: - print('write in ints1 0b{0}'.format(self.__to_bin(value, 8))) - data = super().readRegister(_AXP2101_INTEN2)[0] - self.intRegister[1] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP2101_INTEN2, self.intRegister[1]) - if (opts & 0xFF0000): - value = opts >> 16 - if debug: - print('write in ints2 0b{0}'.format(self.__to_bin(value, 8))) - data = super().readRegister(_AXP2101_INTEN3)[0] - self.intRegister[2] = ((data & (~value)), (data | value))[enable] - super().writeRegister(_AXP2101_INTEN3, self.intRegister[2]) - - def printIntRegister(self) -> None: - for i in range(0, _AXP2101_INTSTS_CNT): - val = super().readRegister(_AXP2101_INTEN1+i)[0] - print('[{0}]HEX={1} BIN={2}'.format( - i, hex(val), self.__to_bin(val, 8))) diff --git a/libdeps/XPowersLib/Micropython/src/I2CInterface.py b/libdeps/XPowersLib/Micropython/src/I2CInterface.py deleted file mode 100644 index a84c410..0000000 --- a/libdeps/XPowersLib/Micropython/src/I2CInterface.py +++ /dev/null @@ -1,110 +0,0 @@ -''' -@license MIT License - -Copyright (c) 2022 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. - -@file I2CInterface.py -@author Lewis He (lewishe@outlook.com) -@date 2022-10-20 - -''' - -from sys import implementation - -if implementation.name == 'micropython': - from machine import Pin, I2C -if implementation.name == 'circuitpython': - from adafruit_bus_device import i2c_device - - -class I2CInterface: - def __init__(self, i2c_bus: I2C, addr: int) -> None: - if implementation.name == 'micropython': - print('micropython') - self._bus = i2c_bus - if implementation.name == 'circuitpython': - print('circuitpython') - self._bus = i2c_device.I2CDevice(i2c_bus, addr) - self._address = addr - - def _BV(self, bit) -> int: - return (1 << bit) - - def _IS_BIT_SET(self, val, mask) -> bool: - return bool((((val) & (mask)) == (mask))) - - def writeRegister(self, reg: int, val: int) -> None: - if implementation.name == 'micropython': - buf = bytearray(1) - buf[0] = val - self._bus.writeto_mem( - self._address, (reg & 0xFF), buf) - elif implementation.name == 'circuitpython': - buf = bytearray(2) - buf[0] = reg & 0xFF - buf[1] = val & 0xFF - with self._bus as i2c: - i2c.write(buf, start=0, end=2) - - def readRegister(self, reg: int, length: int = 1) -> list: - if implementation.name == 'micropython': - buf = bytearray(length) - self._bus.readfrom_mem_into( - self._address, (reg & 0xFF), buf) - return list(buf) - elif implementation.name == 'circuitpython': - with self._bus as i2c: - i2c.write(bytes([reg & 0xFF])) - result = bytearray(length) - i2c.readinto(result) - return result - - def getRegisterBit(self, reg, bit) -> bool: - val = self.readRegister(reg)[0] - return val & self._BV(bit) - - def setRegisterBit(self, reg: int, bit: int): - val = self.readRegister(reg)[0] - self.writeRegister(reg, (val | (self._BV(bit)))) - - def clrRegisterBit(self, reg: int, bit: int): - val = self.readRegister(reg)[0] - self.writeRegister(reg, (val & (~self._BV(bit)))) - - def readRegisterH8L4(self, highReg, lowReg) -> int: - h8 = self.readRegister(highReg)[0] - l4 = self.readRegister(lowReg)[0] - return (h8 << 4) | (l4 & 0x0F) - - def readRegisterH8L5(self, highReg, lowReg) -> int: - h8 = self.readRegister(highReg)[0] - l5 = self.readRegister(lowReg)[0] - return (h8 << 5) | (l5 & 0x1F) - - def readRegisterH6L8(self, highReg, lowReg) -> int: - h6 = self.readRegister(highReg)[0] - l8 = self.readRegister(lowReg)[0] - return ((h6 & 0x3F) << 8) | l8 - - def readRegisterH5L8(self, highReg, lowReg) -> int: - h5 = self.readRegister(highReg)[0] - l8 = self.readRegister(lowReg)[0] - return ((h5 & 0x1F) << 8) | l8 diff --git a/libdeps/XPowersLib/examples/AXP2101_ADC_Example/AXP2101_ADC_Example.ino b/libdeps/XPowersLib/examples/AXP2101_ADC_Example/AXP2101_ADC_Example.ino index d1e47a5..42a91f4 100644 --- a/libdeps/XPowersLib/examples/AXP2101_ADC_Example/AXP2101_ADC_Example.ino +++ b/libdeps/XPowersLib/examples/AXP2101_ADC_Example/AXP2101_ADC_Example.ino @@ -130,7 +130,7 @@ void loop() if (pmu_flag) { pmu_flag = false; // Get PMU Interrupt Status Register - uint32_t status = power.getIrqStatus(); + power.getIrqStatus(); if (power.isPekeyShortPressIrq()) { if (adc_switch) { adcOn(); Serial.println("Enable ADC\n\n\n"); diff --git a/libdeps/XPowersLib/examples/AXP2101_Charge_Current_Setting/AXP2101_Charge_Current_Setting.ino b/libdeps/XPowersLib/examples/AXP2101_Charge_Current_Setting/AXP2101_Charge_Current_Setting.ino index 0dfb783..c33bfe4 100644 --- a/libdeps/XPowersLib/examples/AXP2101_Charge_Current_Setting/AXP2101_Charge_Current_Setting.ino +++ b/libdeps/XPowersLib/examples/AXP2101_Charge_Current_Setting/AXP2101_Charge_Current_Setting.ino @@ -146,7 +146,7 @@ void loop() if (pmu_flag) { pmu_flag = false; // Get PMU Interrupt Status Register - uint32_t status = power.getIrqStatus(); + power.getIrqStatus(); if (power.isPekeyShortPressIrq()) { // Set constant current charge current limit diff --git a/libdeps/XPowersLib/examples/AXP2101_Example/AXP2101_Example.ino b/libdeps/XPowersLib/examples/AXP2101_Example/AXP2101_Example.ino index 1b433da..3983ed9 100644 --- a/libdeps/XPowersLib/examples/AXP2101_Example/AXP2101_Example.ino +++ b/libdeps/XPowersLib/examples/AXP2101_Example/AXP2101_Example.ino @@ -29,7 +29,7 @@ it may burn your external load, please check the voltage setting before running if there is any loss, please bear it by yourself */ #ifndef XPOWERS_NO_ERROR -// #error "Running this example is known to not damage the device! Please go and uncomment this!" +#error "Running this example is known to not damage the device! Please go and uncomment this!" #endif // Defined using AXP2102 #define XPOWERS_CHIP_AXP2101 diff --git a/libdeps/XPowersLib/examples/AXP2101_Sleep_Example/AXP2101_Sleep_Example.ino b/libdeps/XPowersLib/examples/AXP2101_Sleep_Example/AXP2101_Sleep_Example.ino index c23d7c4..015826b 100644 --- a/libdeps/XPowersLib/examples/AXP2101_Sleep_Example/AXP2101_Sleep_Example.ino +++ b/libdeps/XPowersLib/examples/AXP2101_Sleep_Example/AXP2101_Sleep_Example.ino @@ -107,7 +107,7 @@ void loop() if (pmu_flag) { pmu_flag = false; // Get PMU Interrupt Status Register - uint32_t status = power.getIrqStatus(); + power.getIrqStatus(); if (power.isPekeyShortPressIrq()) { // Turn off the charging indicator to save power diff --git a/libdeps/XPowersLib/examples/BQ25896_Example/BQ25896_Example.ino b/libdeps/XPowersLib/examples/BQ25896_Example/BQ25896_Example.ino index 864d6b9..02f343e 100644 --- a/libdeps/XPowersLib/examples/BQ25896_Example/BQ25896_Example.ino +++ b/libdeps/XPowersLib/examples/BQ25896_Example/BQ25896_Example.ino @@ -6,6 +6,9 @@ * @date 2024-06-04 * */ + +#define XPOWERS_CHIP_BQ25896 + #include XPowersPPM PPM; @@ -71,7 +74,7 @@ void setup() // To obtain voltage data, the ADC must be enabled first - PPM.enableADCMeasure(); + PPM.enableMeasure(); // Turn on charging function // If there is no battery connected, do not turn on the charging function @@ -105,7 +108,7 @@ void loop() pmu_irq = false; // Get PPM interrupt status - PPM.getIrqStatus(); + PPM.getFaultStatus(); Serial.print("-> ["); Serial.print(millis() / 1000); @@ -133,12 +136,6 @@ void loop() Serial.print(PPM.getNTCStatusString()); Serial.print(" Percentage:"); Serial.print(PPM.getNTCPercentage()); Serial.println("%"); - } - // The battery may be disconnected or damaged. - else if (PPM.isVsysLowVoltageWarning()) { - - Serial.println("In VSYSMIN regulation (BAT XPowersPPM PPM; @@ -42,7 +44,6 @@ void setup() delay(1000); } } - } diff --git a/libdeps/XPowersLib/examples/ESP_IDF_Example/main/main.cpp b/libdeps/XPowersLib/examples/ESP_IDF_Example/main/main.cpp index 3ffd574..cdc1f1e 100644 --- a/libdeps/XPowersLib/examples/ESP_IDF_Example/main/main.cpp +++ b/libdeps/XPowersLib/examples/ESP_IDF_Example/main/main.cpp @@ -27,7 +27,7 @@ extern esp_err_t pmu_init(); extern esp_err_t i2c_init(void); extern void pmu_isr_handler(); -static void pmu_hander_task(void *); +static void pmu_handler_task(void *); static QueueHandle_t gpio_evt_queue = NULL; static void IRAM_ATTR pmu_irq_handler(void *arg) @@ -69,14 +69,14 @@ extern "C" void app_main(void) ESP_ERROR_CHECK(pmu_init()); - xTaskCreate(pmu_hander_task, "App/pwr", 4 * 1024, NULL, 10, NULL); + xTaskCreate(pmu_handler_task, "App/pwr", 4 * 1024, NULL, 10, NULL); ESP_LOGI(TAG, "Run..."); } -static void pmu_hander_task(void *args) +static void pmu_handler_task(void *args) { uint32_t io_num; while (1) { diff --git a/libdeps/XPowersLib/examples/FastCharging_BleUartDebug/FastCharging_BleUartDebug.ino b/libdeps/XPowersLib/examples/FastCharging_BleUartDebug/FastCharging_BleUartDebug.ino index 397c625..72aea07 100644 --- a/libdeps/XPowersLib/examples/FastCharging_BleUartDebug/FastCharging_BleUartDebug.ino +++ b/libdeps/XPowersLib/examples/FastCharging_BleUartDebug/FastCharging_BleUartDebug.ino @@ -7,6 +7,12 @@ * */ +// Use SY6970 +// #define XPOWERS_CHIP_SY6970 + +// Use BQ25896 +#define XPOWERS_CHIP_BQ25896 + #include #ifdef ARDUINO_ARCH_NRF52 @@ -125,18 +131,21 @@ void setup() ppm.disableOTG(); + // SY6970 Range:0~5056 mA / step:64mA + // BQ25896 Range:0~3008 mA / step:64mA ppm.setChargerConstantCurr(2048); // Disable current limit pin ppm.disableCurrentLimitPin(); - ppm.setInputCurrentLimit(POWERS_SY6970_IN_CURRENT_MAX); + // SY6970 : Range : 100 mA ~ 3250 mA + ppm.setInputCurrentLimit(3250); // ppm.disableInputCurrentLimit(); // Set the charging target voltage, Range:3840 ~ 4608mV ,step:16 mV ppm.setChargeTargetVoltage(4208); - ppm.enableADCMeasure(); + ppm.enableMeasure(); // ppm.setHighVoltageRequestedRange(RequestRange::REQUEST_9V); // ppm.setSysPowerDownVoltage(3500); @@ -201,7 +210,7 @@ void loop() buffer.concat("\n"); if (find_ppm) { - ppm.getIrqStatus(); + ppm.getFaultStatus(); buffer.concat("NTC:"); buffer.concat(ppm.getNTCStatusString()); buffer.concat("\n"); buffer.concat("VBUS:"); buffer.concat(ppm.getVbusVoltage()); buffer.concat("\n"); buffer.concat("VBAT:"); buffer.concat(ppm.getBattVoltage()); buffer.concat("\n"); @@ -217,7 +226,7 @@ void loop() Serial.println(buffer); if (find_ppm) { - ppm.getIrqStatus(); + ppm.getFaultStatus(); Serial.print("NTC STR:"); Serial.println(ppm.getNTCStatusString()); Serial.printf("CHG TARGET VOLTAGE :%04dmV CURRENT:%04dmA PER_CHARGE_CUR %04dmA\n", ppm.getChargeTargetVoltage(), ppm.getChargerConstantCurr(), ppm.getPrechargeCurr()); diff --git a/libdeps/XPowersLib/examples/SY6970_Example/SY6970_Example.ino b/libdeps/XPowersLib/examples/SY6970_Example/SY6970_Example.ino index 9df4bfd..68f53ba 100644 --- a/libdeps/XPowersLib/examples/SY6970_Example/SY6970_Example.ino +++ b/libdeps/XPowersLib/examples/SY6970_Example/SY6970_Example.ino @@ -8,6 +8,8 @@ * If it is connected to a battery, the discharge current depends on the maximum discharge current of the battery. * */ +#define XPOWERS_CHIP_SY6970 + #include XPowersPPM PPM; @@ -73,7 +75,7 @@ void setup() // To obtain voltage data, the ADC must be enabled first - PPM.enableADCMeasure(); + PPM.enableMeasure(); // Turn on charging function // If there is no battery connected, do not turn on the charging function @@ -106,7 +108,7 @@ void loop() if (pmu_irq) { pmu_irq = false; // Get PPM interrupt status - PPM.getIrqStatus(); + PPM.getFaultStatus(); Serial.print("-> ["); Serial.print(millis() / 1000); @@ -134,12 +136,6 @@ void loop() Serial.print(PPM.getNTCStatusString()); Serial.print(" Percentage:"); Serial.print(PPM.getNTCPercentage()); Serial.println("%"); - } - // The battery may be disconnected or damaged. - else if (PPM.isVsysLowVoltageWarning()) { - - Serial.println("In VSYSMIN regulation (BAT XPowersPPM PPM; diff --git a/libdeps/XPowersLib/examples/SY6970_Watchdog_Example/SY6970_Watchdog_Example.ino b/libdeps/XPowersLib/examples/SY6970_Watchdog_Example/SY6970_Watchdog_Example.ino index 89f709c..d2e4a0f 100644 --- a/libdeps/XPowersLib/examples/SY6970_Watchdog_Example/SY6970_Watchdog_Example.ino +++ b/libdeps/XPowersLib/examples/SY6970_Watchdog_Example/SY6970_Watchdog_Example.ino @@ -6,6 +6,8 @@ * @date 2023-08-31 * */ +#define XPOWERS_CHIP_SY6970 + #include XPowersPPM PPM; @@ -49,14 +51,14 @@ void setup() /* * Example: - * PPM.enableWatchdog( SY6970_WDT_TIMEROUT_40SEC ); + * PPM.enableWatchdog(PowersSY6970::TIMER_OUT_40SEC); * Optional parameters: - * SY6970_WDT_TIMEROUT_40SEC, //40 Second - * SY6970_WDT_TIMEROUT_80SEC, //80 Second - * SY6970_WDT_TIMEROUT_160SEC, //160 Second + * PowersSY6970::TIMER_OUT_40SEC, //40 Second + * PowersSY6970::TIMER_OUT_80SEC, //80 Second + * PowersSY6970::TIMER_OUT_160SEC, //160 Second * * */ - // Enable SY6970 PPM watchdog function ,default timer out 40 second - PPM.enableWatchdog(); + // Enable SY6970 PPM watchdog function + PPM.enableWatchdog(PowersSY6970::TIMER_OUT_40SEC); } diff --git a/libdeps/XPowersLib/examples/XPowersLibInterface_Example/XPowersLibInterface_Example.ino b/libdeps/XPowersLib/examples/XPowersLibInterface_Example/XPowersLibInterface_Example.ino index 588f768..2d4f42c 100644 --- a/libdeps/XPowersLib/examples/XPowersLibInterface_Example/XPowersLibInterface_Example.ino +++ b/libdeps/XPowersLib/examples/XPowersLibInterface_Example/XPowersLibInterface_Example.ino @@ -406,12 +406,46 @@ void setup() power->disableInterrupt(XPOWERS_ALL_INT); power->enableInterrupt(XPOWERS_USB_INSERT_INT | - XPOWERS_USB_REMOVE_INT | - XPOWERS_BATTERY_INSERT_INT | - XPOWERS_BATTERY_REMOVE_INT | - XPOWERS_PWR_BTN_CLICK_INT | - XPOWERS_CHARGE_START_INT | - XPOWERS_CHARGE_DONE_INT); + XPOWERS_USB_REMOVE_INT | + XPOWERS_BATTERY_INSERT_INT | + XPOWERS_BATTERY_REMOVE_INT | + XPOWERS_PWR_BTN_CLICK_INT | + XPOWERS_CHARGE_START_INT | + XPOWERS_CHARGE_DONE_INT); + + + // Access the subclass method by getting the model + uint8_t chipType = power->getChipModel(); + switch (chipType) { + case XPOWERS_AXP192: { + XPowersAXP192 *axp192 = static_cast(power); + axp192->enableCoulomb(); + uint32_t data = axp192->getBattChargeCoulomb(); + float chargeCurrent = axp192->getBatteryChargeCurrent(); + float dischargeCurrent = axp192->getBattDischargeCurrent(); + Serial.printf("AXP192 GetBattChargeCoulomb : %X\n", data); + Serial.printf("AXP192 GetBatteryChargeCurrent:%.2f mA\n", chargeCurrent); + Serial.printf("AXP192 GetBattDischargeCurrent:%.2f mA\n", dischargeCurrent); + } + break; + case XPOWERS_AXP202: { + XPowersAXP202 *axp202 = static_cast(power); + axp202->enableCoulomb(); + uint32_t data = axp202->getBattChargeCoulomb(); + Serial.printf("AX202 GetBattChargeCoulomb : %X\n", data); + } + break; + case XPOWERS_AXP2101: { + XPowersAXP2101 *axp2101 = static_cast(power); + axp2101->fuelGaugeControl(true, true); + axp2101->setPrechargeCurr(XPOWERS_AXP2101_PRECHARGE_50MA); + axp2101->setChargerTerminationCurr(XPOWERS_AXP2101_CHG_ITERM_25MA); + } + break; + default: + break; + } + } void printPMU() diff --git a/libdeps/XPowersLib/keywords.txt b/libdeps/XPowersLib/keywords.txt index 92bf422..1911b7e 100644 --- a/libdeps/XPowersLib/keywords.txt +++ b/libdeps/XPowersLib/keywords.txt @@ -507,7 +507,7 @@ chargeStatus KEYWORD2 getChargeStatusString KEYWORD2 getNTCStatus KEYWORD2 getNTCStatusString KEYWORD2 -enableADCMeasure KEYWORD2 +enableMeasure KEYWORD2 disableADCMeasure KEYWORD2 setBoostFreq KEYWORD2 getBoostFreq KEYWORD2 diff --git a/libdeps/XPowersLib/library.json b/libdeps/XPowersLib/library.json index 182c5ec..1d588d0 100644 --- a/libdeps/XPowersLib/library.json +++ b/libdeps/XPowersLib/library.json @@ -1,6 +1,6 @@ { "name": "XPowersLib", - "version": "0.2.6", + "version": "0.2.7", "description": "Arduino, CircuitPython, Micropython, esp-idf and other frameworks power management series library", "keywords": "AXP192,AXP202,AXP2101,SY6970,BQ25896,HUSB238", "authors": [ diff --git a/libdeps/XPowersLib/library.properties b/libdeps/XPowersLib/library.properties index a7466eb..8314bf1 100644 --- a/libdeps/XPowersLib/library.properties +++ b/libdeps/XPowersLib/library.properties @@ -1,5 +1,5 @@ name=XPowersLib -version=0.2.6 +version=0.2.7 author=Lewis He maintainer=Lewis He sentence=Arduino, CircuitPython, Micropython, esp-idf and other frameworks power management series library diff --git a/libdeps/XPowersLib/platformio.ini b/libdeps/XPowersLib/platformio.ini deleted file mode 100644 index 3f9b324..0000000 --- a/libdeps/XPowersLib/platformio.ini +++ /dev/null @@ -1,95 +0,0 @@ -;PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html - -[platformio] -; src_dir = examples/AXP192_Example -; src_dir = examples/AXP202_Example -; src_dir = examples/AXP2101_Charge_Example -; src_dir = examples/AXP2101_Charge_Current_Setting -; src_dir = examples/AXP2101_Example -; src_dir = examples/AXP2101_InterruptExample -; src_dir = examples/AXP2101_Voltage_Example -; src_dir = examples/AXP2101_ADC_Example -; src_dir = examples/AXP2101_Sleep_Example -; src_dir = examples/XPowersLibInterface_Example -; src_dir = examples/SY6970_Example -; src_dir = examples/SY6970_Watchdog_Example -; src_dir = examples/SY6970_Shutdown_Example -; src_dir = examples/BQ25896_Example -; src_dir = examples/BQ25896_Shutdown_Example -; src_dir = examples/PowerDeliveryHUSB238_Example -; src_dir = examples/PowerDeliveryHUSB238_BleUart -src_dir = examples/FastCharging_BleUartDebug - -; default_envs = esp32s3 -; default_envs = esp32dev -; default_envs = nucleo_f411re -default_envs = nrf52840 - -[env] -lib_extra_dirs = . - -upload_speed = 921600 -monitor_speed = 115200 - - -build_flags = - ; -DCONFIG_PMU_SDA=1 - ; -DCONFIG_PMU_SCL=2 - - ; T-EPD47 S3 - ; -DCONFIG_PMU_SDA=6 - ; -DCONFIG_PMU_SCL=5 - ; -DCONFIG_PMU_IRQ=15 - - -DCONFIG_PMU_SDA=33 - -DCONFIG_PMU_SCL=35 - -DCONFIG_PMU_IRQ=15 - ; -UARDUINO_USB_CDC_ON_BOOT - ; -DARDUINO_USB_CDC_ON_BOOT=1 - -Wtype-limits - -Wall - -Werror - -[env:esp32dev] -platform = espressif32 -framework = arduino -board = esp32dev - -[env:esp32s3] -platform = espressif32 -framework = arduino -board = esp32-s3-devkitc-1 - -[env:nucleo_f411re] -platform = ststm32 -framework = arduino -board = nucleo_f411re -upload_protocol = stlink - -[env:nrf52840] -platform = nordicnrf52 -board = nrf52840_dk_adafruit -framework = arduino -upload_protocol = nrfutil -monitor_speed = 115200 -; upload_protocol = nrfjprog -; upload_protocol = jlink -build_flags = - ${env.build_flags} - ; -DCFG_DEBUG=1 - ; -DCFG_LOGGER=0 - ; -DCFG_SYSVIEW=0 -lib_deps = - Adafruit TinyUSB Library - Wire - SPI - - diff --git a/libdeps/XPowersLib/src/PowersBQ25896.tpp b/libdeps/XPowersLib/src/PowersBQ25896.tpp new file mode 100644 index 0000000..71f7bd8 --- /dev/null +++ b/libdeps/XPowersLib/src/PowersBQ25896.tpp @@ -0,0 +1,1430 @@ +/** + * + * @license MIT License + * + * Copyright (c) 2024 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. + * + * @file PowersBQ25896.tpp + * @author Lewis He (lewishe@outlook.com) + * @date 2024-10-29 + * + */ +#if defined(ARDUINO) +#include +#else +#include +#endif /*ARDUINO*/ +#include "XPowersCommon.tpp" +#include "REG/GeneralPPMConstants.h" +#include "REG/BQ25896Constants.h" + +class PowersBQ25896 : + public XPowersCommon +{ + friend class XPowersCommon; +public: + + enum BusStatus { + BUS_STATE_NOINPUT, + BUS_STATE_USB_SDP, + BUS_STATE_ADAPTER, + BUS_STATE_OTG + } ; + + enum ChargeStatus { + CHARGE_STATE_NO_CHARGE, + CHARGE_STATE_PRE_CHARGE, + CHARGE_STATE_FAST_CHARGE, + CHARGE_STATE_DONE, + CHARGE_STATE_UNKOWN, + } ; + + enum NTCStatus { + BUCK_NTC_NORMAL = 0, + BUCK_NTC_WARM = 2, + BUCK_NTC_COOL = 3, + BUCK_NTC_COLD = 5, + BUCK_NTC_HOT = 6, + }; + + enum BoostNTCStatus { + BOOST_NTC_NORMAL = 0, + BOOST_NTC_COLD = 5, + BOOST_NTC_HOT = 6, + }; + + enum WatchdogConfig { + TIMER_OUT_40SEC, //40 Second + TIMER_OUT_80SEC, //80 Second + TIMER_OUT_160SEC, //160 Second + } ; + + enum MeasureMode { + ONE_SHORT, + CONTINUOUS, + }; + + enum BoostFreq { + BOOST_FREQ_1500KHZ, + BOOST_FREQ_500KHZ, + }; + + enum ExitBoostModeVolt { + MINI_VOLT_2V9, + MINI_VOLT_2V5 + }; + + enum FastChargeThreshold { + FAST_CHG_THR_2V8, + FAST_CHG_THR_3V0 + }; + + enum RechargeThresholdOffset { + RECHARGE_OFFSET_100MV, + RECHARGE_OFFSET_200MV + }; + + enum FastChargeTimer { + FAST_CHARGE_TIMER_5H, + FAST_CHARGE_TIMER_8H, + FAST_CHARGE_TIMER_12H, + FAST_CHARGE_TIMER_20H, + }; + + enum JeitaLowTemperatureCurrent { + JEITA_LOW_TEMP_50, //50% of ICHG (REG04[6:0]) + JEITA_LOW_TEMP_20, //20% of ICHG (REG04[6:0]) + }; + + enum BoostCurrentLimit { + BOOST_CUR_LIMIT_500MA, + BOOST_CUR_LIMIT_750MA, + BOOST_CUR_LIMIT_1200MA, + BOOST_CUR_LIMIT_1400MA, + BOOST_CUR_LIMIT_1650MA, + BOOST_CUR_LIMIT_1875MA, + BOOST_CUR_LIMIT_2150MA, + } ; + +#if defined(ARDUINO) + PowersBQ25896(TwoWire &w, int sda = SDA, int scl = SCL, uint8_t addr = BQ25896_SLAVE_ADDRESS) + { + __wire = &w; + __sda = sda; + __scl = scl; + __addr = addr; + } +#endif + + PowersBQ25896(uint8_t addr, iic_fptr_t readRegCallback, iic_fptr_t writeRegCallback) + { + thisReadRegCallback = readRegCallback; + thisWriteRegCallback = writeRegCallback; + __addr = addr; + } + + PowersBQ25896() + { +#if defined(ARDUINO) + __wire = &Wire; + __sda = SDA; + __scl = SCL; +#endif + __addr = BQ25896_SLAVE_ADDRESS; + } + + ~PowersBQ25896() + { + log_d("~PowersBQ25896"); + deinit(); + } + +#if defined(ARDUINO) + bool init(TwoWire &w, int sda = SDA, int scl = SCL, uint8_t addr = BQ25896_SLAVE_ADDRESS) + { + __wire = &w; + __sda = sda; + __scl = scl; + __addr = addr; + __irq_mask = 0; + return begin(); + } +#endif + + const char *getChipName() + { + return getChipID() == BQ25896_DEV_REV ? "SY6970" : "Unkown"; + } + + bool init() + { + return begin(); + } + + void deinit() + { + end(); + } + + /*************************************************** + * POWERS_PPM_REG_00H ✅ + **************************************************/ + // USB input path is disabled and can only be reset by disconnecting + // the power supply, otherwise the power cannot be turned on + void enterHizMode() + { + setRegisterBit(POWERS_PPM_REG_00H, 7); + } + + void exitHizMode() + { + clrRegisterBit(POWERS_PPM_REG_00H, 7); + } + + bool isHizMode() + { + return getRegisterBit(POWERS_PPM_REG_00H, 7); + } + + // Enable ILIM Pin + void enableCurrentLimitPin() + { + setRegisterBit(POWERS_PPM_REG_00H, 6); + } + + void disableCurrentLimitPin() + { + clrRegisterBit(POWERS_PPM_REG_00H, 6); + } + + bool isEnableCurrentLimitPin() + { + return getRegisterBit(POWERS_PPM_REG_00H, 6); + } + + // Input Current Limit + // Offset: 100mA + // Range: 100mA (000000) – 3.25A (111111) + // Default:0001000 (500mA) + // (Actual input current limit is the lower of I2C or ILIM pin) + // IINLIM bits are changed automaticallly after input source + // type detection is completed + // bq25896 + // PSEL = Hi (USB500) = 500mA + // PSEL = Lo = 3.25A + bool setInputCurrentLimit(uint16_t milliampere) + { + if (milliampere % POWERS_BQ25896_IN_CURRENT_STEP) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_IN_CURRENT_STEP); + return false; + } + if (milliampere < POWERS_BQ25896_IN_CURRENT_MIN) { + milliampere = POWERS_BQ25896_IN_CURRENT_MIN; + } + if (milliampere > POWERS_BQ25896_IN_CURRENT_MAX) { + milliampere = POWERS_BQ25896_IN_CURRENT_MAX; + } + int val = readRegister(POWERS_PPM_REG_00H); + if (val == -1) + return false; + val &= 0xC0; + milliampere = ((milliampere - POWERS_BQ25896_IN_CURRENT_MIN) / POWERS_BQ25896_IN_CURRENT_STEP); + val |= milliampere; + return writeRegister(POWERS_PPM_REG_00H, val) != -1; + } + + uint32_t getInputCurrentLimit() + { + int val = readRegister(POWERS_PPM_REG_00H); + if (val == -1) + return false; + val &= 0x3F; + return (val * POWERS_BQ25896_IN_CURRENT_STEP) + POWERS_BQ25896_IN_CURRENT_MIN; + } + + /*************************************************** + * POWERS_PPM_REG_01H ✅ + **************************************************/ + + // Boost Mode Hot Temperature Monitor Threshold + // 0x0 – VBHOT1 Threshold (34.75%) (default) + // 0x01 – VBHOT0 Threshold (Typ. 37.75%) + // 0x02 – VBHOT2 Threshold (Typ. 31.25%) + // 0x03 – Disable boost mode thermal protection + void setBoostModeHotTemperatureMonitorThreshold(uint8_t params) + { + int val = readRegister(POWERS_PPM_REG_01H); + if (val == -1)return; + val &= 0x3F; + val |= (params << 6); + writeRegister(POWERS_PPM_REG_01H, val); + } + + // Boost Mode Cold Temperature Monitor Threshold + // 0 – VBCOLD0 Threshold (Typ. 77%) (default) + // 1 – VBCOLD1 Threshold (Typ. 80%) + void setBoostModeColdTemperatureMonitorThreshold(uint8_t params) + { + int val = readRegister(POWERS_PPM_REG_01H); + if (val == -1)return; + val &= 0xDF; + val |= ((params & 0x01) << 5); + writeRegister(POWERS_PPM_REG_01H, val); + } + + // Input Voltage Limit Offset + // Default: 600mV (00110) + // Range: 0mV – 3100mV + // Minimum VINDPM threshold is clamped at 3.9V + // Maximum VINDPM threshold is clamped at 15.3V + // When VBUS at noLoad is ≤ 6V, the VINDPM_OS is used to calculate VINDPM threhold + // When VBUS at noLoad is > 6V, the VINDPM_OS multiple by 2 is used to calculate VINDPM threshold. + void setInputVoltageLimitOffset(uint16_t millivolt) + { + if (millivolt % POWERS_BQ25896_IN_CURRENT_OFFSET_STEP) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_IN_CURRENT_OFFSET_STEP); + return; + } + if (millivolt > POWERS_BQ25896_IN_CURRENT_OFFSET_MAX) { + millivolt = POWERS_BQ25896_IN_CURRENT_OFFSET_MAX; + } + int val = readRegister(POWERS_PPM_REG_01H); + val &= 0xE0; + millivolt = (millivolt / POWERS_BQ25896_IN_CURRENT_OFFSET_STEP); + val |= millivolt; + writeRegister(POWERS_PPM_REG_01H, val); + } + + /*************************************************** + * POWERS_PPM_REG_02H ✅ + **************************************************/ + bool enableMeasure(MeasureMode mode = CONTINUOUS) + { + int val = readRegister(POWERS_PPM_REG_02H); + switch (mode) { + case CONTINUOUS: + val |= _BV(6); + break; + case ONE_SHORT: + val &= (~_BV(6)); + default: + break; + } + val |= _BV(7); + return writeRegister(POWERS_PPM_REG_02H, val) != -1; + } + + bool disableMeasure() + { + int val = readRegister(POWERS_PPM_REG_02H); + if (val == -1) { + return false; + } + val &= (~_BV(7)); + return writeRegister(POWERS_PPM_REG_02H, val) != 1; + } + + bool setBoostFreq(BoostFreq freq) + { + switch (freq) { + case BOOST_FREQ_500KHZ: + return setRegisterBit(POWERS_PPM_REG_02H, 5); + case BOOST_FREQ_1500KHZ: + return clrRegisterBit(POWERS_PPM_REG_02H, 5); + default: + break; + } + return false; + } + + BoostFreq getBoostFreq() + { + return getRegisterBit(POWERS_PPM_REG_02H, 5) ? + BOOST_FREQ_500KHZ : + BOOST_FREQ_1500KHZ; + } + + // Input Current Optimizer (ICO) Enable + void enableInputCurrentOptimizer() + { + setRegisterBit(POWERS_PPM_REG_02H, 4); + } + + // Input Current Optimizer (ICO) Disable + void disableInputCurrentOptimizer() + { + clrRegisterBit(POWERS_PPM_REG_02H, 4); + } + + // Enable Force Input Detection , Force PSEL detection + void enableInputDetection() + { + setRegisterBit(POWERS_PPM_REG_02H, 1); + } + + // Disable Force Input Detection , Not in PSEL detection (default) + void disableInputDetection() + { + clrRegisterBit(POWERS_PPM_REG_02H, 1); + } + + // Get Force DP/DM detection + bool isEnableInputDetection() + { + return getRegisterBit(POWERS_PPM_REG_02H, 1); + } + + // Enable PSEL detection when VBUS is plugged-in (default) + void enableAutomaticInputDetection() + { + setRegisterBit(POWERS_PPM_REG_02H, 0); + } + + // Disable PSEL detection when VBUS is plugged-in + void disableAutomaticInputDetection() + { + clrRegisterBit(POWERS_PPM_REG_02H, 0); + } + + // Get DPDM detection when BUS is plugged-in. + bool isEnableAutomaticInputDetection() + { + return getRegisterBit(POWERS_PPM_REG_02H, 0); + } + + + /*************************************************** + * POWERS_PPM_REG_03H ✅ + **************************************************/ + + // Return Battery Load status + bool isEnableBatLoad() + { + return getRegisterBit(POWERS_PPM_REG_03H, 7); + } + + // Battery Load Disable + void disableBatLoad() + { + clrRegisterBit(POWERS_PPM_REG_03H, 7); + } + + // Battery Load Enable + void enableBatLoad() + { + setRegisterBit(POWERS_PPM_REG_03H, 7); + } + + void feedWatchdog() + { + setRegisterBit(POWERS_PPM_REG_03H, 6); + } + + bool isEnableOTG() + { + return getRegisterBit(POWERS_PPM_REG_03H, 5); + } + + void disableOTG() + { + clrRegisterBit(POWERS_PPM_REG_03H, 5); + /* + * After turning on the OTG function, the charging function will + * be automatically disabled. If the user does not disable the charging + * function, the charging function will be automatically enabled after + * turning off the OTG output. + * */ + if (!__user_disable_charge) { + setRegisterBit(POWERS_PPM_REG_03H, 4); + } + } + + bool enableOTG() + { + if (isVbusIn()) + return false; + return setRegisterBit(POWERS_PPM_REG_03H, 5); + } + + bool isEnableCharge() + { + return getRegisterBit(POWERS_PPM_REG_03H, 4); + } + + void disableCharge() + { + __user_disable_charge = true; + clrRegisterBit(POWERS_PPM_REG_03H, 4); + } + + void enableCharge() + { + __user_disable_charge = false; + setRegisterBit(POWERS_PPM_REG_03H, 4); + } + + bool setSysPowerDownVoltage(uint16_t millivolt) + { + if (millivolt % POWERS_BQ25896_SYS_VOL_STEPS) { + log_e("Mistake ! The steps is must %u mV", POWERS_BQ25896_SYS_VOL_STEPS); + return false; + } + if (millivolt < POWERS_BQ25896_SYS_VOFF_VOL_MIN) { + log_e("Mistake ! SYS minimum output voltage is %umV", POWERS_BQ25896_SYS_VOFF_VOL_MIN); + return false; + } else if (millivolt > POWERS_BQ25896_SYS_VOFF_VOL_MAX) { + log_e("Mistake ! SYS maximum output voltage is %umV", POWERS_BQ25896_SYS_VOFF_VOL_MAX); + return false; + } + int val = readRegister(POWERS_PPM_REG_03H); + if (val == -1)return false; + val &= 0xF1; + val |= (millivolt - POWERS_BQ25896_SYS_VOFF_VOL_MIN) / POWERS_BQ25896_SYS_VOL_STEPS; + val <<= 1; + return 0 == writeRegister(POWERS_PPM_REG_03H, val); + + } + + uint16_t getSysPowerDownVoltage() + { + int val = readRegister(POWERS_PPM_REG_03H); + if (val == -1)return 0; + val &= 0x0E; + val >>= 1; + return (val * POWERS_BQ25896_SYS_VOL_STEPS) + POWERS_BQ25896_SYS_VOFF_VOL_MIN; + } + + // Minimum Battery Voltage (falling) to exit boost mode + void setExitBoostModeVoltage(enum ExitBoostModeVolt params) + { + switch (params) { + case MINI_VOLT_2V9: + clrRegisterBit(POWERS_PPM_REG_03H, 0); + break; + case MINI_VOLT_2V5: + setRegisterBit(POWERS_PPM_REG_03H, 0); + break; + default: + break; + } + } + + /*************************************************** + * POWERS_PPM_REG_04H ✅ + **************************************************/ + + void enableCurrentPulseControl() + { + setRegisterBit(POWERS_PPM_REG_04H, 7); + } + + void disableCurrentPulseControl() + { + clrRegisterBit(POWERS_PPM_REG_04H, 7); + } + + uint16_t getChargerConstantCurr() + { + int val = readRegister(POWERS_PPM_REG_04H); + val &= 0x7F; + return val * POWERS_BQ25896_FAST_CHG_CUR_STEP; + } + + /** + * @brief setChargerConstantCurr + * @note + * @param milliampere: Range:0~3008 mA / step:64mA + * @retval true : success false : failed + */ + bool setChargerConstantCurr(uint16_t milliampere) + { + if (milliampere % POWERS_BQ25896_FAST_CHG_CUR_STEP) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_FAST_CHG_CUR_STEP); + return false; + } + if (milliampere > POWERS_BQ25896_FAST_CHG_CURRENT_MAX) { + milliampere = POWERS_BQ25896_FAST_CHG_CURRENT_MAX; + } + int val = readRegister(POWERS_PPM_REG_04H); + val &= 0x80; + val |= (milliampere / POWERS_BQ25896_FAST_CHG_CUR_STEP); + return writeRegister(POWERS_PPM_REG_04H, val) != -1; + } + + /*************************************************** + * POWERS_PPM_REG_05H ✅ + **************************************************/ + + //Precharge Current Limit Range: 64mA ~ 1024mA ,step:64mA + bool setPrechargeCurr(uint16_t milliampere) + { + if (milliampere % POWERS_BQ25896_PRE_CHG_CUR_STEP) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_PRE_CHG_CUR_STEP); + return false; + } + if (milliampere < POWERS_BQ25896_PRE_CHG_CURRENT_MIN) { + milliampere = POWERS_BQ25896_PRE_CHG_CURRENT_MIN; + } + if (milliampere > POWERS_BQ25896_PRE_CHG_CURRENT_MAX) { + milliampere = POWERS_BQ25896_PRE_CHG_CURRENT_MAX; + } + int val = readRegister(POWERS_PPM_REG_05H); + val &= 0x0F; + milliampere = ((milliampere - POWERS_BQ25896_PRE_CHG_CUR_BASE) / POWERS_BQ25896_PRE_CHG_CUR_STEP); + val |= milliampere << 4; + return writeRegister(POWERS_PPM_REG_05H, val) != -1; + } + + uint16_t getPrechargeCurr(void) + { + int val = readRegister(POWERS_PPM_REG_05H); + val &= 0xF0; + val >>= 4; + return POWERS_BQ25896_PRE_CHG_CUR_STEP + (val * POWERS_BQ25896_PRE_CHG_CUR_STEP); + } + + //Precharge Current Limit Range: 64mA ~ 1024mA ,step:64mA + bool setTerminationCurr(uint16_t milliampere) + { + if (milliampere % POWERS_BQ25896_TERM_CHG_CUR_STEP) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_TERM_CHG_CUR_STEP); + return false; + } + if (milliampere < POWERS_BQ25896_TERM_CHG_CURRENT_MIN) { + milliampere = POWERS_BQ25896_TERM_CHG_CURRENT_MIN; + } + if (milliampere > POWERS_BQ25896_TERM_CHG_CURRENT_MAX) { + milliampere = POWERS_BQ25896_TERM_CHG_CURRENT_MAX; + } + int val = readRegister(POWERS_PPM_REG_05H); + val &= 0xF0; + milliampere = ((milliampere - POWERS_BQ25896_TERM_CHG_CUR_BASE) / POWERS_BQ25896_TERM_CHG_CUR_STEP); + val |= milliampere; + return writeRegister(POWERS_PPM_REG_05H, val) != -1; + } + + uint16_t getTerminationCurr(void) + { + int val = readRegister(POWERS_PPM_REG_05H); + val &= 0x0F; + return POWERS_BQ25896_TERM_CHG_CUR_STEP + (val * POWERS_BQ25896_TERM_CHG_CUR_STEP); + } + + + /*************************************************** + * POWERS_PPM_REG_06H ✅ + **************************************************/ + uint16_t getChargeTargetVoltage() + { + int val = readRegister(POWERS_PPM_REG_06H); + val = (val & 0xFC) >> 2; + if (val > 0x30) { + return POWERS_BQ25896_FAST_CHG_VOL_MAX; + } + return val * POWERS_BQ25896_CHG_VOL_STEP + POWERS_BQ25896_CHG_VOL_BASE; + } + + // Charge Voltage Limit Range:3840 ~ 4608mV ,step:16 mV + bool setChargeTargetVoltage(uint16_t millivolt) + { + if (millivolt % POWERS_BQ25896_CHG_VOL_STEP) { + log_e("Mistake ! The steps is must %u mV", POWERS_BQ25896_CHG_VOL_STEP); + return false; + } + if (millivolt < POWERS_BQ25896_FAST_CHG_VOL_MIN) { + millivolt = POWERS_BQ25896_FAST_CHG_VOL_MIN; + } + if (millivolt > POWERS_BQ25896_FAST_CHG_VOL_MAX) { + millivolt = POWERS_BQ25896_FAST_CHG_VOL_MAX; + } + int val = readRegister(POWERS_PPM_REG_06H); + val &= 0x03; + val |= (((millivolt - POWERS_BQ25896_CHG_VOL_BASE) / POWERS_BQ25896_CHG_VOL_STEP) << 2); + return writeRegister(POWERS_PPM_REG_06H, val) != -1; + } + + // Battery Precharge to Fast Charge Threshold + void setFastChargeThreshold(enum FastChargeThreshold threshold) + { + switch (threshold) { + case FAST_CHG_THR_2V8: + clrRegisterBit(POWERS_PPM_REG_06H, 1); + break; + case FAST_CHG_THR_3V0: + setRegisterBit(POWERS_PPM_REG_06H, 1); + break; + default: + break; + } + } + + // Battery Recharge Threshold Offset(below Charge Voltage Limit) + void setBatteryRechargeThresholdOffset(enum RechargeThresholdOffset offset) + { + switch (offset) { + case RECHARGE_OFFSET_100MV: + clrRegisterBit(POWERS_PPM_REG_06H, 0); + break; + case RECHARGE_OFFSET_200MV: + setRegisterBit(POWERS_PPM_REG_06H, 0); + break; + default: + break; + } + } + + /*************************************************** + * POWERS_PPM_REG_07H ✅ + **************************************************/ + + // Charging Termination Enable + void enableChargingTermination() + { + setRegisterBit(POWERS_PPM_REG_07H, 7); + } + + // Charging Termination Enable + void disableChargingTermination() + { + clrRegisterBit(POWERS_PPM_REG_07H, 7); + } + + // Charging Termination Enable + bool isEnableChargingTermination() + { + return getRegisterBit(POWERS_PPM_REG_07H, 7); + } + + // STAT Pin function + void disableStatPin() + { + setRegisterBit(POWERS_PPM_REG_07H, 6); + } + + void enableStatPin() + { + clrRegisterBit(POWERS_PPM_REG_07H, 6); + } + + bool isEnableStatPin() + { + return getRegisterBit(POWERS_PPM_REG_07H, 6) == false; + } + + // I2C Watchdog Timer Setting + void disableWatchdog() + { + int regVal = readRegister(POWERS_PPM_REG_07H); + regVal &= 0xCF; + writeRegister(POWERS_PPM_REG_07H, regVal); + } + + void enableWatchdog(enum WatchdogConfig val) + { + int regVal = readRegister(POWERS_PPM_REG_07H); + regVal &= 0xCF; + switch (val) { + case TIMER_OUT_40SEC: + writeRegister(POWERS_PPM_REG_07H, regVal | 0x10); + break; + case TIMER_OUT_80SEC: + writeRegister(POWERS_PPM_REG_07H, regVal | 0x20); + break; + case TIMER_OUT_160SEC: + writeRegister(POWERS_PPM_REG_07H, regVal | 0x30); + break; + default: + break; + } + } + + void disableChargingSafetyTimer() + { + clrRegisterBit(POWERS_PPM_REG_07H, 3); + } + + void enableChargingSafetyTimer() + { + setRegisterBit(POWERS_PPM_REG_07H, 3); + } + + bool isEnableChargingSafetyTimer() + { + return getRegisterBit(POWERS_PPM_REG_07H, 3); + } + + void setFastChargeTimer(FastChargeTimer timer) + { + int val; + switch (timer) { + case FAST_CHARGE_TIMER_5H: + case FAST_CHARGE_TIMER_8H: + case FAST_CHARGE_TIMER_12H: + case FAST_CHARGE_TIMER_20H: + val = readRegister(POWERS_PPM_REG_07H); + if (val == -1) + return; + val &= 0xF1; + val |= (timer << 1); + writeRegister(POWERS_PPM_REG_07H, val); + break; + default: + break; + } + } + + FastChargeTimer getFastChargeTimer() + { + int val = readRegister(POWERS_PPM_REG_07H); + return static_cast((val & 0x0E) >> 1); + } + + // JEITA Low Temperature Current Setting + // JEITA(Japan Electronics and Information Technology Industries Association) + // https://en.wikipedia.org/wiki/Japan_Electronics_and_Information_Technology_Industries_Association + void setJeitaLowTemperatureCurrent(enum JeitaLowTemperatureCurrent params) + { + switch (params) { + case JEITA_LOW_TEMP_50: + clrRegisterBit(POWERS_PPM_REG_07H, 0); + break; + case JEITA_LOW_TEMP_20: + setRegisterBit(POWERS_PPM_REG_07H, 0); + break; + default: + break; + } + } + + /*************************************************** + * POWERS_PPM_REG_08H ✅ + **************************************************/ + // IR Compensation Resistor Setting + // Range: 0 – 140mΩ + // Default: 0Ω (000) (i.e. Disable IRComp) + void setIRCompensationResistor(uint16_t params) + { + if (params % POWERS_BQ25896_BAT_COMP_STEPS) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_BAT_COMP_STEPS); + return; + } + if (params > POWERS_BQ25896_TERM_CHG_CURRENT_MAX) { + params = POWERS_BQ25896_TERM_CHG_CURRENT_MAX; + } + int val = readRegister(POWERS_PPM_REG_08H); + if (val == -1)return; + val &= 0x1F; + params = (params / POWERS_BQ25896_BAT_COMP_STEPS); + val |= (params << 5); + writeRegister(POWERS_PPM_REG_08H, val); + } + + // IR Compensation Voltage Clamp + // above VREG (REG06[7:2]) + // Offset: 0mV + // Range: 0-224mV + // Default: 0mV (000) + void setIRCompensationVoltageClamp(uint16_t params) + { + if (params % POWERS_BQ25896_VCLAMP_STEPS) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_VCLAMP_STEPS); + return; + } + if (params > POWERS_BQ25896_TERM_CHG_CURRENT_MAX) { + params = POWERS_BQ25896_TERM_CHG_CURRENT_MAX; + } + int val = readRegister(POWERS_PPM_REG_08H); + if (val == -1)return; + val &= 0xE3; + params = (params / POWERS_BQ25896_VCLAMP_STEPS); + val |= (params << 2); + writeRegister(POWERS_PPM_REG_08H, val); + } + + // Thermal Regulation Threshold + // 0x0 – 60°C + // 0x1 – 80°C + // 0x2 – 100°C + // 0x3 – 120°C (default) + void setThermalRegulationThreshold(uint8_t params) + { + int val = readRegister(POWERS_PPM_REG_08H); + if (val == -1)return; + val &= 0xE3; + val |= (params); + writeRegister(POWERS_PPM_REG_08H, val); + } + + /*************************************************** + * POWERS_PPM_REG_09H + **************************************************/ + // Force Start Input Current Optimizer (ICO) + // 0 – Do not force ICO (default) + // 1 – Force ICO + // Note: This bit is can only be set only and always returns to 0 after ICO starts + void forceInputCurrentOptimizer(bool force) + { + force ? setRegisterBit(POWERS_PPM_REG_09H, 7) : clrRegisterBit(POWERS_PPM_REG_09H, 7); + } + + // Safety Timer Setting during DPM or Thermal Regulation + // 0 – Safety timer not slowed by 2X during input DPM or thermal regulation + // 1 – Safety timer slowed by 2X during input DPM or thermal regulation (default) + void setThermalRegulation(uint8_t params) + { + params ? setRegisterBit(POWERS_PPM_REG_09H, 6) : clrRegisterBit(POWERS_PPM_REG_09H, 6) ; + } + + + // Turn off the battery power supply path. It can only be turned off when the + // battery is powered. It cannot be turned off when USB is connected. + // The device can only be powered on by pressing the PWR button or by connecting the power supply. + void shutdown() + { + disableBatterPowerPath(); + } + + // Close battery power path + void disableBatterPowerPath() + { + setRegisterBit(POWERS_PPM_REG_09H, 5); //Force BATFET Off : BATFET_DIS + } + + // Enable battery power path + void enableBatterPowerPath() + { + clrRegisterBit(POWERS_PPM_REG_09H, 5); //Force BATFET Off : BATFET_DIS + } + + // JEITA High Temperature Voltage Setting + // JEITA(Japan Electronics and Information Technology Industries Association) + // https://en.wikipedia.org/wiki/Japan_Electronics_and_Information_Technology_Industries_Association + // 0 – Set Charge Voltage to VREG-200mV during JEITA hig temperature(default) + // 1 – Set Charge Voltage to VREG during JEITA high temperature + void setJeitaHighTemperature(uint8_t params) + { + params ? setRegisterBit(POWERS_PPM_REG_09H, 4) : clrRegisterBit(POWERS_PPM_REG_09H, 4) ; + } + + // BATFET turn off delay control + // 0 – BATFET turn off immediately when BATFET_DIS bit is set (default) + // 1 – BATFET turn off delay by tSM_DLY when BATFET_DIS bit is set + void setTurnOffDelay(uint8_t params) + { + params ? setRegisterBit(POWERS_PPM_REG_09H, 3) : clrRegisterBit(POWERS_PPM_REG_09H, 3) ; + } + + // BATFET full system reset enable + // 0 – Disable BATFET full system reset + // 1 – Enable BATFET full system reset (default) + void setFullSystemReset(uint8_t params) + { + params ? setRegisterBit(POWERS_PPM_REG_09H, 2) : clrRegisterBit(POWERS_PPM_REG_09H, 2) ; + } + + // Current pulse control voltage up enable + // 0 – Disable (default) + // 1 – Enable + // Note: This bit is can only be set when EN_PUMPX bit is set and returns to 0 after current pulse control sequence is completed + void setCurrentPulseControlVoltageUp(uint8_t params) + { + params ? setRegisterBit(POWERS_PPM_REG_09H, 1) : clrRegisterBit(POWERS_PPM_REG_09H, 1) ; + } + + // Current pulse control voltage down enable + // 0 – Disable (default) + // 1 – Enable + // Note: This bit is can only be set when EN_PUMPX bit is set and returns to 0 after current pulse control sequence is completed + void setCurrentPulseControlVoltageDown(uint8_t params) + { + params ? setRegisterBit(POWERS_PPM_REG_09H, 0) : clrRegisterBit(POWERS_PPM_REG_09H, 0) ; + } + + /*************************************************** + * POWERS_PPM_REG_0AH ✅ + **************************************************/ + + // Boost Mode Voltage Regulation: 4550mV ~ 5510mV + bool setBoostVoltage(uint16_t millivolt) + { + if (millivolt % POWERS_BQ25896_BOOTS_VOL_STEP) { + log_e("Mistake ! The steps is must %u mV", POWERS_BQ25896_BOOTS_VOL_STEP); + return false; + } + if (millivolt < POWERS_BQ25896_BOOST_VOL_MIN) { + millivolt = POWERS_BQ25896_BOOST_VOL_MIN; + } + if (millivolt > POWERS_BQ25896_BOOST_VOL_MAX) { + millivolt = POWERS_BQ25896_BOOST_VOL_MAX; + } + int val = readRegister(POWERS_PPM_REG_0AH); + val &= 0xF0; + val |= (((millivolt - POWERS_BQ25896_BOOTS_VOL_BASE) / POWERS_BQ25896_BOOTS_VOL_STEP) << 4); + return writeRegister(POWERS_PPM_REG_0AH, val) != -1; + } + + // Boost Current Limit: 500mA ~ 150 mA + bool setBoostCurrentLimit(BoostCurrentLimit milliampere) + { + if (milliampere > BOOST_CUR_LIMIT_2150MA) { + return false; + } + int val = readRegister(POWERS_PPM_REG_0AH); + val &= 0x03; + val |= milliampere; + return writeRegister(POWERS_PPM_REG_0AH, val) != -1; + } + + // PFM mode allowed in boost mode + // 0 – Allow PFM in boost mode (default) + // 1 – Disable PFM in boost mode + void setBoostModeUsePFM(bool enable) + { + enable ? clrRegisterBit(POWERS_PPM_REG_0AH, 3) : setRegisterBit(POWERS_PPM_REG_0AH, 3); + } + + + /*************************************************** + * POWERS_PPM_REG_0BH ✅ + **************************************************/ + + bool isOTG() + { + return getBusStatus() == BUS_STATE_OTG; + } + + bool isCharging(void) + { + return chargeStatus() != CHARGE_STATE_NO_CHARGE; + } + + bool isChargeDone() + { + return chargeStatus() != CHARGE_STATE_DONE; + } + + bool isPowerGood() + { + return getRegisterBit(POWERS_PPM_REG_0BH, 2); + } + + BusStatus getBusStatus() + { + int val = readRegister(POWERS_PPM_REG_0BH); + return static_cast((val >> 5) & 0x07); + } + + const char *getBusStatusString() + { + BusStatus status = getBusStatus(); + switch (status) { + case BUS_STATE_NOINPUT: + return "No input"; + case BUS_STATE_USB_SDP: + return "USB Host SDP"; + case BUS_STATE_ADAPTER: + return "Adapter"; + case BUS_STATE_OTG: + return "OTG"; + default: + return "Unknown"; + } + } + + ChargeStatus chargeStatus() + { + int val = readRegister(POWERS_PPM_REG_0BH); + if (val == -1)return CHARGE_STATE_UNKOWN; + return static_cast((val >> 3) & 0x03); + } + + const char *getChargeStatusString() + { + ChargeStatus status = chargeStatus(); + switch (status) { + case CHARGE_STATE_NO_CHARGE: + return "Not Charging"; + case CHARGE_STATE_PRE_CHARGE: + return "Pre-charge"; + case CHARGE_STATE_FAST_CHARGE: + return "Fast Charging"; + case CHARGE_STATE_DONE: + return "Charge Termination Done"; + default: + return "Unknown"; + } + } + + // VSYS Regulation Status + // 0 – Not in VSYSMIN regulation (BAT > VSYSMIN) + // 1 – In VSYSMIN regulation (BAT < VSYSMIN) + bool getVsysRegulationStatus() + { + return getRegisterBit(POWERS_PPM_REG_0BH, 0); + } + + const char *getVsysRegulationStatusString() + { + if (getVsysRegulationStatus()) { + return "BAT < VSYSMIN"; + } + return "BAT > VSYSMIN"; + } + + /*************************************************** + * POWERS_PPM_REG_0CH ✅ + **************************************************/ + + // After reading the register, all will be cleared + uint8_t getFaultStatus(void) + { + int val = readRegister(POWERS_PPM_REG_0CH); + if (val == -1) { + return 0; + } + __irq_mask = val; + return __irq_mask; + } + + // Watchdog Fault Status + // 0 – Normal + // 1- Watchdog timer expiration + bool isWatchdogFault() + { + return POWERS_BQ25896_IRQ_WTD_FAULT(__irq_mask); + } + + // Boost Mode Fault Status + // 0 – Normal + // 1 – VBUS overloaded in OTG, or VBUS OVP, or battery is too low in boost mode + bool isBoostFault() + { + return POWERS_BQ25896_IRQ_BOOST_FAULT(__irq_mask); + } + + // Charge Fault Status + // 00 – Normal + // 01 – Input fault (VBUS > VACOV or VBAT < VBUS < VVBUSMIN(typical 3.8V) + // 10 - Thermal shutdown + // 11 – Charge Safety Timer Expiration + uint8_t isChargeFault() + { + return POWERS_BQ25896_IRQ_CHG_FAULT(__irq_mask); + } + + // Battery Fault Status + // 0 – Normal + // 1 – BATOVP (VBAT > VBATOVP) + bool isBatteryFault() + { + return POWERS_BQ25896_IRQ_BAT_FAULT(__irq_mask); + } + + // NTC Fault Status + bool isNTCFault() + { + return POWERS_BQ25896_IRQ_NTC_FAULT(__irq_mask); + } + + // NTC Fault Status string + uint8_t getNTCStatus() + { + return (__irq_mask & 0x07); + } + + const char *getNTCStatusString() + { + uint8_t status = getNTCStatus(); + if (isOTG()) { + // Boost mode + switch (status) { + case BOOST_NTC_NORMAL: + return "Boost mode NTC normal"; + case BOOST_NTC_COLD: + return "Boost mode NTC cold"; + case BOOST_NTC_HOT: + return "Boost mode NTC hot"; + default: + break; + } + } else { + // Buck mode + switch (status) { + case BUCK_NTC_NORMAL: + return "Buck mode NTC normal"; + case BUCK_NTC_WARM: + return "Buck mode NTC warm"; + case BUCK_NTC_COOL: + case BUCK_NTC_COLD: + return "Buck mode NTC cold"; + case BUCK_NTC_HOT: + return "Buck mode NTC hot"; + default: + break; + } + } + return "Unknown"; + } + + // Debug + void getReadOnlyRegisterValue() + { +#ifdef ARDUINO //debug .. + static uint8_t last_val[8] = {0}; + const uint8_t regis[] = { + POWERS_PPM_REG_0BH, + POWERS_PPM_REG_0CH, + // POWERS_PPM_REG_0EH, //BATTERY VOLTAGE + // POWERS_PPM_REG_0FH, //SYSTEM VOLTAGE + // POWERS_PPM_REG_10H, //NTC PERCENTAGE + // POWERS_PPM_REG_11H, //VBUS VOLTAGE + POWERS_PPM_REG_12H, + POWERS_PPM_REG_13H + }; + Serial.println(); + Serial.println("-------------------------"); + for (uint32_t i = 0; i < sizeof(regis) / sizeof(regis[0]); ++i) { + int val = readRegister(regis[i]); + if (val == -1) { + continue; + } + if (last_val[i] != val) { + Serial.printf("\t---> REG%02X Prev:0x%02X ", regis[i], last_val[i]); + Serial.print(" BIN:"); Serial.print(last_val[i], BIN); + Serial.printf(" Curr: 0x%02X", val); + Serial.print(" BIN:"); Serial.println(val, BIN); + last_val[i] = val; + } + Serial.printf("\tREG%02XH:0x%X BIN:0b", regis[i], val); + Serial.println(val, BIN); + } + Serial.println("-------------------------"); +#endif + } + + /*************************************************** + * POWERS_PPM_REG_0DH ✅ + **************************************************/ + // VINDPM Threshold Setting Method + // 0 – Run Relative VINDPM Threshold (default) + // 1 – Run Absolute VINDPM Threshold + // Note: Register is reset to default value when input source is plugged-in + void setVinDpmThresholdSetting(bool relative) + { + relative ? clrRegisterBit(POWERS_PPM_REG_0DH, 7) : setRegisterBit(POWERS_PPM_REG_0DH, 7); + } + + // Absolute VINDPM Threshold + bool setVinDpmThreshold(uint16_t millivolt) + { + if (millivolt % POWERS_BQ25896_VINDPM_VOL_STEPS) { + log_e("Mistake ! The steps is must %u mV", POWERS_BQ25896_VINDPM_VOL_STEPS); + return false; + } + if (millivolt < POWERS_BQ25896_VINDPM_VOL_MIN) { + millivolt = POWERS_BQ25896_VINDPM_VOL_MIN; + } + if (millivolt > POWERS_BQ25896_VINDPM_VOL_MAX) { + millivolt = POWERS_BQ25896_VINDPM_VOL_MAX; + } + int val = readRegister(POWERS_PPM_REG_0DH); + val &= 0x80; + val |= (((millivolt - POWERS_BQ25896_VINDPM_VOL_BASE) / POWERS_BQ25896_VINDPM_VOL_STEPS)); + return writeRegister(POWERS_PPM_REG_0DH, val) != -1; + } + + /*************************************************** + * POWERS_PPM_REG_0EH ✅ + **************************************************/ + // Thermal Regulation Status + // true – Normal + // false – In Thermal Regulation + bool isThermalRegulationNormal() + { + return getRegisterBit(POWERS_PPM_REG_0EH, 7) == false; + } + + // ADC conversion of Battery Voltage /mv + uint16_t getBattVoltage() + { + int val = readRegister(POWERS_PPM_REG_0EH); + if (val == -1)return 0; + val = POWERS_BQ25896_VBAT_MASK_VAL(val); + if (val == 0)return 0; + return (val * POWERS_BQ25896_VBAT_VOL_STEP) + POWERS_BQ25896_VBAT_BASE_VAL; + } + + /*************************************************** + * POWERS_PPM_REG_0FH ✅ + **************************************************/ + + // ADC conversion of System Voltage (VSYS) + uint16_t getSystemVoltage() + { + int val = readRegister(POWERS_PPM_REG_0FH); + if (val == -1 || val == 0)return 0; + return (POWERS_BQ25896_VSYS_MASK_VAL(val) * POWERS_BQ25896_VSYS_VOL_STEP) + POWERS_BQ25896_VSYS_BASE_VAL; + } + + /*************************************************** + * POWERS_PPM_REG_10H ✅ + **************************************************/ + + // ADC conversion of TS Voltage (TS) as percentage of REGN + float getNTCPercentage() + { + int val = readRegister(POWERS_PPM_REG_10H); + if (val == -1)return 0; + return (POWERS_BQ25896_NTC_MASK_VAL(val) * POWERS_BQ25896_NTC_VOL_STEP) + POWERS_BQ25896_NTC_BASE_VAL; + } + + /*************************************************** + * POWERS_PPM_REG_11H ✅ + **************************************************/ + + // VBUS Good Status + bool isVbusIn() + { + return getRegisterBit(POWERS_PPM_REG_11H, 7); + } + + // ADC conversion of VBUS voltage (VBUS) + uint16_t getVbusVoltage() + { + if (!isVbusIn()) { + return 0; + } + int val = readRegister(POWERS_PPM_REG_11H); + return (POWERS_BQ25896_VBUS_MASK_VAL(val) * POWERS_BQ25896_VBUS_VOL_STEP) + POWERS_BQ25896_VBUS_BASE_VAL; + } + + /*************************************************** + * POWERS_PPM_REG_12H ✅ + **************************************************/ + + // ADC conversion of Charge Current (IBAT) when VBAT > VBATSHORT + //* If the charger is disconnected, the value in the register + //* will remain the last value and will not be updated to 0. + uint16_t getChargeCurrent() + { + ChargeStatus status = chargeStatus(); + if (status == CHARGE_STATE_NO_CHARGE) { + return 0; + } + int val = readRegister(POWERS_PPM_REG_12H); + if (val == 0 || val == -1)return 0; + val = (val & 0x7F); + return (val * POWERS_BQ25896_CHG_STEP_VAL) ; + } + + /*************************************************** + * POWERS_PPM_REG_13H ✅ + **************************************************/ + // VINDPM Status : DynamicPower-Path Management and Dynamic Power Management + bool isDynamicPowerManagement() + { + return getRegisterBit(POWERS_PPM_REG_13H, 7); + } + + // IINDPM Status + bool isInputCurrentLimit() + { + return getRegisterBit(POWERS_PPM_REG_13H, 6); + } + + // Input Current Limit in effect while Input Current Optimizer (ICO) is enabled + // Range: 100 ~ 3250 mA + bool setInputCurrentLimitOptimizer(uint16_t milliampere) + { + if (milliampere % POWERS_BQ25896_IN_CURRENT_OPT_STEP) { + log_e("Mistake ! The steps is must %u mA", POWERS_BQ25896_IN_CURRENT_OPT_STEP); + return false; + } + if (milliampere < POWERS_BQ25896_IN_CURRENT_OPT_MIN) { + milliampere = POWERS_BQ25896_IN_CURRENT_OPT_MIN; + } + if (milliampere > POWERS_BQ25896_IN_CURRENT_OPT_MAX) { + milliampere = POWERS_BQ25896_IN_CURRENT_OPT_MAX; + } + int val = readRegister(POWERS_PPM_REG_13H); + if (val == -1) + return false; + val &= 0x3F; + milliampere = ((milliampere - POWERS_BQ25896_IN_CURRENT_OPT_MIN) / POWERS_BQ25896_IN_CURRENT_STEP); + val |= milliampere; + return writeRegister(POWERS_PPM_REG_13H, val) != -1; + } + + /*************************************************** + * POWERS_PPM_REG_14H ✅ + **************************************************/ + void resetDefault() + { + setRegisterBit(POWERS_PPM_REG_14H, 7); + } + + // Input Current Optimizer (ICO) Status + // true – Optimization is in progress + // false – Maximum Input Current Detected + bool isInputCurrentOptimizer() + { + return getRegisterBit(POWERS_PPM_REG_14H, 6) ; + } + + // Device Revision:Default 10 + uint8_t getChipID() + { + int val = readRegister(POWERS_PPM_REG_14H); + if (val == -1)return 0; + return (val & 0x03); + } + + // Device Configuration + uint8_t getDeviceConfig() + { + int val = readRegister(POWERS_PPM_REG_14H); + if (val == -1)return 0; + return (val >> 3) & 0x03; + } + +private: + + bool initImpl() + { + __user_disable_charge = false; + + uint8_t rev = getChipID(); + if (rev != BQ25896_DEV_REV) { + return false; + } + // Set the minimum operating voltage. Below this voltage, the PMU will protect + // setSysPowerDownVoltage(3300); + + //Default disable Watchdog + disableWatchdog(); + + return true; + } + + bool __user_disable_charge; + uint32_t __irq_mask; +}; + diff --git a/libdeps/XPowersLib/src/PowersSY6970.tpp b/libdeps/XPowersLib/src/PowersSY6970.tpp index f99a96a..2ee726b 100644 --- a/libdeps/XPowersLib/src/PowersSY6970.tpp +++ b/libdeps/XPowersLib/src/PowersSY6970.tpp @@ -33,88 +33,88 @@ #include #endif /*ARDUINO*/ #include "XPowersCommon.tpp" +#include "REG/GeneralPPMConstants.h" #include "REG/SY6970Constants.h" -// #include "XPowersLibInterface.hpp" - -enum PowersSY6970BusStatus { - POWERS_SY_NOINPUT, - POWERS_SY_USB_SDP, - POWERS_SY_USB_CDP, - POWERS_SY_USB_DCP, - POWERS_SY_HVDCP, - POWERS_SY_UNKONW_ADAPTER, - POWERS_SY_NO_STANDARD_ADAPTER, - POWERS_SY_OTG -} ; - -enum PowersSY6970ChargeStatus { - POWERS_SY_NO_CHARGE, - POWERS_SY_PRE_CHARGE, - POWERS_SY_FAST_CHARGE, - POWERS_SY_CHARGE_DONE, - POWERS_SY_CHARGE_UNKOWN, -} ; - -enum PowersSY6970NTCStatus { - POWERS_SY_BUCK_NTC_NORMAL = 0, - POWERS_SY_BUCK_NTC_WARM = 2, - POWERS_SY_BUCK_NTC_COOL = 3, - POWERS_SY_BUCK_NTC_COLD = 5, - POWERS_SY_BUCK_NTC_HOT = 6, -}; - -enum PowersSY6970BoostNTCStatus { - POWERS_SY_BOOST_NTC_NORMAL = 0, - POWERS_SY_BOOST_NTC_COLD = 5, - POWERS_SY_BOOST_NTC_HOT = 6, -}; - -enum SY6970_WDT_Timeout { - SY6970_WDT_TIMEROUT_40SEC, //40 Second - SY6970_WDT_TIMEROUT_80SEC, //80 Second - SY6970_WDT_TIMEROUT_160SEC, //160 Second -} ; - -enum ADCMeasure { - SY6970_ADC_ONE_SHORT, - SY6970_ADC_CONTINUOUS, -}; - -enum BoostFreq { - SY6970_BOOST_FREQ_1500KHZ, - SY6970_BOOST_FREQ_500KHZ, -}; - -enum RequestRange { - REQUEST_9V, - REQUEST_12V, -}; - -enum FastChargeTimer { - FAST_CHARGE_TIMER_5H, - FAST_CHARGE_TIMER_8H, - FAST_CHARGE_TIMER_12H, - FAST_CHARGE_TIMER_20H, -}; -enum BoostCurrentLimit { - BOOST_CUR_LIMIT_500MA, - BOOST_CUR_LIMIT_750MA, - BOOST_CUR_LIMIT_1200MA, - BOOST_CUR_LIMIT_1400MA, - BOOST_CUR_LIMIT_1650MA, - BOOST_CUR_LIMIT_1875MA, - BOOST_CUR_LIMIT_2150MA, - BOOST_CUR_LIMIT_2450MA, -} ; class PowersSY6970 : - public XPowersCommon //, public XPowersLibInterface + public XPowersCommon { friend class XPowersCommon; public: + enum BusStatus { + BUS_STATE_NOINPUT, + BUS_STATE_USB_SDP, + BUS_STATE_USB_CDP, + BUS_STATE_USB_DCP, + BUS_STATE_HVDCP, + BUS_STATE_ADAPTER, + BUS_STATE_NO_STANDARD_ADAPTER, + BUS_STATE_OTG + } ; + + enum ChargeStatus { + CHARGE_STATE_NO_CHARGE, + CHARGE_STATE_PRE_CHARGE, + CHARGE_STATE_FAST_CHARGE, + CHARGE_STATE_DONE, + CHARGE_STATE_UNKOWN, + } ; + + enum NTCStatus { + BUCK_NTC_NORMAL = 0, + BUCK_NTC_WARM = 2, + BUCK_NTC_COOL = 3, + BUCK_NTC_COLD = 5, + BUCK_NTC_HOT = 6, + }; + + enum BoostNTCStatus { + BOOST_NTC_NORMAL = 0, + BOOST_NTC_COLD = 5, + BOOST_NTC_HOT = 6, + }; + + enum Timeout { + TIMER_OUT_40SEC, //40 Second + TIMER_OUT_80SEC, //80 Second + TIMER_OUT_160SEC, //160 Second + } ; + + enum MeasureMode { + ONE_SHORT, + CONTINUOUS, + }; + + enum BoostFreq { + BOOST_FREQ_1500KHZ, + BOOST_FREQ_500KHZ, + }; + + enum RequestRange { + REQUEST_9V, + REQUEST_12V, + }; + + enum FastChargeTimer { + FAST_CHARGE_TIMER_5H, + FAST_CHARGE_TIMER_8H, + FAST_CHARGE_TIMER_12H, + FAST_CHARGE_TIMER_20H, + }; + + enum BoostCurrentLimit { + BOOST_CUR_LIMIT_500MA, + BOOST_CUR_LIMIT_750MA, + BOOST_CUR_LIMIT_1200MA, + BOOST_CUR_LIMIT_1400MA, + BOOST_CUR_LIMIT_1650MA, + BOOST_CUR_LIMIT_1875MA, + BOOST_CUR_LIMIT_2150MA, + BOOST_CUR_LIMIT_2450MA, + } ; #if defined(ARDUINO) PowersSY6970(TwoWire &w, int sda = SDA, int scl = SCL, uint8_t addr = SY6970_SLAVE_ADDRESS) @@ -161,15 +161,20 @@ public: } #endif + const char *getChipName() + { + return getChipID() == SY6970_DEV_REV ? "SY6970" : "Unkown"; + } + uint8_t getChipID() { - int res = readRegister(POWERS_SY6970_REG_14H); + int res = readRegister(POWERS_PPM_REG_14H); return (res & 0x03); } void resetDefault() { - setRegisterBit(POWERS_SY6970_REG_14H, 7); + setRegisterBit(POWERS_PPM_REG_14H, 7); } bool init() @@ -185,22 +190,22 @@ public: ///REG0B bool isVbusIn() { - return getBusStatus() != POWERS_SY_NOINPUT; + return getBusStatus() != BUS_STATE_NOINPUT; } bool isOTG() { - return getBusStatus() == POWERS_SY_OTG; + return getBusStatus() == BUS_STATE_OTG; } bool isCharging(void) { - return chargeStatus() != POWERS_SY_NO_CHARGE; + return chargeStatus() != CHARGE_STATE_NO_CHARGE; } bool isChargeDone() { - return chargeStatus() != POWERS_SY_CHARGE_DONE; + return chargeStatus() != CHARGE_STATE_DONE; } bool isBatteryConnect(void) __attribute__((error("Not implemented"))) @@ -211,34 +216,34 @@ public: bool isPowerGood() { - return getRegisterBit(POWERS_SY6970_REG_0BH, 2); + return getRegisterBit(POWERS_PPM_REG_0BH, 2); } bool isEnableCharge() { - return getRegisterBit(POWERS_SY6970_REG_03H, 4); + return getRegisterBit(POWERS_PPM_REG_03H, 4); } void disableCharge() { __user_disable_charge = true; - clrRegisterBit(POWERS_SY6970_REG_03H, 4); + clrRegisterBit(POWERS_PPM_REG_03H, 4); } void enableCharge() { __user_disable_charge = false; - setRegisterBit(POWERS_SY6970_REG_03H, 4); + setRegisterBit(POWERS_PPM_REG_03H, 4); } bool isEnableOTG() { - return getRegisterBit(POWERS_SY6970_REG_03H, 5); + return getRegisterBit(POWERS_PPM_REG_03H, 5); } void disableOTG() { - clrRegisterBit(POWERS_SY6970_REG_03H, 5); + clrRegisterBit(POWERS_PPM_REG_03H, 5); /* * After turning on the OTG function, the charging function will * be automatically disabled. If the user does not disable the charging @@ -246,7 +251,7 @@ public: * turning off the OTG output. * */ if (!__user_disable_charge) { - setRegisterBit(POWERS_SY6970_REG_03H, 4); + setRegisterBit(POWERS_PPM_REG_03H, 4); } } @@ -254,12 +259,12 @@ public: { if (isVbusIn()) return false; - return setRegisterBit(POWERS_SY6970_REG_03H, 5); + return setRegisterBit(POWERS_PPM_REG_03H, 5); } void feedWatchdog() { - setRegisterBit(POWERS_SY6970_REG_03H, 6); + setRegisterBit(POWERS_PPM_REG_03H, 6); } bool setSysPowerDownVoltage(uint16_t millivolt) @@ -275,18 +280,18 @@ public: log_e("Mistake ! SYS maximum output voltage is %umV", POWERS_SY6970_SYS_VOFF_VOL_MAX); return false; } - int val = readRegister(POWERS_SY6970_REG_03H); + int val = readRegister(POWERS_PPM_REG_03H); if (val == -1)return false; val &= 0xF1; val |= (millivolt - POWERS_SY6970_SYS_VOFF_VOL_MIN) / POWERS_SY6970_SYS_VOL_STEPS; val <<= 1; - return 0 == writeRegister(POWERS_SY6970_REG_03H, val); + return 0 == writeRegister(POWERS_PPM_REG_03H, val); } uint16_t getSysPowerDownVoltage() { - int val = readRegister(POWERS_SY6970_REG_03H); + int val = readRegister(POWERS_PPM_REG_03H); if (val == -1)return 0; val &= 0x0E; val >>= 1; @@ -296,56 +301,57 @@ public: // Charging Termination Enable void enableChargingTermination() { - setRegisterBit(POWERS_SY6970_REG_07H, 7); + setRegisterBit(POWERS_PPM_REG_07H, 7); } // Charging Termination Enable void disableChargingTermination() { - clrRegisterBit(POWERS_SY6970_REG_07H, 7); + clrRegisterBit(POWERS_PPM_REG_07H, 7); } // Charging Termination Enable bool isEnableChargingTermination() { - return getRegisterBit(POWERS_SY6970_REG_07H, 7); + return getRegisterBit(POWERS_PPM_REG_07H, 7); } + // disableStatPin void disableStatLed() { - setRegisterBit(POWERS_SY6970_REG_07H, 6); + setRegisterBit(POWERS_PPM_REG_07H, 6); } void enableStatLed() { - clrRegisterBit(POWERS_SY6970_REG_07H, 6); + clrRegisterBit(POWERS_PPM_REG_07H, 6); } bool isEnableStatLed() { - return getRegisterBit(POWERS_SY6970_REG_07H, 6) == false; + return getRegisterBit(POWERS_PPM_REG_07H, 6) == false; } void disableWatchdog() { - int regVal = readRegister(POWERS_SY6970_REG_07H); + int regVal = readRegister(POWERS_PPM_REG_07H); regVal &= 0xCF; - writeRegister(POWERS_SY6970_REG_07H, regVal); + writeRegister(POWERS_PPM_REG_07H, regVal); } - void enableWatchdog(enum SY6970_WDT_Timeout val = SY6970_WDT_TIMEROUT_40SEC ) + void enableWatchdog(enum Timeout val) { - int regVal = readRegister(POWERS_SY6970_REG_07H); + int regVal = readRegister(POWERS_PPM_REG_07H); regVal &= 0xCF; switch (val) { - case SY6970_WDT_TIMEROUT_40SEC: - writeRegister(POWERS_SY6970_REG_07H, regVal | 0x10); + case TIMER_OUT_40SEC: + writeRegister(POWERS_PPM_REG_07H, regVal | 0x10); break; - case SY6970_WDT_TIMEROUT_80SEC: - writeRegister(POWERS_SY6970_REG_07H, regVal | 0x20); + case TIMER_OUT_80SEC: + writeRegister(POWERS_PPM_REG_07H, regVal | 0x20); break; - case SY6970_WDT_TIMEROUT_160SEC: - writeRegister(POWERS_SY6970_REG_07H, regVal | 0x30); + case TIMER_OUT_160SEC: + writeRegister(POWERS_PPM_REG_07H, regVal | 0x30); break; default: break; @@ -355,17 +361,17 @@ public: void disableChargingSafetyTimer() { - clrRegisterBit(POWERS_SY6970_REG_07H, 3); + clrRegisterBit(POWERS_PPM_REG_07H, 3); } void enableChargingSafetyTimer() { - setRegisterBit(POWERS_SY6970_REG_07H, 3); + setRegisterBit(POWERS_PPM_REG_07H, 3); } bool isEnableChargingSafetyTimer() { - return getRegisterBit(POWERS_SY6970_REG_07H, 3); + return getRegisterBit(POWERS_PPM_REG_07H, 3); } void setFastChargeTimer(FastChargeTimer timer) @@ -376,12 +382,12 @@ public: case FAST_CHARGE_TIMER_8H: case FAST_CHARGE_TIMER_12H: case FAST_CHARGE_TIMER_20H: - val = readRegister(POWERS_SY6970_REG_07H); + val = readRegister(POWERS_PPM_REG_07H); if (val == -1) return; val &= 0xF1; val |= (timer << 1); - writeRegister(POWERS_SY6970_REG_07H, val); + writeRegister(POWERS_PPM_REG_07H, val); break; default: break; @@ -390,86 +396,76 @@ public: FastChargeTimer getFastChargeTimer() { - int val = readRegister(POWERS_SY6970_REG_07H); + int val = readRegister(POWERS_PPM_REG_07H); return static_cast((val & 0x0E) >> 1); } // Return Battery Load status bool isEnableBatLoad() { - return getRegisterBit(POWERS_SY6970_REG_03H, 7); + return getRegisterBit(POWERS_PPM_REG_03H, 7); } // Battery Load (10mA) Disable void disableBatLoad() { - clrRegisterBit(POWERS_SY6970_REG_03H, 7); + clrRegisterBit(POWERS_PPM_REG_03H, 7); } // Battery Load (10mA) Enable void enableBatLoad() { - setRegisterBit(POWERS_SY6970_REG_03H, 7); + setRegisterBit(POWERS_PPM_REG_03H, 7); } - PowersSY6970BusStatus getBusStatus() + BusStatus getBusStatus() { - int val = readRegister(POWERS_SY6970_REG_0BH); - return (PowersSY6970BusStatus)((val >> 5) & 0x07); + int val = readRegister(POWERS_PPM_REG_0BH); + return (BusStatus)((val >> 5) & 0x07); } const char *getBusStatusString() { - PowersSY6970BusStatus status = getBusStatus(); + BusStatus status = getBusStatus(); switch (status) { - case POWERS_SY_NOINPUT: + case BUS_STATE_NOINPUT: return "No input"; - case POWERS_SY_USB_SDP: + case BUS_STATE_USB_SDP: return "USB Host SDP"; - case POWERS_SY_USB_CDP: + case BUS_STATE_USB_CDP: return "USB CDP"; - case POWERS_SY_USB_DCP: + case BUS_STATE_USB_DCP: return "USB DCP"; - case POWERS_SY_HVDCP: + case BUS_STATE_HVDCP: return "HVDCP"; - case POWERS_SY_UNKONW_ADAPTER: - return "Unknown Adapter"; - case POWERS_SY_NO_STANDARD_ADAPTER: - return "Non-Standard Adapter"; - case POWERS_SY_OTG: + case BUS_STATE_ADAPTER: + case BUS_STATE_NO_STANDARD_ADAPTER: + return "Adapter"; + case BUS_STATE_OTG: return "OTG"; default: return "Unknown"; } } - PowersSY6970ChargeStatus chargeStatus() + ChargeStatus chargeStatus() { - int val = readRegister(POWERS_SY6970_REG_0BH); - if (val == -1)return POWERS_SY_CHARGE_UNKOWN; - PowersSY6970ChargeStatus status = (PowersSY6970ChargeStatus)((val >> 3) & 0x03); - - /* - * Directly obtaining the register cannot produce accurate results. - * Add check to determine whether there is charging current to determine whether it is in the charging state. - * */ - if (getChargeCurrent() > 0 && status != POWERS_SY_NO_CHARGE) { - return status; - } - return POWERS_SY_NO_CHARGE; + int val = readRegister(POWERS_PPM_REG_0BH); + if (val == -1)return CHARGE_STATE_UNKOWN; + return static_cast((val >> 3) & 0x03); } const char *getChargeStatusString() { - PowersSY6970ChargeStatus status = chargeStatus(); + ChargeStatus status = chargeStatus(); switch (status) { - case POWERS_SY_NO_CHARGE: + case CHARGE_STATE_NO_CHARGE: return "Not Charging"; - case POWERS_SY_PRE_CHARGE: + case CHARGE_STATE_PRE_CHARGE: return "Pre-charge"; - case POWERS_SY_FAST_CHARGE: + case CHARGE_STATE_FAST_CHARGE: return "Fast Charging"; - case POWERS_SY_CHARGE_DONE: + case CHARGE_STATE_DONE: return "Charge Termination Done"; default: return "Unknown"; @@ -488,11 +484,11 @@ public: if (isOTG()) { // Boost mode switch (status) { - case POWERS_SY_BOOST_NTC_NORMAL: + case BOOST_NTC_NORMAL: return "Boost mode NTC normal"; - case POWERS_SY_BOOST_NTC_COLD: + case BOOST_NTC_COLD: return "Boost mode NTC cold"; - case POWERS_SY_BOOST_NTC_HOT: + case BOOST_NTC_HOT: return "Boost mode NTC hot"; default: break; @@ -500,14 +496,14 @@ public: } else { // Buck mode switch (status) { - case POWERS_SY_BUCK_NTC_NORMAL: + case BUCK_NTC_NORMAL: return "Buck mode NTC normal"; - case POWERS_SY_BUCK_NTC_WARM: + case BUCK_NTC_WARM: return "Buck mode NTC warm"; - case POWERS_SY_BUCK_NTC_COOL: - case POWERS_SY_BUCK_NTC_COLD: + case BUCK_NTC_COOL: + case BUCK_NTC_COLD: return "Buck mode NTC cold"; - case POWERS_SY_BUCK_NTC_HOT: + case BUCK_NTC_HOT: return "Buck mode NTC hot"; default: break; @@ -516,38 +512,44 @@ public: return "Unknown"; } - bool enableADCMeasure(ADCMeasure mode = SY6970_ADC_CONTINUOUS) + bool enableADCMeasure() __attribute__((deprecated("The enableADCMeasure method will be replaced by enableMeasure in the future. Please update it to enableMeasure."))) + { + return enableMeasure(); + } + + bool enableMeasure(MeasureMode mode = CONTINUOUS) { - int val = readRegister(POWERS_SY6970_REG_02H); + int val = readRegister(POWERS_PPM_REG_02H); switch (mode) { - case SY6970_ADC_CONTINUOUS: + case CONTINUOUS: val |= _BV(6); break; - case SY6970_ADC_ONE_SHORT: + case ONE_SHORT: + val &= (~_BV(6)); default: break; } val |= _BV(7); - return writeRegister(POWERS_SY6970_REG_02H, val) != -1; + return writeRegister(POWERS_PPM_REG_02H, val) != -1; } bool disableADCMeasure() { - int val = readRegister(POWERS_SY6970_REG_02H); + int val = readRegister(POWERS_PPM_REG_02H); if (val == -1) { return false; } val &= (~_BV(7)); - return writeRegister(POWERS_SY6970_REG_02H, val) != 1; + return writeRegister(POWERS_PPM_REG_02H, val) != 1; } bool setBoostFreq(BoostFreq freq) { switch (freq) { - case SY6970_BOOST_FREQ_500KHZ: - return setRegisterBit(POWERS_SY6970_REG_02H, 5); - case SY6970_BOOST_FREQ_1500KHZ: - return clrRegisterBit(POWERS_SY6970_REG_02H, 5); + case BOOST_FREQ_500KHZ: + return setRegisterBit(POWERS_PPM_REG_02H, 5); + case BOOST_FREQ_1500KHZ: + return clrRegisterBit(POWERS_PPM_REG_02H, 5); default: break; } @@ -556,42 +558,42 @@ public: BoostFreq getBoostFreq() { - return getRegisterBit(POWERS_SY6970_REG_02H, 5) ? SY6970_BOOST_FREQ_500KHZ : SY6970_BOOST_FREQ_1500KHZ; + return getRegisterBit(POWERS_PPM_REG_02H, 5) ? BOOST_FREQ_500KHZ : BOOST_FREQ_1500KHZ; } void enableInputCurrentLimit() { - setRegisterBit(POWERS_SY6970_REG_02H, 4); + setRegisterBit(POWERS_PPM_REG_02H, 4); } void disableInputCurrentLimit() { - clrRegisterBit(POWERS_SY6970_REG_02H, 4); + clrRegisterBit(POWERS_PPM_REG_02H, 4); } void enableHVDCP() { - setRegisterBit(POWERS_SY6970_REG_02H, 3); + setRegisterBit(POWERS_PPM_REG_02H, 3); } void disableHVDCP() { - clrRegisterBit(POWERS_SY6970_REG_02H, 3); + clrRegisterBit(POWERS_PPM_REG_02H, 3); } bool isEnableHVDCP() { - return getRegisterBit(POWERS_SY6970_REG_02H, 3); + return getRegisterBit(POWERS_PPM_REG_02H, 3); } void setHighVoltageRequestedRange(RequestRange range) { switch (range) { case REQUEST_9V: - clrRegisterBit(POWERS_SY6970_REG_02H, 2); + clrRegisterBit(POWERS_PPM_REG_02H, 2); break; case REQUEST_12V: - setRegisterBit(POWERS_SY6970_REG_02H, 2); + setRegisterBit(POWERS_PPM_REG_02H, 2); break; default: break; @@ -600,43 +602,43 @@ public: RequestRange getHighVoltageRequestedRange() { - return getRegisterBit(POWERS_SY6970_REG_02H, 2) ? REQUEST_12V : REQUEST_9V; + return getRegisterBit(POWERS_PPM_REG_02H, 2) ? REQUEST_12V : REQUEST_9V; } // Enable Force DP/DM detection void enableDetectionDPDM() { - setRegisterBit(POWERS_SY6970_REG_02H, 1); + setRegisterBit(POWERS_PPM_REG_02H, 1); } // Disable Force DP/DM detection void disableDetectionDPDM() { - clrRegisterBit(POWERS_SY6970_REG_02H, 1); + clrRegisterBit(POWERS_PPM_REG_02H, 1); } // Get Force DP/DM detection bool isEnableDetectionDPDM() { - return getRegisterBit(POWERS_SY6970_REG_02H, 1); + return getRegisterBit(POWERS_PPM_REG_02H, 1); } // Enable DPDM detection when BUS is plugged-in. void enableAutoDetectionDPDM() { - setRegisterBit(POWERS_SY6970_REG_02H, 0); + setRegisterBit(POWERS_PPM_REG_02H, 0); } // Disable DPDM detection when BUS is plugged-in. void disableAutoDetectionDPDM() { - clrRegisterBit(POWERS_SY6970_REG_02H, 0); + clrRegisterBit(POWERS_PPM_REG_02H, 0); } // Get DPDM detection when BUS is plugged-in. bool isEnableAutoDetectionDPDM() { - return getRegisterBit(POWERS_SY6970_REG_02H, 0); + return getRegisterBit(POWERS_PPM_REG_02H, 0); } bool setInputCurrentLimit(uint16_t milliampere) @@ -651,18 +653,18 @@ public: if (milliampere > POWERS_SY6970_IN_CURRENT_MAX) { milliampere = POWERS_SY6970_IN_CURRENT_MAX; } - int val = readRegister(POWERS_SY6970_REG_00H); + int val = readRegister(POWERS_PPM_REG_00H); if (val == -1) return false; val &= 0xC0; milliampere = ((milliampere - POWERS_SY6970_IN_CURRENT_MIN) / POWERS_SY6970_IN_CURRENT_STEP); val |= milliampere; - return writeRegister(POWERS_SY6970_REG_00H, val) != -1; + return writeRegister(POWERS_PPM_REG_00H, val) != -1; } uint32_t getInputCurrentLimit() { - int val = readRegister(POWERS_SY6970_REG_00H); + int val = readRegister(POWERS_PPM_REG_00H); if (val == -1) return false; val &= 0x3F; @@ -671,34 +673,34 @@ public: // USB input path is disabled and can only be reset by disconnecting // the power supply, otherwise the power cannot be turned on - void enableHIZ() + void enterHizMode() { - setRegisterBit(POWERS_SY6970_REG_00H, 7); + setRegisterBit(POWERS_PPM_REG_00H, 7); } - void disableHIZ() + void exitHizMode() { - clrRegisterBit(POWERS_SY6970_REG_00H, 7); + clrRegisterBit(POWERS_PPM_REG_00H, 7); } - bool isHIZ() + bool isHizMode() { - return getRegisterBit(POWERS_SY6970_REG_00H, 7); + return getRegisterBit(POWERS_PPM_REG_00H, 7); } void enableCurrentLimitPin() { - setRegisterBit(POWERS_SY6970_REG_00H, 6); + setRegisterBit(POWERS_PPM_REG_00H, 6); } void disableCurrentLimitPin() { - clrRegisterBit(POWERS_SY6970_REG_00H, 6); + clrRegisterBit(POWERS_PPM_REG_00H, 6); } bool isEnableCurrentLimitPin() { - return getRegisterBit(POWERS_SY6970_REG_00H, 6); + return getRegisterBit(POWERS_PPM_REG_00H, 6); } uint16_t getVbusVoltage() @@ -706,69 +708,67 @@ public: if (!isVbusIn()) { return 0; } - int val = readRegister(POWERS_SY6970_REG_11H); + int val = readRegister(POWERS_PPM_REG_11H); return (POWERS_SY6970_VBUS_MASK_VAL(val) * POWERS_SY6970_VBUS_VOL_STEP) + POWERS_SY6970_VBUS_BASE_VAL; } uint16_t getBattVoltage() { - int val = readRegister(POWERS_SY6970_REG_0EH); + int val = readRegister(POWERS_PPM_REG_0EH); val = POWERS_SY6970_VBAT_MASK_VAL(val); if (val == 0)return 0; - /* - * Directly obtaining the register cannot produce accurate results. - * Adding check to determine whether there is charging current determines whether there is a battery. - * */ - if (getChargeCurrent() != 0) { - return (val * POWERS_SY6970_VBAT_VOL_STEP) + POWERS_SY6970_VBAT_BASE_VAL; - } - return 0; + return (val * POWERS_SY6970_VBAT_VOL_STEP) + POWERS_SY6970_VBAT_BASE_VAL; } uint16_t getSystemVoltage() { - int val = readRegister(POWERS_SY6970_REG_0FH); + int val = readRegister(POWERS_PPM_REG_0FH); return (POWERS_SY6970_VSYS_MASK_VAL(val) * POWERS_SY6970_VSYS_VOL_STEP) + POWERS_SY6970_VSYS_BASE_VAL; } float getNTCPercentage() { - int val = readRegister(POWERS_SY6970_REG_10H); + int val = readRegister(POWERS_PPM_REG_10H); return (POWERS_SY6970_NTC_MASK_VAL(val) * POWERS_SY6970_NTC_VOL_STEP) + POWERS_SY6970_NTC_BASE_VAL; } uint16_t getChargeCurrent() { - int val = readRegister(POWERS_SY6970_REG_12H); + ChargeStatus status = chargeStatus(); + if (status == CHARGE_STATE_NO_CHARGE) { + return 0; + } + //* If the charger is disconnected, the value in the register + //* will remain the last value and will not be updated to 0. + int val = readRegister(POWERS_PPM_REG_12H); if (val == 0)return 0; val = (val & 0x7F); return (val * POWERS_SY6970_CHG_STEP_VAL) ; - } - // Range: 64mA ~ 1024mA ,step:64mA + // Range: 64mA ~ 1024 mA ,step:64mA bool setPrechargeCurr(uint16_t milliampere) { if (milliampere % POWERS_SY6970_PRE_CHG_CUR_STEP) { log_e("Mistake ! The steps is must %u mA", POWERS_SY6970_PRE_CHG_CUR_STEP); return false; } - if (milliampere < POWERS_PRE_CHG_CURRENT_MIN) { - milliampere = POWERS_PRE_CHG_CURRENT_MIN; + if (milliampere < POWERS_SY6970_PRE_CHG_CURRENT_MIN) { + milliampere = POWERS_SY6970_PRE_CHG_CURRENT_MIN; } - if (milliampere > POWERS_PRE_CHG_CURRENT_MAX) { - milliampere = POWERS_PRE_CHG_CURRENT_MAX; + if (milliampere > POWERS_SY6970_PRE_CHG_CURRENT_MAX) { + milliampere = POWERS_SY6970_PRE_CHG_CURRENT_MAX; } - int val = readRegister(POWERS_SY6970_REG_05H); + int val = readRegister(POWERS_PPM_REG_05H); val &= 0x0F; milliampere = ((milliampere - POWERS_SY6970_PRE_CHG_CUR_BASE) / POWERS_SY6970_PRE_CHG_CUR_STEP); val |= milliampere << 4; - return writeRegister(POWERS_SY6970_REG_05H, val) != -1; + return writeRegister(POWERS_PPM_REG_05H, val) != -1; } uint16_t getPrechargeCurr(void) { - int val = readRegister(POWERS_SY6970_REG_05H); + int val = readRegister(POWERS_PPM_REG_05H); val &= 0xF0; val >>= 4; return POWERS_SY6970_PRE_CHG_CUR_STEP + (val * POWERS_SY6970_PRE_CHG_CUR_STEP); @@ -776,34 +776,38 @@ public: uint16_t getChargerConstantCurr() { - int val = readRegister(POWERS_SY6970_REG_04H); + int val = readRegister(POWERS_PPM_REG_04H); val &= 0x7F; return val * POWERS_SY6970_FAST_CHG_CUR_STEP; } - // Range:0~5056mA ,step:64mA + /** + * @brief setChargerConstantCurr + * @note + * @param milliampere: SY6970 Range:0~5056 mA / step:64mA + * @retval true : success false : failed + */ bool setChargerConstantCurr(uint16_t milliampere) { if (milliampere % POWERS_SY6970_FAST_CHG_CUR_STEP) { log_e("Mistake ! The steps is must %u mA", POWERS_SY6970_FAST_CHG_CUR_STEP); return false; } - if (milliampere > POWERS_FAST_CHG_CURRENT_MAX) { - milliampere = POWERS_FAST_CHG_CURRENT_MAX; + if (milliampere > POWERS_SY6970_FAST_CHG_CURRENT_MAX) { + milliampere = POWERS_SY6970_FAST_CHG_CURRENT_MAX; } - - int val = readRegister(POWERS_SY6970_REG_04H); + int val = readRegister(POWERS_PPM_REG_04H); val &= 0x80; val |= (milliampere / POWERS_SY6970_FAST_CHG_CUR_STEP); - return writeRegister(POWERS_SY6970_REG_04H, val) != -1; + return writeRegister(POWERS_PPM_REG_04H, val) != -1; } uint16_t getChargeTargetVoltage() { - int val = readRegister(POWERS_SY6970_REG_06H); + int val = readRegister(POWERS_PPM_REG_06H); val = (val & 0xFC) >> 2; if (val > 0x30) { - return POWERS_FAST_CHG_VOL_MAX; + return POWERS_SY6970_FAST_CHG_VOL_MAX; } return val * POWERS_SY6970_CHG_VOL_STEP + POWERS_SY6970_CHG_VOL_BASE; } @@ -815,38 +819,39 @@ public: log_e("Mistake ! The steps is must %u mV", POWERS_SY6970_CHG_VOL_STEP); return false; } - if (millivolt < POWERS_FAST_CHG_VOL_MIN) { - millivolt = POWERS_FAST_CHG_VOL_MIN; + if (millivolt < POWERS_SY6970_FAST_CHG_VOL_MIN) { + millivolt = POWERS_SY6970_FAST_CHG_VOL_MIN; } - if (millivolt > POWERS_FAST_CHG_VOL_MAX) { - millivolt = POWERS_FAST_CHG_VOL_MAX; + if (millivolt > POWERS_SY6970_FAST_CHG_VOL_MAX) { + millivolt = POWERS_SY6970_FAST_CHG_VOL_MAX; } - int val = readRegister(POWERS_SY6970_REG_06H); + int val = readRegister(POWERS_PPM_REG_06H); val &= 0x03; val |= (((millivolt - POWERS_SY6970_CHG_VOL_BASE) / POWERS_SY6970_CHG_VOL_STEP) << 2); - return writeRegister(POWERS_SY6970_REG_06H, val) != -1; + return writeRegister(POWERS_PPM_REG_06H, val) != -1; } // Turn off the battery power supply path. It can only be turned off when the // battery is powered. It cannot be turned off when USB is connected. + // The device can only be powered on by pressing the PWR button or by connecting the power supply. void shutdown() { - disableBATFET(); + disableBatterPowerPath(); } // Close battery power path - void disableBATFET() + void disableBatterPowerPath() { - setRegisterBit(POWERS_SY6970_REG_09H, 5); //Force BATFET Off : BATFET_DIS + setRegisterBit(POWERS_PPM_REG_09H, 5); //Force BATFET Off : BATFET_DIS } // Enable battery power path - void enableBATFET() + void enableBatterPowerPath() { - clrRegisterBit(POWERS_SY6970_REG_09H, 5); //Force BATFET Off : BATFET_DIS + clrRegisterBit(POWERS_PPM_REG_09H, 5); //Force BATFET Off : BATFET_DIS } - // Boost Mode Voltage Regulation: 4550mV ~ 5510mV + // Boost Mode Voltage Regulation: 4550 mV ~ 5510 mV bool setBoostVoltage(uint16_t millivolt) { if (millivolt % POWERS_SY6970_BOOTS_VOL_STEP) { @@ -859,37 +864,31 @@ public: if (millivolt > POWERS_SY6970_BOOST_VOL_MAX) { millivolt = POWERS_SY6970_BOOST_VOL_MAX; } - int val = readRegister(POWERS_SY6970_REG_0AH); - val &= 0x03; - val |= (((millivolt - POWERS_SY6970_BOOTS_VOL_BASE) / POWERS_SY6970_BOOTS_VOL_STEP) << 2); - return writeRegister(POWERS_SY6970_REG_0AH, val) != -1; + int val = readRegister(POWERS_PPM_REG_0AH); + val &= 0xF0; + val |= (((millivolt - POWERS_SY6970_BOOTS_VOL_BASE) / POWERS_SY6970_BOOTS_VOL_STEP) << 4); + return writeRegister(POWERS_PPM_REG_0AH, val) != -1; } - // Boost Current Limit: 500mA ~2450mA + // Boost Current Limit: 500mA ~ 2450mA bool setBoostCurrentLimit(BoostCurrentLimit milliampere) { if (milliampere > BOOST_CUR_LIMIT_2450MA) { return false; } - int val = readRegister(POWERS_SY6970_REG_0AH); + int val = readRegister(POWERS_PPM_REG_0AH); val &= 0x03; val |= milliampere; - return writeRegister(POWERS_SY6970_REG_0AH, val) != -1; + return writeRegister(POWERS_PPM_REG_0AH, val) != -1; } - uint64_t getIrqStatus(void) + uint8_t getFaultStatus(void) { - int val = readRegister(POWERS_SY6970_REG_0CH); + int val = readRegister(POWERS_PPM_REG_0CH); if (val == -1) { return 0; } __irq_mask = val; - - val = readRegister(POWERS_SY6970_REG_0BH); - if (val == -1) { - return 0; - } - __irq_mask |= ((val >> 7) & 0x1) << 8; return __irq_mask; } @@ -898,14 +897,14 @@ public: #ifdef ARDUINO //debug .. static uint8_t last_val[8] = {0}; const uint8_t regis[] = { - POWERS_SY6970_REG_0BH, - POWERS_SY6970_REG_0CH, - // POWERS_SY6970_REG_0EH, //BATTERY VOLTAGE - // POWERS_SY6970_REG_0FH, //SYSTEM VOLTAGE - // POWERS_SY6970_REG_10H, //NTC PERCENTAGE - // POWERS_SY6970_REG_11H, //VBUS VOLTAGE - POWERS_SY6970_REG_12H, - POWERS_SY6970_REG_13H + POWERS_PPM_REG_0BH, + POWERS_PPM_REG_0CH, + // POWERS_PPM_REG_0EH, //BATTERY VOLTAGE + // POWERS_PPM_REG_0FH, //SYSTEM VOLTAGE + // POWERS_PPM_REG_10H, //NTC PERCENTAGE + // POWERS_PPM_REG_11H, //VBUS VOLTAGE + POWERS_PPM_REG_12H, + POWERS_PPM_REG_13H }; Serial.println(); Serial.println("-------------------------"); @@ -954,14 +953,6 @@ public: return POWERS_SY6970_IRQ_NTC_FAULT(__irq_mask); } - // True: In VSYSMIN regulation (BATVSYSMIN) - bool isVsysLowVoltageWarning() - { - uint8_t tmp = __irq_mask >> 8; - return (bool)(tmp & 0x01); - } - bool setVinDpmThreshold(uint16_t millivolt) { if (millivolt % POWERS_SY6970_VINDPM_VOL_STEPS) { @@ -974,13 +965,11 @@ public: if (millivolt > POWERS_SY6970_VINDPM_VOL_MAX) { millivolt = POWERS_SY6970_VINDPM_VOL_MAX; } - int val = readRegister(POWERS_SY6970_REG_0DH); + int val = readRegister(POWERS_PPM_REG_0DH); val &= 0x80; val |= (((millivolt - POWERS_SY6970_VINDPM_VOL_BASE) / POWERS_SY6970_VINDPM_VOL_STEPS)); - return writeRegister(POWERS_SY6970_REG_0DH, val) != -1; + return writeRegister(POWERS_PPM_REG_0DH, val) != -1; } - - private: bool initImpl() @@ -988,7 +977,7 @@ private: __user_disable_charge = false; uint8_t rev = getChipID(); - if (rev != SY6970_DEV_REV && rev != BQ25896_DEV_REV) { + if (rev != SY6970_DEV_REV) { return false; } // Set the minimum operating voltage. Below this voltage, the PMU will protect @@ -1003,7 +992,3 @@ private: bool __user_disable_charge; uint32_t __irq_mask; }; - - - -typedef PowersSY6970 XPowersPPM; diff --git a/libdeps/XPowersLib/src/REG/BQ25896Constants.h b/libdeps/XPowersLib/src/REG/BQ25896Constants.h new file mode 100644 index 0000000..c80963f --- /dev/null +++ b/libdeps/XPowersLib/src/REG/BQ25896Constants.h @@ -0,0 +1,111 @@ +/** + * + * @license MIT License + * + * Copyright (c) 2022 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. + * + * @file BQ25896Constants.h + * @author Lewis He (lewishe@outlook.com) + * @date 2023-07-20 + * + */ +#pragma once + +// https://www.ti.com/product/BQ25896 +#define BQ25896_SLAVE_ADDRESS (0x6B) + +#define BQ25896_DEV_REV (0x02) + +#define POWERS_BQ25896_VBUS_MASK_VAL(val) (val & 0x7F) +#define POWERS_BQ25896_VBAT_MASK_VAL(val) (val & 0x7F) +#define POWERS_BQ25896_VSYS_MASK_VAL(val) (val & 0x7F) +#define POWERS_BQ25896_NTC_MASK_VAL(val) (val & 0x7F) + +#define POWERS_BQ25896_VBUS_BASE_VAL (2600) +#define POWERS_BQ25896_VBAT_BASE_VAL (2304) +#define POWERS_BQ25896_VSYS_BASE_VAL (2304) +#define POWERS_BQ25896_NTC_BASE_VAL (21) + +#define POWERS_BQ25896_VBUS_VOL_STEP (100) +#define POWERS_BQ25896_VBAT_VOL_STEP (20) +#define POWERS_BQ25896_VSYS_VOL_STEP (20) +#define POWERS_BQ25896_NTC_VOL_STEP (0.465) + +#define POWERS_BQ25896_CHG_STEP_VAL (50) +#define POWERS_BQ25896_FAST_CHG_CUR_STEP (64) +#define POWERS_BQ25896_FAST_CHG_CURRENT_MIN (0) +#define POWERS_BQ25896_FAST_CHG_CURRENT_MAX (3008) + +#define POWERS_BQ25896_PRE_CHG_CUR_BASE (64) +#define POWERS_BQ25896_PRE_CHG_CUR_STEP (64) +#define POWERS_BQ25896_PRE_CHG_CURRENT_MIN (64) +#define POWERS_BQ25896_PRE_CHG_CURRENT_MAX (1024) + +#define POWERS_BQ25896_TERM_CHG_CUR_BASE (64) +#define POWERS_BQ25896_TERM_CHG_CUR_STEP (64) +#define POWERS_BQ25896_TERM_CHG_CURRENT_MIN (64) +#define POWERS_BQ25896_TERM_CHG_CURRENT_MAX (1024) + +#define POWERS_BQ25896_CHG_VOL_BASE (3840) +#define POWERS_BQ25896_CHG_VOL_STEP (16) +#define POWERS_BQ25896_FAST_CHG_VOL_MIN (3840) +#define POWERS_BQ25896_FAST_CHG_VOL_MAX (4608) + +#define POWERS_BQ25896_SYS_VOL_STEPS (100) +#define POWERS_BQ25896_SYS_VOFF_VOL_MIN (3000) +#define POWERS_BQ25896_SYS_VOFF_VOL_MAX (3700) + +#define POWERS_BQ25896_IN_CURRENT_STEP (50) +#define POWERS_BQ25896_IN_CURRENT_MIN (100) +#define POWERS_BQ25896_IN_CURRENT_MAX (3250) + +#define POWERS_BQ25896_IN_CURRENT_OPT_STEP (50) +#define POWERS_BQ25896_IN_CURRENT_OPT_MIN (100) +#define POWERS_BQ25896_IN_CURRENT_OPT_MAX (3250) + +#define POWERS_BQ25896_IN_CURRENT_OFFSET_STEP (100) +#define POWERS_BQ25896_IN_CURRENT_OFFSET_MAX (3100) + + +#define POWERS_BQ25896_BOOTS_VOL_BASE (4550) +#define POWERS_BQ25896_BOOTS_VOL_STEP (64) +#define POWERS_BQ25896_BOOST_VOL_MIN (4550) +#define POWERS_BQ25896_BOOST_VOL_MAX (5510) + +#define POWERS_BQ25896_IRQ_WTD_FAULT(x) (bool)(( x & 0xFF ) >> 7) +#define POWERS_BQ25896_IRQ_BOOST_FAULT(x) (bool)(( x & 0xFF ) >> 6) +#define POWERS_BQ25896_IRQ_CHG_FAULT(x) (( x >> 4 ) & 0x03) +#define POWERS_BQ25896_IRQ_BAT_FAULT(x) (bool)(( x & 0xFF ) >> 3) +#define POWERS_BQ25896_IRQ_NTC_FAULT(x) (bool)(( x & 0xFF ) & 0x03) + +#define POWERS_BQ25896_VINDPM_VOL_BASE (4550) +#define POWERS_BQ25896_VINDPM_VOL_STEPS (100) +#define POWERS_BQ25896_VINDPM_VOL_MIN (3900) +#define POWERS_BQ25896_VINDPM_VOL_MAX (15300) + + + +#define POWERS_BQ25896_BAT_COMP_STEPS (20) +#define POWERS_BQ25896_BAT_COMP_MAX (140) + + +#define POWERS_BQ25896_VCLAMP_STEPS (32) +#define POWERS_BQ25896_VCLAMP_MAX (224) diff --git a/libdeps/XPowersLib/src/REG/GeneralPPMConstants.h b/libdeps/XPowersLib/src/REG/GeneralPPMConstants.h new file mode 100644 index 0000000..403834f --- /dev/null +++ b/libdeps/XPowersLib/src/REG/GeneralPPMConstants.h @@ -0,0 +1,78 @@ +/** + * + * @license MIT License + * + * Copyright (c) 2024 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. + * + * @file GeneralPPMConstants.h + * @author Lewis He (lewishe@outlook.com) + * @date 2024-10-29 + * + */ +#pragma once + +#define POWERS_PPM_REG_00H (0x00) +#define POWERS_PPM_REG_01H (0x01) +#define POWERS_PPM_REG_02H (0x02) +#define POWERS_PPM_REG_03H (0x03) +#define POWERS_PPM_REG_04H (0x04) +#define POWERS_PPM_REG_05H (0x05) +#define POWERS_PPM_REG_06H (0x06) +#define POWERS_PPM_REG_07H (0x07) +#define POWERS_PPM_REG_08H (0x08) +#define POWERS_PPM_REG_09H (0x09) +#define POWERS_PPM_REG_0AH (0x0A) +// Read only STATUS REG +#define POWERS_PPM_REG_0BH (0x0B) +// Read only CHARGE IRQ REG +#define POWERS_PPM_REG_0CH (0x0C) +// Absolute VINDPM Threshold +#define POWERS_PPM_REG_0DH (0x0D) +// Read only BATTERY VOLTAGE +#define POWERS_PPM_REG_0EH (0x0E) +// Read only SYSTEM VOLTAGE +#define POWERS_PPM_REG_0FH (0x0F) +// Read only NTC PERCENTAGE +#define POWERS_PPM_REG_10H (0x10) +// Read only VBUS VOLTAGE +#define POWERS_PPM_REG_11H (0x11) +// Read only CHARGE CURRENT +#define POWERS_PPM_REG_12H (0x12) +// Read only VINDPM/IINDPM STATUS/CURR LIMIT SETTING +#define POWERS_PPM_REG_13H (0x13) +// RESET REG +#define POWERS_PPM_REG_14H (0x14) + + + + + + + + + + + + + + + + diff --git a/libdeps/XPowersLib/src/REG/SY6970Constants.h b/libdeps/XPowersLib/src/REG/SY6970Constants.h index 98bab56..06659e4 100644 --- a/libdeps/XPowersLib/src/REG/SY6970Constants.h +++ b/libdeps/XPowersLib/src/REG/SY6970Constants.h @@ -30,45 +30,8 @@ #pragma once #define SY6970_SLAVE_ADDRESS (0x6A) -// https://www.ti.com/product/BQ25896 -#define BQ25896_SLAVE_ADDRESS (0x6B) -// https://www.sg-micro.com/cnproduct/SGM41511 -#define SGM41511_SLAVE_ADDRESS (0x6B) #define SY6970_DEV_REV (0x00) -#define BQ25896_DEV_REV (0x02) - -#define POWERS_SY6970_REG_00H (0x00) -#define POWERS_SY6970_REG_01H (0x01) -#define POWERS_SY6970_REG_02H (0x02) -#define POWERS_SY6970_REG_03H (0x03) -#define POWERS_SY6970_REG_04H (0x04) -#define POWERS_SY6970_REG_05H (0x05) -#define POWERS_SY6970_REG_06H (0x06) -#define POWERS_SY6970_REG_07H (0x07) -#define POWERS_SY6970_REG_08H (0x08) -#define POWERS_SY6970_REG_09H (0x09) -#define POWERS_SY6970_REG_0AH (0x0A) -// Read only STATUS REG -#define POWERS_SY6970_REG_0BH (0x0B) -// Read only CHARGE IRQ REG -#define POWERS_SY6970_REG_0CH (0x0C) -// Absolute VINDPM Threshold -#define POWERS_SY6970_REG_0DH (0x0D) -// Read only BATTERY VOLTAGE -#define POWERS_SY6970_REG_0EH (0x0E) -// Read only SYSTEM VOLTAGE -#define POWERS_SY6970_REG_0FH (0x0F) -// Read only NTC PERCENTAGE -#define POWERS_SY6970_REG_10H (0x10) -// Read only VBUS VOLTAGE -#define POWERS_SY6970_REG_11H (0x11) -// Read only CHARGE CURRENT -#define POWERS_SY6970_REG_12H (0x12) -// Read only VINDPM/IINDPM STATUS/CURR LIMIT SETTING -#define POWERS_SY6970_REG_13H (0x13) -// RESET REG -#define POWERS_SY6970_REG_14H (0x14) #define POWERS_SY6970_VBUS_MASK_VAL(val) (val & 0x7F) #define POWERS_SY6970_VBAT_MASK_VAL(val) (val & 0x7F) @@ -90,16 +53,15 @@ #define POWERS_SY6970_FAST_CHG_CUR_STEP (64) #define POWERS_SY6970_PRE_CHG_CUR_STEP (64) -#define POWERS_FAST_CHG_CURRENT_MIN (0) -#define POWERS_FAST_CHG_CURRENT_MAX (5056) +#define POWERS_SY6970_FAST_CHG_CURRENT_MAX (5056) -#define POWERS_PRE_CHG_CURRENT_MIN (64) -#define POWERS_PRE_CHG_CURRENT_MAX (1024) +#define POWERS_SY6970_PRE_CHG_CURRENT_MIN (64) +#define POWERS_SY6970_PRE_CHG_CURRENT_MAX (1024) #define POWERS_SY6970_CHG_VOL_BASE (3840) #define POWERS_SY6970_CHG_VOL_STEP (16) -#define POWERS_FAST_CHG_VOL_MIN (3840) -#define POWERS_FAST_CHG_VOL_MAX (4608) +#define POWERS_SY6970_FAST_CHG_VOL_MIN (3840) +#define POWERS_SY6970_FAST_CHG_VOL_MAX (4608) #define POWERS_SY6970_SYS_VOL_STEPS (100) #define POWERS_SY6970_SYS_VOFF_VOL_MIN (3000) diff --git a/libdeps/XPowersLib/src/XPowersLib.h b/libdeps/XPowersLib/src/XPowersLib.h index 94526f2..e80064c 100644 --- a/libdeps/XPowersLib/src/XPowersLib.h +++ b/libdeps/XPowersLib/src/XPowersLib.h @@ -1,15 +1,34 @@ /** + * + * @license MIT License + * + * Copyright (c) 2024 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. + * * @file XPowersLib.h * @author Lewis He (lewishe@outlook.com) - * @license MIT - * @copyright Copyright (c) 2022 - * @date 2022-05-07 + * @date 2024-10-30 * */ -#ifndef __XPOWERSLIB_H__ -#define __XPOWERSLIB_H__ - +#pragma once #if defined(XPOWERS_CHIP_AXP192) #include "XPowersAXP192.tpp" @@ -20,18 +39,17 @@ typedef XPowersAXP202 XPowersPMU; #elif defined(XPOWERS_CHIP_AXP2101) #include "XPowersAXP2101.tpp" typedef XPowersAXP2101 XPowersPMU; +#elif defined(XPOWERS_CHIP_SY6970) +#include "PowersSY6970.tpp" +typedef PowersSY6970 XPowersPPM; +#elif defined(XPOWERS_CHIP_BQ25896) +#include "PowersBQ25896.tpp" +typedef PowersBQ25896 XPowersPPM; #else #include "XPowersAXP192.tpp" #include "XPowersAXP202.tpp" #include "XPowersAXP2101.tpp" #include "PowersSY6970.tpp" -#include "PowerDeliveryHUSB238.hpp" #endif - - - - - - -#endif /*__XPOWERSLIB_H__*/ \ No newline at end of file +#include "PowerDeliveryHUSB238.hpp"