13#include "driver/spi_slave.h"
38 spi_host_device_t
host = SPI2_HOST;
39#elif defined(HSPI_HOST)
40 spi_host_device_t
host = HSPI_HOST;
41#elif defined(SPI3_HOST)
42 spi_host_device_t
host = SPI3_HOST;
43#elif defined(VSPI_HOST)
44 spi_host_device_t
host = VSPI_HOST;
46 spi_host_device_t
host = SPI2_HOST;
59 "SPIAudioSlaveConfig: sample_rate=%d, channels=%d, bits_per_sample=%d, "
60 "max_command_payload=%d, max_response_payload=%d, max_mime_len=%d ",
65 "ESP32 SPI Slave Config: use_hw_slave=%s, host=%d, dma_chan=%d, "
66 "pin_mosi=%d, pin_miso=%d, pin_sclk=%d, pin_cs=%d, queue_size=%d",
259 if (
p_buffer ==
nullptr)
return false;
270 spi_bus_config_t bus_cfg;
271 memset(&bus_cfg, 0,
sizeof(bus_cfg));
275 bus_cfg.quadwp_io_num = -1;
276 bus_cfg.quadhd_io_num = -1;
278 spi_slave_interface_config_t slave_cfg;
279 memset(&slave_cfg, 0,
sizeof(slave_cfg));
285 esp_err_t rc = spi_slave_initialize(
config.
host, &bus_cfg, &slave_cfg,
329 spi_slave_transaction_t t;
330 memset(&t, 0,
sizeof(t));
335 esp_err_t rc = spi_slave_transmit(
config.
host, &t, 0);
336 if (rc != ESP_OK)
return false;
398 return static_cast<uint8_t
>(
tx_len & 0xFF);
401 uint8_t out =
static_cast<uint8_t
>((
tx_len >> 8) & 0xFF);
424 bool processFrame(
const uint8_t* request_frame, uint16_t request_frame_len,
425 uint8_t* response_frame, uint16_t response_frame_max,
426 uint16_t* response_frame_len =
nullptr) {
427 if (request_frame ==
nullptr || request_frame_len < 3 ||
428 response_frame ==
nullptr || response_frame_max < 3) {
432 uint8_t cmd = request_frame[0];
433 uint16_t payload_len =
static_cast<uint16_t
>(request_frame[1]) |
434 (
static_cast<uint16_t
>(request_frame[2]) << 8);
435 if (
static_cast<uint32_t
>(payload_len) + 3 > request_frame_len) {
439 uint16_t out_len = 0;
442 response_frame + 3, response_frame_max - 3, out_len);
444 response_frame[0] = status;
445 response_frame[1] =
static_cast<uint8_t
>(out_len & 0xFF);
446 response_frame[2] =
static_cast<uint8_t
>((out_len >> 8) & 0xFF);
448 if (response_frame_len !=
nullptr) {
449 *response_frame_len = out_len + 3;
467 if (!
active || data ==
nullptr || len == 0)
return 0;
470 if (to_read <= 0)
return 0;
475 size_t write(
const uint8_t* data,
size_t len)
override {
476 if (!
active || data ==
nullptr || len == 0)
return 0;
479 if (to_write <= 0)
return 0;
545 uint16_t out_len = 0;
556 uint16_t payload_len, uint8_t* response,
557 uint16_t response_max, uint16_t& response_len) {
562 if (payload_len == 0 || payload ==
nullptr)
return InvalidPayload;
564 size_t n = min(
static_cast<size_t>(payload_len), max_len);
565 if (n > 0 && payload[n - 1] ==
'\0') {
568 mime.
copyFrom(
reinterpret_cast<const char*
>(payload), n, max_len);
573 if (payload_len != 6 || payload ==
nullptr)
return InvalidPayload;
583 if (payload_len == 0 || payload ==
nullptr)
return Ok;
590 if (response ==
nullptr || response_max < 4)
return InternalError;
593 writeU32LE(response,
static_cast<uint32_t
>(avail > 0 ? avail : 0));
604 if (response ==
nullptr || response_max < 4)
return InternalError;
607 writeU32LE(response,
static_cast<uint32_t
>(filled > 0 ? filled : 0));
619 out[0] =
static_cast<uint8_t
>(value & 0xFF);
620 out[1] =
static_cast<uint8_t
>((value >> 8) & 0xFF);
621 out[2] =
static_cast<uint8_t
>((value >> 16) & 0xFF);
622 out[3] =
static_cast<uint8_t
>((value >> 24) & 0xFF);
627 return static_cast<uint32_t
>(in[0]) | (
static_cast<uint32_t
>(in[1]) << 8) |
628 (
static_cast<uint32_t
>(in[2]) << 16) |
629 (
static_cast<uint32_t
>(in[3]) << 24);
#define LOGI(...)
Definition AudioLoggerIDF.h:28
SPIAudioCommand
SPI command ids used by SPIAudioMaster.
Definition SPIAudioCommand.h:19