ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
weikai_spi.cpp
Go to the documentation of this file.
1
5
6#include "weikai_spi.h"
7
9using namespace weikai;
10static const char *const TAG = "weikai_spi";
11
16 uint32_t e = millis() - last_time;
17 last_time = millis();
18 return e;
19};
20
24const char *p2s(uart::UARTParityOptions parity) {
25 using namespace uart;
26 switch (parity) {
27 case UART_CONFIG_PARITY_NONE:
28 return "NONE";
29 case UART_CONFIG_PARITY_EVEN:
30 return "EVEN";
31 case UART_CONFIG_PARITY_ODD:
32 return "ODD";
33 default:
34 return "UNKNOWN";
35 }
36}
37
39void print_buffer(const uint8_t *data, size_t length) {
40 char hex_buffer[100];
41 hex_buffer[(3 * 32) + 1] = 0;
42 for (size_t i = 0; i < length; i++) {
43 snprintf(&hex_buffer[3 * (i % 32)], sizeof(hex_buffer), "%02X ", data[i]);
44 if (i % 32 == 31) {
45 ESP_LOGVV(TAG, " %s", hex_buffer);
46 }
47 }
48 if (length % 32) {
49 // null terminate if incomplete line
50 hex_buffer[3 * (length % 32) + 2] = 0;
51 ESP_LOGVV(TAG, " %s", hex_buffer);
52 }
53}
54
55static const char *const REG_TO_STR_P0[16] = {"GENA", "GRST", "GMUT", "SPAGE", "SCR", "LCR", "FCR", "SIER",
56 "SIFR", "TFCNT", "RFCNT", "FSR", "LSR", "FDAT", "FWCR", "RS485"};
57static const char *const REG_TO_STR_P1[16] = {"GENA", "GRST", "GMUT", "SPAGE", "BAUD1", "BAUD0", "PRES", "RFTL",
58 "TFTL", "FWTH", "FWTL", "XON1", "XOFF1", "SADR", "SAEN", "RTSDLY"};
59
60// method to print a register value as text: used in the log messages ...
61const char *reg_to_str(int reg, bool page1) {
62 if (reg == WKREG_GPDAT) {
63 return "GPDAT";
64 } else if (reg == WKREG_GPDIR) {
65 return "GPDIR";
66 } else {
67 return page1 ? REG_TO_STR_P1[reg & 0x0F] : REG_TO_STR_P0[reg & 0x0F];
68 }
69}
70
71enum RegType { REG = 0, FIFO = 1 };
72enum CmdType { WRITE_CMD = 0, READ_CMD = 1 };
73
88inline static uint8_t cmd_byte(RegType fifo, CmdType transfer_type, uint8_t channel, uint8_t reg) {
89 return (fifo << 7 | transfer_type << 6 | channel << 4 | reg << 0);
90}
91
93// The WeikaiRegisterSPI methods
96 auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
97 uint8_t cmd = cmd_byte(REG, READ_CMD, this->channel_, this->register_);
98 spi_comp->enable();
99 spi_comp->write_byte(cmd);
100 uint8_t val = spi_comp->read_byte();
101 spi_comp->disable();
102 char bin_buf[9];
103 ESP_LOGVV(TAG, "WeikaiRegisterSPI::read_reg() cmd=%s(%02X) reg=%s ch=%d buf=%02X", format_bin_to(bin_buf, cmd), cmd,
104 reg_to_str(this->register_, this->comp_->page1()), this->channel_, val);
105 return val;
106}
107
108void WeikaiRegisterSPI::read_fifo(uint8_t *data, size_t length) const {
109 auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
110 uint8_t cmd = cmd_byte(FIFO, READ_CMD, this->channel_, this->register_);
111 spi_comp->enable();
112 spi_comp->write_byte(cmd);
113 spi_comp->read_array(data, length);
114 spi_comp->disable();
115#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
116 char bin_buf[9];
117 ESP_LOGVV(TAG, "WeikaiRegisterSPI::read_fifo() cmd=%s(%02X) ch=%d len=%d buffer", format_bin_to(bin_buf, cmd), cmd,
118 this->channel_, length);
119 print_buffer(data, length);
120#endif
121}
122
123void WeikaiRegisterSPI::write_reg(uint8_t value) {
124 auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
125 uint8_t buf[2]{cmd_byte(REG, WRITE_CMD, this->channel_, this->register_), value};
126 spi_comp->enable();
127 spi_comp->write_array(buf, 2);
128 spi_comp->disable();
129 char bin_buf[9];
130 ESP_LOGVV(TAG, "WeikaiRegisterSPI::write_reg() cmd=%s(%02X) reg=%s ch=%d buf=%02X", format_bin_to(bin_buf, buf[0]),
131 buf[0], reg_to_str(this->register_, this->comp_->page1()), this->channel_, buf[1]);
132}
133
134void WeikaiRegisterSPI::write_fifo(uint8_t *data, size_t length) {
135 auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
136 uint8_t cmd = cmd_byte(FIFO, WRITE_CMD, this->channel_, this->register_);
137 spi_comp->enable();
138 spi_comp->write_byte(cmd);
139 spi_comp->write_array(data, length);
140 spi_comp->disable();
141
142#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
143 char bin_buf[9];
144 ESP_LOGVV(TAG, "WeikaiRegisterSPI::write_fifo() cmd=%s(%02X) ch=%d len=%d buffer", format_bin_to(bin_buf, cmd), cmd,
145 this->channel_, length);
146 print_buffer(data, length);
147#endif
148}
149
151// The WeikaiComponentSPI methods
154 using namespace weikai;
155 ESP_LOGCONFIG(TAG, "Setup %s (%d UARTs)", this->get_name(), this->children_.size());
156 this->spi_setup();
157 // enable all channels
159 // reset all channels
161 // initialize the spage register to page 0
162 this->reg(WKREG_SPAGE, 0) = 0;
163 this->page1_ = false;
164
165 // we setup our children channels
166 for (auto *child : this->children_) {
167 child->setup_channel();
168 }
169}
170
172 ESP_LOGCONFIG(TAG,
173 "Initialization of %s with %d UARTs completed\n"
174 " Crystal: %" PRIu32,
175 this->get_name(), this->children_.size(), this->crystal_);
176 if (test_mode_) {
177 ESP_LOGCONFIG(TAG,
178 " Test mode: %d\n"
179 " Transfer buffer size: %d",
181 }
182 LOG_PIN(" CS Pin: ", this->cs_);
183
184 for (auto *child : this->children_) {
185 child->dump_channel();
186 }
187}
188
189} // namespace esphome::weikai_spi
int test_mode_
test mode value (0 -> no tests)
Definition weikai.h:260
bool page1_
set to true when in "page1 mode"
Definition weikai.h:261
std::vector< WeikaiChannel * > children_
the list of WeikaiChannel UART children
Definition weikai.h:262
const char * get_name()
Get the name of the component.
Definition weikai.h:214
uint8_t register_
address of the register
Definition weikai.h:184
uint8_t channel_
channel for this register
Definition weikai.h:185
WeikaiComponent *const comp_
pointer to our parent (aggregation)
Definition weikai.h:183
The WeikaiComponentSPI class stores the information to the WeiKai component connected through an SPI ...
Definition weikai_spi.h:36
weikai::WeikaiRegister & reg(uint8_t reg, uint8_t channel) override
Definition weikai_spi.h:38
void write_reg(uint8_t value) override
uint8_t read_reg() const override
void write_fifo(uint8_t *data, size_t length) override
void read_fifo(uint8_t *data, size_t length) const override
constexpr uint8_t WKREG_SPAGE
Global Page register c0/c1 0011.
Definition wk_reg_def.h:126
constexpr uint8_t GRST_C4RST
Channel 4 soft reset (0: not reset, 1: reset)
Definition wk_reg_def.h:55
constexpr uint8_t WKREG_GPDIR
Global GPIO direction register - 10 0001.
Definition wk_reg_def.h:84
constexpr uint8_t WKREG_GPDAT
Global GPIO data register - 11 0001.
Definition wk_reg_def.h:98
constexpr uint8_t GRST_C2RST
Channel 2 soft reset (0: not reset, 1: reset)
Definition wk_reg_def.h:59
constexpr uint8_t WKREG_GRST
Global Reset Register - 00 0001.
Definition wk_reg_def.h:53
constexpr uint8_t GRST_C3RST
Channel 3 soft reset (0: not reset, 1: reset)
Definition wk_reg_def.h:57
constexpr uint8_t GENA_C2EN
Channel 2 enable clock (0: disable, 1: enable)
Definition wk_reg_def.h:37
constexpr uint8_t GRST_C1RST
Channel 1 soft reset (0: not reset, 1: reset)
Definition wk_reg_def.h:61
constexpr uint8_t GENA_C3EN
Channel 3 enable clock (0: disable, 1: enable)
Definition wk_reg_def.h:35
constexpr uint8_t GENA_C4EN
Channel 4 enable clock (0: disable, 1: enable)
Definition wk_reg_def.h:33
constexpr uint8_t WKREG_GENA
Global Control Register - 00 0000.
Definition wk_reg_def.h:31
constexpr uint8_t GENA_C1EN
Channel 1 enable clock (0: disable, 1: enable)
Definition wk_reg_def.h:39
mopeka_std_values val[3]
constexpr size_t XFER_MAX_SIZE
XFER_MAX_SIZE defines the maximum number of bytes allowed during one transfer.
Definition weikai.h:32
const char * reg_to_str(int reg, bool page1)
Definition weikai.cpp:62
const char * p2s(uart::UARTParityOptions parity)
Converts the parity enum value to a C string.
Definition weikai.cpp:25
void print_buffer(const uint8_t *data, size_t length)
Display a buffer in hexadecimal format (32 hex values / line) for debug.
Definition weikai.cpp:40
uint32_t elapsed_ms(uint32_t &last_time)
measure the time elapsed between two calls
Definition weikai.cpp:16
uint32_t IRAM_ATTR HOT millis()
Definition hal.cpp:28
char * format_bin_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length)
Format byte array as binary string to buffer.
Definition helpers.cpp:377
static void uint32_t
uint16_t length
Definition tt21100.cpp:0