From 3670859d1620ca0fe3492cffb591bf29e5af849c Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 28 Jul 2023 13:01:18 +1000 Subject: Volume control! Reasonable default volume! Hooray! --- src/drivers/wm8523.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/drivers/wm8523.cpp (limited to 'src/drivers/wm8523.cpp') diff --git a/src/drivers/wm8523.cpp b/src/drivers/wm8523.cpp new file mode 100644 index 00000000..dbd4a88e --- /dev/null +++ b/src/drivers/wm8523.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ +#include "wm8523.hpp" + +#include + +#include "esp_err.h" + +#include "hal/i2c_types.h" +#include "i2c.hpp" + +namespace drivers { +namespace wm8523 { + +static const uint8_t kAddress = 0b0011010; + +auto ReadRegister(Register reg) -> std::optional { + uint8_t msb, lsb; + I2CTransaction transaction; + transaction.start() + .write_addr(kAddress, I2C_MASTER_WRITE) + .write_ack(static_cast(reg)) + .start() + .write_addr(kAddress, I2C_MASTER_READ) + .read(&msb, I2C_MASTER_ACK) + .read(&lsb, I2C_MASTER_LAST_NACK) + .stop(); + if (transaction.Execute() != ESP_OK) { + return {}; + } + return (msb << 8) & lsb; +} + +auto WriteRegister(Register reg, uint16_t data) -> bool { + return WriteRegister(reg, (data >> 8) & 0xFF, data & 0xFF); +} + +auto WriteRegister(Register reg, uint8_t msb, uint8_t lsb) -> bool { + I2CTransaction transaction; + transaction.start() + .write_addr(kAddress, I2C_MASTER_WRITE) + .write_ack(static_cast(reg), msb, lsb) + .stop(); + return transaction.Execute() == ESP_OK; +} + +} +} -- cgit v1.2.3