96 mode::OnOverload on_overload, mode::OnExtHalt on_ext_halt, mode::Sync sync) {
102 auto flexio = FlexIOHandler::flexIOHandler_list[2];
106 flexio->setClockSettings(CLK_SEL, 0, 0);
107 auto CLK_FREQ = flexio->computeClockRate();
108 auto CLK_FREQ_MHz = CLK_FREQ / 1'000'000;
117 uint8_t _sck_flex_pin = flexio->mapIOPinToFlexPin(
PIN_SYNC_CLK);
118 if (_sck_flex_pin == 0xff)
122 flexio->port().TIMCTL[t_sync_clk] = FLEXIO_TIMCTL_PINSEL(_sck_flex_pin) | FLEXIO_TIMCTL_TIMOD(1);
123 flexio->port().TIMCFG[t_sync_clk] = FLEXIO_TIMCFG_TIMOUT(1) | FLEXIO_TIMCFG_TIMDEC(2);
124 flexio->port().TIMCMP[t_sync_clk] = 0x0000'FF'00;
127 auto _flexio_pin_data_in = flexio->mapIOPinToFlexPin(
PIN_SYNC_ID);
128 if (_flexio_pin_data_in == 0xff)
131 flexio->port().SHIFTCTL[z_sync_match] = FLEXIO_SHIFTCTL_TIMSEL(t_sync_clk) |
132 FLEXIO_SHIFTCTL_PINSEL(_flexio_pin_data_in) |
133 FLEXIO_SHIFTCTL_SMOD(0b101);
134 flexio->port().SHIFTCFG[z_sync_match] = 0;
136 flexio->port().SHIFTBUF[z_sync_match] = 0b01010101'00001111'00000000'00000000;
140 flexio->port().TIMCTL[t_sync_trigger] =
141 FLEXIO_TIMCTL_TRGSEL(4 * z_sync_match + 1) | FLEXIO_TIMCTL_TRGSRC | FLEXIO_TIMCTL_TIMOD(1);
142 flexio->port().TIMCFG[t_sync_trigger] = FLEXIO_TIMCFG_TIMDIS(2) | FLEXIO_TIMCFG_TIMENA(6);
143 flexio->port().TIMCMP[t_sync_trigger] = 0x0000'01'00;
151 flexio->port().SHIFTCTL[s_idle] = FLEXIO_SHIFTCTL_PINCFG(3) | FLEXIO_SHIFTCTL_SMOD_STATE;
152 flexio->port().SHIFTBUF[s_idle] = FLEXIO_STATE_SHIFTBUF(0b11111111, s_idle);
155 flexio->port().SHIFTCTL[s_idle] =
156 FLEXIO_SHIFTCTL_TIMSEL(t_sync_trigger) | FLEXIO_SHIFTCTL_PINCFG(3) | FLEXIO_SHIFTCTL_SMOD_STATE;
157 flexio->port().SHIFTBUF[s_idle] = FLEXIO_STATE_SHIFTBUF(0b11111111, s_ic);
159 flexio->port().SHIFTCFG[s_idle] = 0;
167 flexio->port().TIMCTL[t_state_check] = FLEXIO_TIMCTL_TIMOD(3);
168 flexio->port().TIMCFG[t_state_check] = FLEXIO_TIMCFG_TIMDIS(0) | FLEXIO_TIMCFG_TIMENA(0);
169 flexio->port().TIMCMP[t_state_check] = 0x0000'0001;
176 if (ic_time_ns < 100 or ic_time_ns >= 9'000'000'000) {
177 LOG_ERROR(
"FlexIOControl: Requested ic_time_ns cannot be represented by 32bit.");
196 auto factors = utils::factorize(ic_time_ns * CLK_FREQ_MHz / 1000);
197 if (factors.first >= 1 << 16 || factors.second >= 1 << 16)
201 flexio->port().TIMCTL[t_ic] =
202 FLEXIO_TIMCTL_TRGSEL_STATE(s_ic) | FLEXIO_TIMCTL_TIMOD(3) | FLEXIO_TIMCTL_PINPOL;
203 flexio->port().TIMCFG[t_ic] = FLEXIO_TIMCFG_TIMRST(6) | FLEXIO_TIMCFG_TIMDIS(6) | FLEXIO_TIMCFG_TIMENA(6);
204 flexio->port().TIMCMP[t_ic] = factors.first - 1;
206 flexio->port().TIMCTL[t_ic_second] = FLEXIO_TIMCTL_TRGSEL(4 * t_ic + 3) | FLEXIO_TIMCTL_TRGSRC |
207 FLEXIO_TIMCTL_TIMOD(3) | FLEXIO_TIMCTL_PINCFG(3) |
208 FLEXIO_TIMCTL_PINSEL(17);
209 flexio->port().TIMCFG[t_ic_second] = FLEXIO_TIMCFG_TIMDEC(1) | FLEXIO_TIMCFG_TIMRST(0) |
210 FLEXIO_TIMCFG_TIMDIS(1) | FLEXIO_TIMCFG_TIMENA(1) |
211 FLEXIO_TIMCFG_TIMOUT(1);
212 flexio->port().TIMCMP[t_ic_second] = factors.second;
216 flexio->port().SHIFTCTL[s_ic] = FLEXIO_SHIFTCTL_TIMSEL(t_state_check) | FLEXIO_SHIFTCTL_PINCFG(3) |
217 FLEXIO_SHIFTCTL_PINSEL(15) | FLEXIO_SHIFTCTL_SMOD_STATE;
218 flexio->port().SHIFTCFG[s_ic] = 0;
219 flexio->port().SHIFTBUF[s_ic] =
220 FLEXIO_STATE_SHIFTBUF(0b11101111, s_ic, s_ic, s_ic, s_ic, s_op, s_op, s_op, s_op);
231 if (op_time_ns < 100 or op_time_ns > 9'000'000'000) {
232 LOG_ERROR(
"FlexIOControl: Requested op_time_ns cannot be represented by 32bit.");
237 if (op_time_ns < 0xFFFFull * 1000ull / CLK_FREQ_MHz) {
239 flexio->port().TIMCTL[t_op] = FLEXIO_TIMCTL_TRGSEL_STATE(s_op) | FLEXIO_TIMCTL_TIMOD(3) |
240 FLEXIO_TIMCTL_PINCFG(3) | FLEXIO_TIMCTL_PINSEL(12);
241 flexio->port().TIMCFG[t_op] = FLEXIO_TIMCFG_TIMRST(6) | FLEXIO_TIMCFG_TIMDIS(0b110) |
242 FLEXIO_TIMCFG_TIMENA(6) | FLEXIO_TIMCFG_TIMOUT(1);
243 flexio->port().TIMCMP[t_op] = op_time_ns * CLK_FREQ_MHz / 1000;
246 flexio->port().TIMCTL[t_op_second] = 0;
247 flexio->port().TIMCFG[t_op_second] = 0;
248 flexio->port().TIMCMP[t_op_second] = 0;
254 auto factors = utils::factorize(op_time_ns * CLK_FREQ_MHz / 1000);
255 if (factors.first >= 1 << 16 ||
256 factors.second >= 1 << 16)
259 flexio->port().TIMCTL[t_op] =
260 FLEXIO_TIMCTL_TRGSEL_STATE(s_op) | FLEXIO_TIMCTL_TIMOD(3) | FLEXIO_TIMCTL_PINPOL;
261 flexio->port().TIMCFG[t_op] =
262 FLEXIO_TIMCFG_TIMRST(6) | FLEXIO_TIMCFG_TIMDIS(0b110) | FLEXIO_TIMCFG_TIMENA(6);
263 flexio->port().TIMCMP[t_op] = factors.first - 1;
265 flexio->port().TIMCTL[t_op_second] = FLEXIO_TIMCTL_TRGSEL(4 * t_op + 3) | FLEXIO_TIMCTL_TRGSRC |
266 FLEXIO_TIMCTL_TIMOD(3) | FLEXIO_TIMCTL_PINCFG(3) |
267 FLEXIO_TIMCTL_PINSEL(12);
268 flexio->port().TIMCFG[t_op_second] = FLEXIO_TIMCFG_TIMDEC(1) | FLEXIO_TIMCFG_TIMRST(0) |
269 FLEXIO_TIMCFG_TIMDIS(1) | FLEXIO_TIMCFG_TIMENA(1) |
270 FLEXIO_TIMCFG_TIMOUT(1);
271 flexio->port().TIMCMP[t_op_second] = factors.second;
275 flexio->port().SHIFTCTL[s_op] = FLEXIO_SHIFTCTL_TIMSEL(t_state_check) | FLEXIO_SHIFTCTL_PINCFG(3) |
276 FLEXIO_SHIFTCTL_PINSEL(10) | FLEXIO_SHIFTCTL_SMOD_STATE;
277 flexio->port().SHIFTCFG[s_op] = 0;
281 uint8_t next_if_overload_and_exthalt = s_op, next_if_overload = s_op, next_if_exthalt = s_op;
282 switch (on_ext_halt) {
283 case OnExtHalt::IGNORE:
284 next_if_exthalt = s_op;
286 case OnExtHalt::PAUSE_THEN_RESTART:
287 next_if_exthalt = s_exthalt;
290 switch (on_overload) {
291 case OnOverload::IGNORE:
292 next_if_overload = s_op;
293 next_if_overload_and_exthalt = next_if_exthalt;
295 case OnOverload::HALT:
296 next_if_overload = s_overload;
297 next_if_overload_and_exthalt = s_overload;
300 flexio->port().SHIFTBUF[s_op] = FLEXIO_STATE_SHIFTBUF(0b11011111,
301 next_if_overload_and_exthalt,
315 flexio->port().SHIFTCTL[s_end] = FLEXIO_SHIFTCTL_PINCFG(3) | FLEXIO_SHIFTCTL_SMOD_STATE;
316 flexio->port().SHIFTCFG[s_end] = 0;
317 flexio->port().SHIFTBUF[s_end] = FLEXIO_STATE_SHIFTBUF(0b11111111, s_end);
323 flexio->port().SHIFTCTL[s_overload] = FLEXIO_SHIFTCTL_PINCFG(3) | FLEXIO_SHIFTCTL_SMOD_STATE;
324 flexio->port().SHIFTCFG[s_overload] = 0;
325 flexio->port().SHIFTBUF[s_overload] = FLEXIO_STATE_SHIFTBUF(0b11111111, s_overload);
337 flexio->port().SHIFTCTL[s_exthalt] = FLEXIO_SHIFTCTL_TIMSEL(t_state_check) | FLEXIO_SHIFTCTL_PINCFG(3) |
338 FLEXIO_SHIFTCTL_PINSEL(10) | FLEXIO_SHIFTCTL_SMOD_STATE;
339 flexio->port().SHIFTCFG[s_exthalt] = 0;
341 flexio->port().SHIFTBUF[s_exthalt] =
342 FLEXIO_STATE_SHIFTBUF(0b11111111, s_exthalt, s_exthalt, s_op, s_op, s_exthalt, s_exthalt, s_op, s_op);
350 if (flexio->mapIOPinToFlexPin(pin) == 0xff) {
353 flexio->setIOPinToFlexMode(pin);
357 _is_initialized =
true;