summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-01-04 15:57:58 +1100
committerjacqueline <me@jacqueline.id.au>2024-01-04 15:57:58 +1100
commit938ba62f57ed2c002bae4aec236eeaeb200e4cba (patch)
treed70948199d1f7a2572df5f2940ee13eb79537937 /src/drivers
parent42a98a3799bdfb328c5b5683bbf3d77046f1f5f8 (diff)
downloadtangara-fw-938ba62f57ed2c002bae4aec236eeaeb200e4cba.tar.gz
refactor handling of volume steps; improve controls
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/i2s_dac.cpp4
-rw-r--r--src/drivers/include/wm8523.hpp2
-rw-r--r--src/drivers/wm8523.cpp2
3 files changed, 6 insertions, 2 deletions
diff --git a/src/drivers/i2s_dac.cpp b/src/drivers/i2s_dac.cpp
index 0ef1005a..4d29f917 100644
--- a/src/drivers/i2s_dac.cpp
+++ b/src/drivers/i2s_dac.cpp
@@ -95,8 +95,8 @@ I2SDac::I2SDac(IGpios& gpio, i2s_chan_handle_t i2s_handle)
vTaskDelay(pdMS_TO_TICKS(10));
wm8523::WriteRegister(wm8523::Register::kPsCtrl, 0b0);
- // Ramp volume changes
- wm8523::WriteRegister(wm8523::Register::kDacCtrl, 0b11);
+ // Use zero-cross detection for volume changes.
+ wm8523::WriteRegister(wm8523::Register::kDacCtrl, 0b10000);
}
I2SDac::~I2SDac() {
diff --git a/src/drivers/include/wm8523.hpp b/src/drivers/include/wm8523.hpp
index b13cf34b..a64f6bac 100644
--- a/src/drivers/include/wm8523.hpp
+++ b/src/drivers/include/wm8523.hpp
@@ -23,6 +23,8 @@ extern const uint16_t kLineLevelReferenceVolume;
extern const uint16_t kDefaultVolume;
extern const uint16_t kDefaultMaxVolume;
+extern const uint16_t kZeroDbVolume;
+
constexpr auto VolumeToDb(uint16_t vol) -> int_fast8_t {
return (vol - kLineLevelReferenceVolume) / 4;
}
diff --git a/src/drivers/wm8523.cpp b/src/drivers/wm8523.cpp
index 5f6c8053..9fe3e001 100644
--- a/src/drivers/wm8523.cpp
+++ b/src/drivers/wm8523.cpp
@@ -32,6 +32,8 @@ const uint16_t kDefaultVolume = kLineLevelReferenceVolume - 96;
// Default to +6dB == 2Vrms == 'CD Player'
const uint16_t kDefaultMaxVolume = kLineLevelReferenceVolume + 12;
+const uint16_t kZeroDbVolume = 0x190;
+
static const uint8_t kAddress = 0b0011010;
auto ReadRegister(Register reg) -> std::optional<uint16_t> {