ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
model_tas5805m.cpp
Go to the documentation of this file.
1#include "tas58xx.h"
2
3#include "esphome/core/hal.h"
4
5namespace esphome::tas58xx {
6
7// Remainder of the startup sequence from TI PurePath Console, run after the reset. Register 0x00 selects the page.
8// Registers 0x46, 0x7D, 0x7E and page 1 register 0x51 are not documented in the datasheet.
9static const uint8_t STARTUP_SEQUENCE[][2] PROGMEM = {
10 {0x03, 0x00}, // DEVICE_CTRL_2: deep sleep
11 {0x46, 0x01},
12 {0x03, 0x02}, // DEVICE_CTRL_2: Hi-Z
13 // The I2C address is latched at power up, after which the ADR pin can report faults
14 {0x61, 0x0B}, // ADR_PIN_CONFIG: FAULTZ
15 {0x60, 0x01}, // ADR_PIN_CTRL: output
16 {0x7D, 0x11},
17 {0x7E, 0xFF},
18 {0x00, 0x01}, // Page 1
19 {0x51, 0x05},
20 {0x00, 0x00}, // Page 0
21
22 // Additional register configuration
23 {0x53, 0x60}, // ANA_CTRL: for high audio performance use 175kHz bandwidth with Fsw=768kHz
24};
25
26static const LogString *model_name() { return LOG_STR("TAS5805M"); }
27
28// An if chain rather than a switch: a switch table would land in rodata, which is RAM on ESP8266.
29static const LogString *fault_name(uint8_t index) {
30 if (index == 0)
31 return LOG_STR("Right channel over current");
32 if (index == 1)
33 return LOG_STR("Left channel over current");
34 if (index == 2)
35 return LOG_STR("Right channel DC fault");
36 if (index == 3)
37 return LOG_STR("Left channel DC fault");
38 if (index == 8)
39 return LOG_STR("PVDD under voltage");
40 if (index == 9)
41 return LOG_STR("PVDD over voltage");
42 if (index == 10)
43 return LOG_STR("Clock fault");
44 if (index == 14)
45 return LOG_STR("BQ write failed");
46 if (index == 15)
47 return LOG_STR("OTP CRC check error");
48 if (index == 16)
49 return LOG_STR("Over temperature shutdown");
50 if (index == 26)
51 return LOG_STR("Over temperature warning");
52 return LOG_STR("Unknown fault");
53}
54
56 .name = model_name,
57 .startup_sequence = STARTUP_SEQUENCE,
58 .startup_sequence_length = sizeof(STARTUP_SEQUENCE) / sizeof(STARTUP_SEQUENCE[0]),
59 .mixer_book = 0x8C,
60 .mixer_page = 0x29,
61 .mixer_register = 0x18,
62 // The clock fault is left out of the log and have_fault: it is set whenever the I2S clock stops, which is normal
63 .fault_error_mask = 0x0001C30F,
64 .fault_warning_mask = 0x04000000,
65 // DC and over current faults keep the output off until cleared (datasheet 7.5.3.3.1, 7.5.3.3.2). They are not
66 // cleared automatically: a DC fault re-trips only after 570 ms, so a clear on every poll would pass DC to the
67 // speaker.
68 .fault_output_off_mask = 0x0000000F,
69 .fault_latched_mask = 0x0401C70F,
70 .fault_name = fault_name,
71 .fault_sensor_bits =
72 {
73 3, // FAULT_SENSOR_LEFT_CHANNEL_DC_FAULT
74 2, // FAULT_SENSOR_RIGHT_CHANNEL_DC_FAULT
75 1, // FAULT_SENSOR_LEFT_CHANNEL_OVER_CURRENT
76 0, // FAULT_SENSOR_RIGHT_CHANNEL_OVER_CURRENT
77 15, // FAULT_SENSOR_OTP_CRC_CHECK
78 14, // FAULT_SENSOR_BQ_WRITE_FAILED
79 10, // FAULT_SENSOR_CLOCK_FAULT
80 9, // FAULT_SENSOR_PVDD_OVER_VOLTAGE
81 8, // FAULT_SENSOR_PVDD_UNDER_VOLTAGE
82 16, // FAULT_SENSOR_OVER_TEMP_SHUTDOWN
83 26, // FAULT_SENSOR_OVER_TEMP_WARNING
84 NO_BIT, // FAULT_SENSOR_LOAD_EEPROM_ERROR
85 NO_BIT, // FAULT_SENSOR_RIGHT_CHANNEL_CBC_OVER_CURRENT
86 NO_BIT, // FAULT_SENSOR_LEFT_CHANNEL_CBC_OVER_CURRENT
87 NO_BIT, // FAULT_SENSOR_LEFT_CHANNEL_CBC_OVER_CURRENT_WARNING
88 NO_BIT, // FAULT_SENSOR_RIGHT_CHANNEL_CBC_OVER_CURRENT_WARNING
89 NO_BIT, // FAULT_SENSOR_OVER_TEMP_146C_WARNING
90 },
91};
92
93} // namespace esphome::tas58xx
const ModelInfo TAS5805M_MODEL
Everything that differs between models of the family.
Definition tas58xx.h:70