axp192-dd 0.3.0

A driver for the AXP192 power management IC (uses device-driver crate)
Documentation
#![no_std]
#![no_main]

use axp192_dd::{Axp192, AxpError, ChargeCurrentValue, Gpio0FunctionSelect, LdoId};
use defmt::info;
use esp_hal::{
    Blocking,
    delay::Delay,
    i2c::master::{Config as I2cConfig, Error as I2cError, I2c},
    time::Rate,
};
use panic_rtt_target as _;
use rtt_target::rtt_init_defmt;

esp_bootloader_esp_idf::esp_app_desc!();

#[esp_hal::main]
fn main() -> ! {
    rtt_init_defmt!();
    info!("Init!");

    let p = esp_hal::init(esp_hal::Config::default());
    let config: I2cConfig = I2cConfig::default().with_frequency(Rate::from_khz(400));
    let i2c = I2c::new(p.I2C0, config)
        .unwrap()
        .with_sda(p.GPIO6)
        .with_scl(p.GPIO7);

    init_pmic(i2c).unwrap();
    let delay = Delay::new();

    loop {
        info!("Hello world!");
        delay.delay_millis(250);
    }
}

#[rustfmt::skip]
fn init_pmic(i2c: I2c<'_, Blocking>) -> Result<(), AxpError<I2cError>> {
    let mut axp = Axp192::new(i2c);
    axp.set_ldo_voltage_mv(LdoId::Ldo2, 3300)?;
    axp.ll.adc_enable_1().write(|r| {
        r.set_battery_current_adc_enable(true);
        r.set_acin_voltage_adc_enable(true);
        r.set_acin_current_adc_enable(true);
        r.set_vbus_voltage_adc_enable(true);
        r.set_vbus_current_adc_enable(true);
        r.set_aps_voltage_adc_enable(true);
    })?;
    axp.ll.charge_control_1().write(|r| r.set_charge_current(ChargeCurrentValue::Ma100))?;
    axp.set_gpio0_ldo_voltage_mv(3300)?;
    axp.ll.gpio_0_control().write(|r| {
        r.set_function_select(Gpio0FunctionSelect::LowNoiseLdoOutput);
    })?;
    axp.ll.power_output_control().modify(|r| {
        r.set_dcdc_1_output_enable(true);
        r.set_dcdc_3_output_enable(false);
        r.set_ldo_2_output_enable(true);
        r.set_ldo_3_output_enable(true);
        r.set_dcdc_2_output_enable(false);
        r.set_exten_output_enable(true);
    })?;
    axp.set_battery_charge_high_temp_threshold_mv(3226)?;
    axp.ll.backup_battery_charge_control().write(|r| {
        r.set_backup_charge_enable(true);
    })?;

    info!("Battery voltage: {} mV", axp.get_battery_voltage_mv()?);
    info!("Charge current: {} mA", axp.get_battery_charge_current_ma()?);
    Ok(())
}