summaryrefslogtreecommitdiff
path: root/src/drivers/wm8523.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-07-28 13:01:18 +1000
committerjacqueline <me@jacqueline.id.au>2023-07-28 13:01:18 +1000
commit3670859d1620ca0fe3492cffb591bf29e5af849c (patch)
tree51efdf3f8c5fa9ff86dabbdddb8c64416b8703bb /src/drivers/wm8523.cpp
parent72fe82ebc43b1e7bf10ebe72efec1723b3792afd (diff)
downloadtangara-fw-3670859d1620ca0fe3492cffb591bf29e5af849c.tar.gz
Volume control! Reasonable default volume! Hooray!
Diffstat (limited to 'src/drivers/wm8523.cpp')
-rw-r--r--src/drivers/wm8523.cpp51
1 files changed, 51 insertions, 0 deletions
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 <me@jacqueline.id.au>
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+#include "wm8523.hpp"
+
+#include <cstdint>
+
+#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<uint16_t> {
+ uint8_t msb, lsb;
+ I2CTransaction transaction;
+ transaction.start()
+ .write_addr(kAddress, I2C_MASTER_WRITE)
+ .write_ack(static_cast<uint8_t>(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<uint8_t>(reg), msb, lsb)
+ .stop();
+ return transaction.Execute() == ESP_OK;
+}
+
+}
+}