35 if (this->
buf_ ==
nullptr) {
36 ESP_LOGE(TAG,
"Failed to allocate buffer of size %u", buffer_size);
43 ESP_LOGE(TAG,
"Failed to allocate effect data of size %u", this->
num_leds_);
51 if (this->
pio_ ==
nullptr) {
52 ESP_LOGE(TAG,
"Failed to claim PIO instance");
61 if (RP2040PIOLEDStripLightOutput::num_instance[this->
pio_ == pio0 ? 0 : 1] >= 4) {
62 ESP_LOGE(TAG,
"Too many instances of PIO program");
67 RP2040PIOLEDStripLightOutput::num_instance[this->
pio_ == pio0 ? 0 : 1]++;
70 if (RP2040PIOLEDStripLightOutput::conf_count[this->
chipset_]) {
71 offset = RP2040PIOLEDStripLightOutput::chipset_offsets[this->
chipset_];
74 offset = pio_add_program(this->pio_, this->
program_);
75 RP2040PIOLEDStripLightOutput::chipset_offsets[this->
chipset_] = offset;
76 RP2040PIOLEDStripLightOutput::conf_count[this->
chipset_] =
true;
80 this->
sm_ = pio_claim_unused_sm(this->pio_,
true);
83 ESP_LOGE(TAG,
"Failed to claim PIO state machine");
90 this->
dma_chan_ = dma_claim_unused_channel(
true);
92 ESP_LOGE(TAG,
"Failed to claim DMA channel");
98 RP2040PIOLEDStripLightOutput::dma_chan_active[this->
dma_chan_] =
true;
101 channel_config_set_transfer_data_size(
104 channel_config_set_read_increment(&this->
dma_config_,
true);
105 channel_config_set_write_increment(&this->
dma_config_,
false);
107 pio_get_dreq(this->pio_, this->
sm_,
true));
110 &this->pio_->txf[this->sm_],
117 sem_init(&RP2040PIOLEDStripLightOutput::dma_write_complete_sem[this->
dma_chan_], 1, 1);
120 dma_channel_set_irq0_enabled(this->dma_chan_,
true);
121 irq_set_enabled(DMA_IRQ_0,
true);
145 int32_t r = 0, g = 0, b = 0;
178 uint8_t multiplier = this->
is_rgbw_ ? 4 : 3;
179 return {this->
buf_ + (index * multiplier) + r,
180 this->
buf_ + (index * multiplier) + g,
181 this->
buf_ + (index * multiplier) + b,
182 this->
is_rgbw_ ? this->
buf_ + (index * multiplier) + 3 :
nullptr,