fix: correct SPI bus transaction length handling in LED strip driver
This commit is contained in:
@ -7,6 +7,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/cdefs.h>
|
||||
#include "esp_err.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_check.h"
|
||||
#include "esp_private/spi_common_internal.h"
|
||||
@ -96,11 +97,12 @@ static esp_err_t led_strip_spi_refresh(led_strip_t *strip)
|
||||
spi_transaction_t tx_conf;
|
||||
memset(&tx_conf, 0, sizeof(tx_conf));
|
||||
|
||||
spi_bus_attr_t *bus_attr = spi_bus_get_attr(spi_strip->spi_host);
|
||||
ESP_RETURN_ON_FALSE(bus_attr, ESP_ERR_INVALID_STATE, TAG, "SPI bus not initialized");
|
||||
esp_err_t err = ESP_OK;
|
||||
size_t max_transfer_sz = 0;
|
||||
err = spi_bus_get_max_transaction_len(spi_strip->spi_host, &max_transfer_sz);
|
||||
ESP_RETURN_ON_FALSE(err, ESP_ERR_INVALID_STATE, TAG, "SPI bus not initialized");
|
||||
|
||||
size_t acc = 0;
|
||||
const size_t max_transfer_sz = bus_attr->max_transfer_sz;
|
||||
const size_t chunk_size = max_transfer_sz - 1;
|
||||
const size_t total_bytes = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE;
|
||||
|
||||
@ -195,7 +197,7 @@ esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const l
|
||||
.sclk_io_num = -1,
|
||||
.quadwp_io_num = -1,
|
||||
.quadhd_io_num = -1,
|
||||
.max_transfer_sz = led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE,
|
||||
.max_transfer_sz = (led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE) + 1,
|
||||
.flags = SPICOMMON_BUSFLAG_MOSI,
|
||||
};
|
||||
ESP_GOTO_ON_ERROR(spi_bus_initialize(spi_strip->spi_host, &spi_bus_cfg, spi_config->flags.with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED), err, TAG, "create SPI bus failed");
|
||||
|
||||
Reference in New Issue
Block a user