diff options
| author | cooljqln <cooljqln@noreply.codeberg.org> | 2025-08-15 05:03:17 +0200 |
|---|---|---|
| committer | cooljqln <cooljqln@noreply.codeberg.org> | 2025-08-15 05:03:17 +0200 |
| commit | 28a368ebe07e22fbf071ce882effe9088516a8c6 (patch) | |
| tree | d13241937786b3d422423cc2b804e0ec42b21335 /src/drivers/wm8523.cpp | |
| parent | 2b2e595a8fb28e34ec33a98035c31bd4cba76808 (diff) | |
| parent | 73baf2f88f61e307afd6cd17f6727da4e446b64c (diff) | |
| download | tangara-fw-28a368ebe07e22fbf071ce882effe9088516a8c6.tar.gz | |
Merge pull request 'Migrate to the new esp-idf I2C driver' (#424) from jqln/i2c-driver-upgrade into main
Reviewed-on: https://codeberg.org/cool-tech-zone/tangara-fw/pulls/424
Diffstat (limited to 'src/drivers/wm8523.cpp')
| -rw-r--r-- | src/drivers/wm8523.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/src/drivers/wm8523.cpp b/src/drivers/wm8523.cpp index 177679f1..428dcd87 100644 --- a/src/drivers/wm8523.cpp +++ b/src/drivers/wm8523.cpp @@ -4,9 +4,12 @@ * SPDX-License-Identifier: GPL-3.0-only */ #include "drivers/wm8523.hpp" +#include <stdint.h> #include <cstdint> +#include "driver/i2c_master.h" +#include "driver/i2c_types.h" #include "esp_err.h" #include "drivers/i2c.hpp" @@ -35,22 +38,26 @@ const uint16_t kDefaultMaxVolume = kLineLevelReferenceVolume + 12; const uint16_t kZeroDbVolume = 0x190; static const uint8_t kAddress = 0b0011010; +static i2c_master_dev_handle_t sI2C; + +auto Init() -> esp_err_t { + i2c_device_config_t config = { + .dev_addr_length = I2C_ADDR_BIT_LEN_7, + .device_address = kAddress, + .scl_speed_hz = 400'000, + .scl_wait_us = 0, + .flags = {.disable_ack_check = false}, + }; + return i2c_master_bus_add_device(i2c_handle(), &config, &sI2C); +} 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) { + uint8_t cmd[] = {static_cast<uint8_t>(reg)}; + uint8_t data[] = {0, 0}; + if (i2c_master_transmit_receive(sI2C, cmd, 1, data, 2, 100) != ESP_OK) { return {}; } - return (msb << 8) | lsb; + return (data[0] << 8) | data[1]; } auto WriteRegister(Register reg, uint16_t data) -> bool { @@ -58,12 +65,8 @@ auto WriteRegister(Register reg, uint16_t data) -> bool { } 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; + uint8_t cmd[] = {static_cast<uint8_t>(reg), msb, lsb}; + return i2c_master_transmit(sI2C, cmd, 3, 100) == ESP_OK; } } // namespace wm8523 |
