155 {
157 return fl::task::Error("Device not initialized");
158 }
159
160 if (
pImpl->initialized) {
161
163 }
164
165 size_t num_pins =
pImpl->config.gpio_pins.size();
166
167
168 if (num_pins == 0 || num_pins > 32) {
169 return fl::task::Error("Invalid number of GPIO pins (must be 1-32)");
170 }
171
172
173 u8 backend_width = 1;
174 if (num_pins > 16) backend_width = 32;
175 else if (num_pins > 8) backend_width = 16;
176 else if (num_pins > 4) backend_width = 8;
177 else if (num_pins > 2) backend_width = 4;
178 else if (num_pins > 1) backend_width = 2;
179
180 pImpl->backend_width = backend_width;
181
182
185 pImpl->is_isr_mode = use_isr;
186
187
188 u32 set_masks[256];
189 u32 clear_masks[256];
191
192
193
194
195
196 if (use_isr) {
197
198 FL_DBG(
"ParallelDevice: Initializing ISR mode (width=" << (
int)backend_width <<
")");
199
200
201
202 return fl::task::Error("ISR mode not yet implemented for ParallelDevice");
203
204 } else {
205
206 FL_DBG(
"ParallelDevice: Initializing bit-bang mode (width=" << (
int)backend_width <<
")");
207
208
209
210 return fl::task::Error("Bit-bang mode not yet implemented for ParallelDevice");
211 }
212
213 pImpl->initialized =
true;
215}
fl::unique_ptr< Impl > pImpl
void buildDefaultLUT(const fl::vector< u8 > &gpio_pins, u32 *set_masks, u32 *clear_masks)
Build default LUT for parallel GPIO mapping.
constexpr nullopt_t nullopt
@ ISR_ASYNC
ISR-driven async mode.
@ AUTO
Auto-select best mode (default: ISR)