circuitpython/ports/espressif/pmic/axp192/axp192.c

256 lines
7.6 KiB
C

#include "axp192.h"
bool pmic_common_init(busio_i2c_obj_t *i2c) {
int rc;
uint8_t write_buf[2];
// Reg: 31h
// VOFF Shutdown voltage setting ( 3.0V )
write_buf[0] = AXP192_POWER_OFF_VOLTAGE;
write_buf[1] = AXP192_POWER_OFF_VOLTAGE_3_0V;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 32h
// Enable battery monitoring
// N_OE shout down delay 2 seconds
write_buf[0] = AXP192_POWER_OFF_BATT_CHGLED_CTRL;
write_buf[1] = AXP192_POWER_OFF_BATT_CHGLED_CTRL_BATT_MONITOR_ON |
AXP192_POWER_OFF_BATT_CHGLED_CTRL_N_OE_SHUTDOWN_DELAY_2_0S;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 35h
// Enable RTC battery charge: 3.0V, 200uA
write_buf[0] = AXP192_BACKUP_BATT;
write_buf[1] = AXP192_BACKUP_BATT_CHARGING_ENABLE |
AXP192_BACKUP_BATT_CHARGING_VOLTAGE_3_0V |
AXP192_BACKUP_BATT_CHARGING_CURRENT_200uA;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 36h
// Power on: Short press 128ms
// Power off: Long press 1s
// Power OK delay 64ms
// Power off delay 4s
write_buf[0] = AXP192_PEK;
write_buf[1] = AXP192_PEK_SHORT_PRESS_128mS |
AXP192_PEK_LONG_PRESS_1_0S |
AXP192_PEK_LONG_PRESS_POWER_OFF |
AXP192_PEK_PWROK_DELAY_64mS |
AXP192_PEK_POWER_OFF_TIME_4S;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 3Ah
// APS Low battery warning level 1: 3.695V
write_buf[0] = AXP192_APS_LOW_BATT_LEVEL_1;
write_buf[1] = AXP192_APS_LOW_BATT_VOLTAGE_3_695V;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 3Bh
// APS Low battery warning level 2: 3.600V
write_buf[0] = AXP192_APS_LOW_BATT_LEVEL_2;
write_buf[1] = AXP192_APS_LOW_BATT_VOLTAGE_3_600V;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 82h
// ADC all on
write_buf[0] = AXP192_ADC_ENABLE_1;
write_buf[1] = AXP192_ADC_ENABLE_1_BATT_VOL |
AXP192_ADC_ENABLE_1_BATT_CUR |
AXP192_ADC_ENABLE_1_ACIN_VOL |
AXP192_ADC_ENABLE_1_ACIN_CUR |
AXP192_ADC_ENABLE_1_VBUS_VOL |
AXP192_ADC_ENABLE_1_VBUS_CUR |
AXP192_ADC_ENABLE_1_APS_VOL |
AXP192_ADC_ENABLE_1_TS_PIN;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 83h
// ADC temperature on
write_buf[0] = AXP192_ADC_ENABLE_2;
write_buf[1] = AXP192_ADC_ENABLE_2_TEMP_MON;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 84h
// ADC 25Hz
write_buf[0] = AXP192_ADC_TS;
write_buf[1] = AXP192_ADC_TS_SAMPLE_25HZ |
AXP192_ADC_TS_OUT_CUR_80uA |
AXP192_ADC_TS_PIN_TEMP_MON |
AXP192_ADC_TS_PIN_OUT_SAVE_ENG;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
return true;
}
bool pmic_disable_all_irq(busio_i2c_obj_t *i2c) {
int rc;
uint8_t write_buf[2];
// Reg: 40h
// IRQ enable control register 1
write_buf[0] = AXP192_IRQ_1_ENABLE;
write_buf[1] = AXP192_IRQ_X_DISABLE_ALL;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 41h
// IRQ enable control register 2
write_buf[0] = AXP192_IRQ_2_ENABLE;
write_buf[1] = AXP192_IRQ_X_DISABLE_ALL;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 42h
// IRQ enable control register 3
// Enable power on key short and long press interrupt
write_buf[0] = AXP192_IRQ_3_ENABLE;
write_buf[1] = AXP192_IRQ_X_DISABLE_ALL;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 43h
// IRQ enable control register 4
// Enable power on key short and long press interrupt
write_buf[0] = AXP192_IRQ_4_ENABLE;
write_buf[1] = AXP192_IRQ_X_DISABLE_ALL;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 4Ah
// IRQ enable control register 5
write_buf[0] = AXP192_IRQ_5_ENABLE;
write_buf[1] = AXP192_IRQ_X_DISABLE_ALL;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
return true;
}
bool pmic_clear_all_irq(busio_i2c_obj_t *i2c) {
int rc;
uint8_t write_buf[2];
// Reg: 44h
// IRQ enable control register 1
write_buf[0] = AXP192_IRQ_1_STATUS;
write_buf[1] = AXP192_IRQ_X_CLEAR_STATUS;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 45h
// IRQ enable control register 2
write_buf[0] = AXP192_IRQ_2_STATUS;
write_buf[1] = AXP192_IRQ_X_CLEAR_STATUS;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 46h
// IRQ enable control register 3
write_buf[0] = AXP192_IRQ_3_STATUS;
write_buf[1] = AXP192_IRQ_X_CLEAR_STATUS;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 47h
// IRQ enable control register 4
write_buf[0] = AXP192_IRQ_4_STATUS;
write_buf[1] = AXP192_IRQ_X_CLEAR_STATUS;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
// Reg: 4Ah
// IRQ enable control register 5
write_buf[0] = AXP192_IRQ_5_STATUS;
write_buf[1] = AXP192_IRQ_X_CLEAR_STATUS;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
return true;
}
bool pmic_enable_power_key_press_irq(busio_i2c_obj_t *i2c) {
int rc;
uint8_t read_buf[1];
uint8_t write_buf[2];
// Reg: 42h
// IRQ enable control register 3
// Enable power on key short and long press interrupt
write_buf[0] = AXP192_IRQ_2_ENABLE;
rc = common_hal_busio_i2c_write_read(i2c, AXP192_I2C_ADDRESS, write_buf, 1, read_buf, sizeof(read_buf));
if (rc != 0) {
return false;
}
write_buf[1] = read_buf[0] | AXP192_IRQ_3_PEK_SHORT_PRESS | AXP192_IRQ_3_PEK_LONG_PRESS;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
return true;
}
bool pmic_enable_low_battery_irq(busio_i2c_obj_t *i2c) {
int rc;
uint8_t write_buf[2];
// Reg: 43h
// IRQ enable control register 4
// Enable power on key short and long press interrupt
write_buf[0] = AXP192_IRQ_2_ENABLE;
write_buf[1] = AXP192_IRQ_4_LOW_VOLTAGE_WARNING;
rc = common_hal_busio_i2c_write(i2c, AXP192_I2C_ADDRESS, write_buf, sizeof(write_buf));
if (rc != 0) {
return false;
}
return true;
}