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