From e1c1e52d640bfff5d25de7b237df13ab978fa8b7 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 23 Apr 2022 09:28:16 +0200 Subject: [PATCH] AXP192 driver for M5Stack Tough --- .../berry/drivers/i2c_axp192_M5StackTough.be | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 tasmota/berry/drivers/i2c_axp192_M5StackTough.be diff --git a/tasmota/berry/drivers/i2c_axp192_M5StackTough.be b/tasmota/berry/drivers/i2c_axp192_M5StackTough.be new file mode 100644 index 000000000..cace43a89 --- /dev/null +++ b/tasmota/berry/drivers/i2c_axp192_M5StackTough.be @@ -0,0 +1,151 @@ +#------------------------------------------------------------- + - Specialized driver for AXP192 of M5Stack Tough + -------------------------------------------------------------# +class AXP192_M5Stack_Tough : AXP192 + def init() + super(self).init() + + if self.wire + self.touch_reset(false) + + # Disable vbus hold limit + self.write8(0x30, self.read8(0x30) & 0x04 | 0x02) + + # AXP192 GPIO1:OD OUTPUT + self.write8(0x92, self.read8(0x92) & 0xF8) + + # AXP192 GPIO2:OD OUTPUT + self.write8(0x93, self.read8(0x93) & 0xF8) + + # AXP192 RTC CHG rtc battery charging enabled + self.write8(0x35, self.read8(0x35) & 0x1C | 0xA2) + + # esp32 power voltage was set to 3.35v + self.set_esp_voltage(3350) + + # lcd backlight voltage was set to 2.80v + self.set_lcd_voltage(2800) + + # lcd logic and sdcard voltage preset to 3.3v + self.set_ldo_voltage(2, 3300) + + # LCD backlight + self.set_ldo_voltage(3, 3000) + + # turn on logic and sdcard + self.set_ldo_enable(2, true) + + # turn on lcd backlight + self.set_ldo_enable(3, true) + + self.touch_reset(true) + + # set charging current to 100mA + self.set_chg_current(0) # 0 = 100mA + + # AXP192 GPIO4 - TBC what this does really? + self.write8(0x95, self.read8(0X95) & 0x72 | 0x84) + + # Button parameter setting + # Current: + # Boot time = 512ms + # Long key press time setting = 1s + # Automatic shutdown function setting when the key duration is longer than the shutdown duration = turn on + # PWROK signal delay after power on = 64ms + # Shutdown duration setting = 4s + self.write8(0x34, 0x4C) + + # parameter buttons + # Start time: 512ms + # Long press: 1s + # Set the automatic shutdown function when the key-press duration is longer than the shutdown duration: True + # PWROK signal delay after power on: 64ms + # Shutdown time setting: 4s + self.write8(0x36, 0x4C) + + # ADC all-on + # Bit 7: Battery voltage ADC enable + # Bit 6: Battery current ADC enable + # Bit 5: ACIN voltage ADC enable + # Bit 4: ACIN current ADC enable + # Bit 3: VBUS voltage ADC enable + # Bit 2: VBUS current ADC enable + # Bit 1: APS voltage ADC enable + # Bit 0: TS pin ADC function enable + self.write8(0x82, 0xFF) + + # Reset LCD Controller + self.set_lcd_reset(false) + tasmota.delay(100) # wait for 100ms + self.set_lcd_reset(true) + tasmota.delay(100) # wait for 100ms + + # Indicates whether the voltage of VBUS is higher than VHOLD when the external power supply VBUS is connected + if self.read8(0x00) & 0x08 + self.write_bit(0x30, 7, true) + # if v-bus can use, disable M-Bus 5V output to input + self.set_buf_power_mode(true) + else + self.set_buf_power_mode(false) + end + end + end + + # set ESP voltage on DCDC1 + def set_esp_voltage(voltage) + if voltage >= 3000 && voltage <= 3400 + self.set_dc_voltage(0, voltage) + end + end + + # set LCD backlight voltage on DCDC3 + def set_lcd_voltage(voltage) + if voltage < 2500 voltage = 2500 end + if voltage > 3300 voltage = 3300 end + self.set_dc_voltage(2, voltage) + end + + # LCD Controller Reset pin + def set_lcd_reset(state) + self.write_gpio(4, state) + end + + # Speaker enable + def set_speaker_enable(state) + self.write_gpio(2, state) + end + + # Bus Power Mode + def set_buf_power_mode(state) + if (state) + self.write8(0x12, self.read8(0x12) & 0xBF) # set EXTEN to disable 5v boost + self.write8(0x90, self.read8(0x90) & 0xF8 | 0x01) # set GPIO0 to float, using enternal pulldown resistor to enable supply from BUS_5VS + else + self.write8(0x91, self.read8(0x91) & 0x0F | 0xF0) + self.write8(0x90, self.read8(0x90) & 0xF8 | 0x02) # set GPIO0 to LDO OUTPUT , pullup N_VBUSEN to disable supply from BUS_5V + self.write8(0x12, self.read8(0x12) | 0x40) # set EXTEN to enable 5v boost + end + end + + # Dimmer in percentage + def set_displaydimmer(x) + var v = tasmota.scale_uint(x, 0, 100, 2500, 3300) + self.set_ldo_voltage(3, v) + end + + # respond to display events + def display(cmd, idx, payload, raw) + if cmd == "dim" || cmd == "power" + self.set_displaydimmer(idx) + end + end + + # Touch Panel reset pin + def touch_reset(state) + self.write_gpio(1, state) + end + +end + +axp = AXP192_M5Stack_Tough() +tasmota.add_driver(axp)