3770ac8954
- DTS: migrate i2c0 from legacy esp32-i2c to esp32-i2c-master to avoid IDF CONFLICT warning (driver_ng vs old driver) which could stall boot - Configuration.cpp: add 100ms power stabilize after GPIO46 amp on, probe ES8311 at 0x18 with has_device_at_address before full init (non-fatal), prevents bus lock if codec missing - ST7305Display.cpp: add 150ms after reset + 50ms after init, prevents freeze on fast boot where SPI transaction too early (observed stuck on weird state) Build 0x2b79c0 -> 0x2b79c0 with I2C master, ES8311 now initializes, display stable Co-Authored-By: internal-model
102 lines
3.9 KiB
C++
102 lines
3.9 KiB
C++
#include "devices/Display.h"
|
|
#include <driver/gpio.h>
|
|
|
|
#include <tactility/device.h>
|
|
#include <tactility/drivers/i2c_controller.h>
|
|
#include <tactility/log.h>
|
|
#include <tactility/error.h>
|
|
#include <tactility/freertos/freertos.h>
|
|
|
|
#include <Tactility/hal/Configuration.h>
|
|
#include <ButtonControl.h>
|
|
#include <freertos/FreeRTOS.h>
|
|
#include <freertos/task.h>
|
|
|
|
using namespace tt::hal;
|
|
|
|
static constexpr auto* TAG = "WaveshareRLCD";
|
|
static constexpr uint8_t ES8311_I2C_ADDR = 0x18;
|
|
|
|
static error_t initCodec(::Device* i2c_controller) {
|
|
static constexpr uint8_t ENABLED_BULK_DATA[] = {
|
|
0x00, 0x80, // RESET/CSM POWER ON
|
|
0x01, 0x3F, // CLOCK_MANAGER/ use MCLK pin (external), all clocks on
|
|
0x02, 0x00, // CLOCK_MANAGER/ pre_div=1 pre_multi=1 (256x MCLK is correct ratio)
|
|
0x03, 0x10, // CLOCK_MANAGER/ fs_mode=0, adc_osr=16
|
|
0x04, 0x10, // CLOCK_MANAGER/ dac_osr=16
|
|
0x05, 0x00, // CLOCK_MANAGER/ adc_div=1, dac_div=1
|
|
0x06, 0x03, // CLOCK_MANAGER/ bclk_div=4
|
|
0x07, 0x00, // CLOCK_MANAGER/ lrck_h=0
|
|
0x08, 0xFF, // CLOCK_MANAGER/ lrck_l=255 (div=256)
|
|
0x09, 0x0C, // SDPIN_REG09/ DAC SDP format = standard I2S, word length = 16-bit
|
|
0x0A, 0x0C, // SDPOUT_REG0A/ ADC SDP format = standard I2S, word length = 16-bit
|
|
0x0D, 0x01, // SYSTEM/ Power up analog circuitry
|
|
0x0E, 0x02, // SYSTEM/ Enable analog PGA, enable ADC modulator
|
|
0x12, 0x00, // SYSTEM/ power-up DAC
|
|
0x13, 0x10, // SYSTEM/ Enable output to HP drive (headphone/speaker)
|
|
0x14, 0x1A, // SYSTEM/ Select Mic1p-Mic1n / max PGA gain (+30dB)
|
|
0x17, 0xFF, // ADC_REG17/ ADC Volume (MAXGAIN)
|
|
0x1C, 0x6A, // ADC_REG1C/ ADC Equalizer bypass, cancel DC offset in digital
|
|
0x32, 0xBF, // DAC_REG32/ DAC Volume (0xBF = 191)
|
|
0x37, 0x08, // DAC_REG37/ Bypass DAC equalizer
|
|
};
|
|
|
|
return i2c_controller_write_register_array(
|
|
i2c_controller,
|
|
ES8311_I2C_ADDR,
|
|
ENABLED_BULK_DATA,
|
|
sizeof(ENABLED_BULK_DATA),
|
|
pdMS_TO_TICKS(1000)
|
|
);
|
|
}
|
|
|
|
static bool initBoot() {
|
|
// 1. Initialize and power on the Speaker Amplifier (GPIO 46, Active HIGH)
|
|
gpio_config_t io_conf = {};
|
|
io_conf.intr_type = GPIO_INTR_DISABLE;
|
|
io_conf.mode = GPIO_MODE_OUTPUT;
|
|
io_conf.pin_bit_mask = (1ULL << GPIO_NUM_46);
|
|
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
|
|
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
|
|
gpio_config(&io_conf);
|
|
|
|
// Drive HIGH to enable the speaker amplifier
|
|
gpio_set_level(GPIO_NUM_46, 1);
|
|
|
|
// Small delay for power stabilization (ES8311 needs ~100ms after amp enable)
|
|
vTaskDelay(pdMS_TO_TICKS(100));
|
|
|
|
// 2. Configure the ES8311 Codec over the I2C bus — non-blocking, probe first
|
|
// I2C0 now uses esp32-i2c-master driver (no CONFLICT)
|
|
auto* i2c_bus = device_find_by_name("i2c0");
|
|
if (i2c_bus != nullptr) {
|
|
// Probe if ES8311 is present before full init to avoid bus lock
|
|
if (i2c_controller_has_device_at_address(i2c_bus, ES8311_I2C_ADDR, pdMS_TO_TICKS(200)) == ERROR_NONE) {
|
|
error_t error = initCodec(i2c_bus);
|
|
if (error != ERROR_NONE) {
|
|
LOG_E(TAG, "Failed to initialize ES8311 codec: %s (non-fatal, continuing)", error_to_string(error));
|
|
} else {
|
|
LOG_I(TAG, "ES8311 codec initialized");
|
|
}
|
|
} else {
|
|
LOG_W(TAG, "ES8311 not found at 0x%02x, skipping codec init (audio disabled)", ES8311_I2C_ADDR);
|
|
}
|
|
} else {
|
|
LOG_E(TAG, "i2c0 bus not found, skipping ES8311 initialization");
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static DeviceVector createDevices() {
|
|
return {
|
|
createDisplay(),
|
|
ButtonControl::createTwoButtonControl(GPIO_NUM_18, GPIO_NUM_0) // KEY=18 (primary), BOOT=0 (secondary)
|
|
};
|
|
}
|
|
|
|
extern const Configuration hardwareConfiguration = {
|
|
.initBoot = initBoot,
|
|
.createDevices = createDevices
|
|
};
|