122 ESP_LOGCONFIG(TAG,
"Setting up Beken SPI LED Strip...");
125 size_t dma_buffer_size = (buffer_size * 8) + (2 * 64);
129 if (this->
buf_ ==
nullptr) {
130 ESP_LOGE(TAG,
"Cannot allocate LED buffer!");
137 ESP_LOGE(TAG,
"Cannot allocate effect data!");
144 ESP_LOGE(TAG,
"Cannot allocate DMA buffer!");
149 memset(this->
buf_, 0, buffer_size);
151 memset(this->
dma_buf_, 0, dma_buffer_size);
153 uint32_t value = PCLK_POSI_SPI;
154 sddev_control(ICU_DEV_NAME, CMD_CONF_PCLK_26M, &value);
156 value = PWD_SPI_CLK_BIT;
157 sddev_control(ICU_DEV_NAME, CMD_CLK_PWR_UP, &value);
159 if (spi_data !=
nullptr) {
160 ESP_LOGE(TAG,
"SPI device already initialized!");
165 spi_data = (spi_data_t *) calloc(1,
sizeof(spi_data_t));
166 if (spi_data ==
nullptr) {
167 ESP_LOGE(TAG,
"Cannot allocate spi_data!");
172 spi_data->dma_tx_semaphore = xSemaphoreCreateBinary();
173 if (spi_data->dma_tx_semaphore ==
nullptr) {
174 ESP_LOGE(TAG,
"TX Semaphore init faild!");
179 spi_data->first_run =
true;
181 set_spi_ctrl_register(MSTEN, 0);
182 set_spi_ctrl_register(BIT_WDTH, 0);
184 set_spi_ctrl_register(CKPOL, 0);
185 set_spi_ctrl_register(CKPHA, 0);
186 set_spi_ctrl_register(MSTEN, 1);
187 set_spi_ctrl_register(SPIEN, 1);
189 set_spi_ctrl_register(TXINT_EN, 0);
190 set_spi_ctrl_register(RXINT_EN, 0);
191 set_spi_config_register(SPI_TX_FINISH_EN, 1);
192 set_spi_config_register(SPI_RX_FINISH_EN, 1);
193 set_spi_ctrl_register(RXOVR_EN, 0);
194 set_spi_ctrl_register(TXOVR_EN, 0);
196 value = REG_READ(SPI_CTRL);
197 value &= ~CTRL_NSSMD_3;
199 REG_WRITE(SPI_CTRL, value);
201 value = GFUNC_MODE_SPI_DMA;
202 sddev_control(GPIO_DEV_NAME, CMD_GPIO_ENABLE_SECOND, &value);
203 set_spi_ctrl_register(SPI_S_CS_UP_INT_EN, 0);
206 GDMACFG_TPYES_ST init_cfg;
207 memset(&init_cfg, 0,
sizeof(GDMACFG_TPYES_ST));
209 init_cfg.dstdat_width = 8;
210 init_cfg.srcdat_width = 32;
211 init_cfg.dstptr_incr = 0;
212 init_cfg.srcptr_incr = 1;
213 init_cfg.src_start_addr = this->
dma_buf_;
214 init_cfg.dst_start_addr = (
void *) SPI_DAT;
215 init_cfg.channel = SPI_TX_DMA_CHANNEL;
217 init_cfg.u.type4.src_loop_start_addr = this->
dma_buf_;
218 init_cfg.u.type4.src_loop_end_addr = this->
dma_buf_ + dma_buffer_size;
219 init_cfg.half_fin_handler =
nullptr;
221 init_cfg.src_module = GDMA_X_SRC_DTCM_RD_REQ;
222 init_cfg.dst_module = GDMA_X_DST_GSPI_TX_REQ;
223 sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_TYPE4, (
void *) &init_cfg);
224 en_cfg.channel = SPI_TX_DMA_CHANNEL;
225 en_cfg.param = dma_buffer_size;
226 sddev_control(GDMA_DEV_NAME, CMD_GDMA_SET_TRANS_LENGTH, (
void *) &en_cfg);
227 en_cfg.channel = SPI_TX_DMA_CHANNEL;
229 sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_WORK_MODE, (
void *) &en_cfg);
230 en_cfg.channel = SPI_TX_DMA_CHANNEL;
232 sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_SRCADDR_LOOP, &en_cfg);
236 value = REG_READ(SPI_CONFIG);
237 value &= ~(0xFFF << 8);
238 value |= ((dma_buffer_size & 0xFFF) << 8);
239 REG_WRITE(SPI_CONFIG, value);