diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-07-28 13:01:18 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-07-28 13:01:18 +1000 |
| commit | 3670859d1620ca0fe3492cffb591bf29e5af849c (patch) | |
| tree | 51efdf3f8c5fa9ff86dabbdddb8c64416b8703bb /src/drivers/wm8523.cpp | |
| parent | 72fe82ebc43b1e7bf10ebe72efec1723b3792afd (diff) | |
| download | tangara-fw-3670859d1620ca0fe3492cffb591bf29e5af849c.tar.gz | |
Volume control! Reasonable default volume! Hooray!
Diffstat (limited to 'src/drivers/wm8523.cpp')
| -rw-r--r-- | src/drivers/wm8523.cpp | 51 |
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; +} + +} +} |
