156 size_t dma_buffer_size = (buffer_size * 8) + (2 * 64);
160 if (this->
buf_ ==
nullptr) {
161 ESP_LOGE(TAG,
"Cannot allocate LED buffer!");
168 ESP_LOGE(TAG,
"Cannot allocate effect data!");
175 ESP_LOGE(TAG,
"Cannot allocate DMA buffer!");
180 memset(this->
buf_, 0, buffer_size);
182 memset(this->
dma_buf_, 0, dma_buffer_size);
185 sddev_control(ICU_DEV_NAME, CMD_CONF_PCLK_26M, &value);
187 value = PWD_SPI_CLK_BIT;
188 sddev_control(ICU_DEV_NAME, CMD_CLK_PWR_UP, &value);
190 if (spi_data !=
nullptr) {
191 ESP_LOGE(TAG,
"SPI device already initialized!");
196 spi_data = (SpiData *) calloc(1,
sizeof(SpiData));
197 if (spi_data ==
nullptr) {
198 ESP_LOGE(TAG,
"Cannot allocate spi_data!");
203 spi_data->dma_tx_semaphore = xSemaphoreCreateBinary();
204 if (spi_data->dma_tx_semaphore ==
nullptr) {
205 ESP_LOGE(TAG,
"TX Semaphore init faild!");
210 spi_data->first_run =
true;
212 set_spi_ctrl_register(MSTEN,
false);
213 set_spi_ctrl_register(BIT_WDTH,
false);
215 set_spi_ctrl_register(CKPOL,
false);
216 set_spi_ctrl_register(CKPHA,
false);
217 set_spi_ctrl_register(MSTEN,
true);
218 set_spi_ctrl_register(SPIEN,
true);
220 set_spi_ctrl_register(TXINT_EN,
false);
221 set_spi_ctrl_register(RXINT_EN,
false);
222#ifdef BEKEN_SPI_IS_N_LIKE
223 set_spi_config_register(SPI_TX_FINISH_EN,
true);
224 set_spi_config_register(SPI_RX_FINISH_EN,
true);
226 set_spi_ctrl_register(RXOVR_EN,
false);
227 set_spi_ctrl_register(TXOVR_EN,
false);
229 value = REG_READ(SPI_CTRL);
230 value &= ~CTRL_NSSMD_3;
232 REG_WRITE(SPI_CTRL, value);
234#ifdef BEKEN_SPI_IS_N_LIKE
235 value = GFUNC_MODE_SPI_DMA;
239 value = GFUNC_MODE_SPI;
241 sddev_control(GPIO_DEV_NAME, CMD_GPIO_ENABLE_SECOND, &value);
242#ifdef BEKEN_SPI_IS_N_LIKE
243 set_spi_ctrl_register(SPI_S_CS_UP_INT_EN,
false);
247 GDMACFG_TPYES_ST init_cfg;
248 memset(&init_cfg, 0,
sizeof(GDMACFG_TPYES_ST));
250 init_cfg.dstdat_width = 8;
251 init_cfg.srcdat_width = 32;
252 init_cfg.dstptr_incr = 0;
253 init_cfg.srcptr_incr = 1;
254 init_cfg.src_start_addr = this->
dma_buf_;
255 init_cfg.dst_start_addr = (
void *) SPI_DAT;
256 init_cfg.channel = SPI_TX_DMA_CHANNEL;
258 init_cfg.u.type4.src_loop_start_addr = this->
dma_buf_;
259 init_cfg.u.type4.src_loop_end_addr = this->
dma_buf_ + dma_buffer_size;
260 init_cfg.half_fin_handler =
nullptr;
262 init_cfg.src_module = GDMA_X_SRC_DTCM_RD_REQ;
263 init_cfg.dst_module = GDMA_X_DST_GSPI_TX_REQ;
264 sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_TYPE4, (
void *) &init_cfg);
265 en_cfg.channel = SPI_TX_DMA_CHANNEL;
266 en_cfg.param = dma_buffer_size;
267 sddev_control(GDMA_DEV_NAME, CMD_GDMA_SET_TRANS_LENGTH, (
void *) &en_cfg);
268 en_cfg.channel = SPI_TX_DMA_CHANNEL;
270 sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_WORK_MODE, (
void *) &en_cfg);
271 en_cfg.channel = SPI_TX_DMA_CHANNEL;
273 sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_SRCADDR_LOOP, &en_cfg);
277#ifdef BEKEN_SPI_IS_N_LIKE
279 value = REG_READ(SPI_CONFIG);
280 value &= ~(0xFFF << 8);
281 value |= ((dma_buffer_size & 0xFFF) << 8);
282 REG_WRITE(SPI_CONFIG, value);