@@ -405,39 +405,43 @@ static uint32_t mask_and_rotate(const mcu_pin_obj_t *first_pin, uint32_t bit_cou
405
405
}
406
406
407
407
typedef struct {
408
- uint32_t pins_we_use , in_pin_count , out_pin_count ;
409
- bool has_jmp_pin , auto_push , auto_pull , has_in_pin , has_out_pin , has_set_pin ;
410
- bool tx_fifo , rx_fifo , in_loaded , out_loaded , in_used , out_used ;
408
+ struct {
409
+ uint32_t pins_we_use , in_pin_count , out_pin_count ;
410
+ bool has_jmp_pin , auto_push , auto_pull , has_in_pin , has_out_pin , has_set_pin ;
411
+ } inputs ;
412
+ struct {
413
+ bool tx_fifo , rx_fifo , in_loaded , out_loaded , in_used , out_used ;
414
+ } outputs ;
411
415
} introspect_t ;
412
416
413
417
static void consider_instruction (introspect_t * state , uint16_t full_instruction , qstr what_program , size_t i ) {
414
418
uint16_t instruction = full_instruction & 0xe000 ;
415
419
if (instruction == 0x8000 ) {
416
420
if ((full_instruction & 0xe080 ) == pio_instr_bits_push ) {
417
- state -> rx_fifo = true;
418
- state -> in_loaded = true;
421
+ state -> outputs . rx_fifo = true;
422
+ state -> outputs . in_loaded = true;
419
423
} else { // pull otherwise.
420
- state -> tx_fifo = true;
421
- state -> out_loaded = true;
424
+ state -> outputs . tx_fifo = true;
425
+ state -> outputs . out_loaded = true;
422
426
}
423
427
}
424
428
if (instruction == pio_instr_bits_jmp ) {
425
429
uint16_t condition = (full_instruction & 0x00e0 ) >> 5 ;
426
- if ((condition == 0x6 ) && !state -> has_jmp_pin ) {
430
+ if ((condition == 0x6 ) && !state -> inputs . has_jmp_pin ) {
427
431
mp_raise_ValueError_varg (translate ("Missing jmp_pin. %q[%u] jumps on pin" ), what_program , i );
428
432
}
429
433
}
430
434
if (instruction == pio_instr_bits_wait ) {
431
435
uint16_t wait_source = (full_instruction & 0x0060 ) >> 5 ;
432
436
uint16_t wait_index = full_instruction & 0x001f ;
433
- if (wait_source == 0 && (state -> pins_we_use & (1 << wait_index )) == 0 ) { // GPIO
437
+ if (wait_source == 0 && (state -> inputs . pins_we_use & (1 << wait_index )) == 0 ) { // GPIO
434
438
mp_raise_ValueError_varg (translate ("%q[%u] uses extra pin" ), what_program , i );
435
439
}
436
440
if (wait_source == 1 ) { // Input pin
437
- if (!state -> has_in_pin ) {
441
+ if (!state -> inputs . has_in_pin ) {
438
442
mp_raise_ValueError_varg (translate ("Missing first_in_pin. %q[%u] waits based on pin" ), what_program , i );
439
443
}
440
- if (wait_index >= state -> in_pin_count ) {
444
+ if (wait_index >= state -> inputs . in_pin_count ) {
441
445
mp_raise_ValueError_varg (translate ("%q[%u] waits on input outside of count" ), what_program , i );
442
446
}
443
447
}
@@ -446,58 +450,58 @@ static void consider_instruction(introspect_t *state, uint16_t full_instruction,
446
450
uint16_t source = (full_instruction & 0x00e0 ) >> 5 ;
447
451
uint16_t bit_count = full_instruction & 0x001f ;
448
452
if (source == 0 ) {
449
- if (!state -> has_in_pin ) {
453
+ if (!state -> inputs . has_in_pin ) {
450
454
mp_raise_ValueError_varg (translate ("Missing first_in_pin. %q[%u] shifts in from pin(s)" ), what_program , i );
451
455
}
452
- if (bit_count > state -> in_pin_count ) {
456
+ if (bit_count > state -> inputs . in_pin_count ) {
453
457
mp_raise_ValueError_varg (translate ("%q[%u] shifts in more bits than pin count" ), what_program , i );
454
458
}
455
459
}
456
- if (state -> auto_push ) {
457
- state -> in_loaded = true;
458
- state -> rx_fifo = true;
460
+ if (state -> inputs . auto_push ) {
461
+ state -> outputs . in_loaded = true;
462
+ state -> outputs . rx_fifo = true;
459
463
}
460
- state -> in_used = true;
464
+ state -> outputs . in_used = true;
461
465
}
462
466
if (instruction == pio_instr_bits_out ) {
463
467
uint16_t bit_count = full_instruction & 0x001f ;
464
468
uint16_t destination = (full_instruction & 0x00e0 ) >> 5 ;
465
469
// Check for pins or pindirs destination.
466
470
if (destination == 0x0 || destination == 0x4 ) {
467
- if (!state -> has_out_pin ) {
471
+ if (!state -> inputs . has_out_pin ) {
468
472
mp_raise_ValueError_varg (translate ("Missing first_out_pin. %q[%u] shifts out to pin(s)" ), what_program , i );
469
473
}
470
- if (bit_count > state -> out_pin_count ) {
474
+ if (bit_count > state -> inputs . out_pin_count ) {
471
475
mp_raise_ValueError_varg (translate ("%q[%u] shifts out more bits than pin count" ), what_program , i );
472
476
}
473
477
}
474
- if (state -> auto_pull ) {
475
- state -> out_loaded = true;
476
- state -> tx_fifo = true;
478
+ if (state -> inputs . auto_pull ) {
479
+ state -> outputs . out_loaded = true;
480
+ state -> outputs . tx_fifo = true;
477
481
}
478
- state -> out_used = true;
482
+ state -> outputs . out_used = true;
479
483
}
480
484
if (instruction == pio_instr_bits_set ) {
481
485
uint16_t destination = (full_instruction & 0x00e0 ) >> 5 ;
482
486
// Check for pins or pindirs destination.
483
- if ((destination == 0x00 || destination == 0x4 ) && !state -> has_set_pin ) {
487
+ if ((destination == 0x00 || destination == 0x4 ) && !state -> inputs . has_set_pin ) {
484
488
mp_raise_ValueError_varg (translate ("Missing first_set_pin. %q[%u] sets pin(s)" ), what_program , i );
485
489
}
486
490
}
487
491
if (instruction == pio_instr_bits_mov ) {
488
492
uint16_t source = full_instruction & 0x0007 ;
489
493
uint16_t destination = (full_instruction & 0x00e0 ) >> 5 ;
490
494
// Check for pins or pindirs destination.
491
- if (destination == 0x0 && !state -> has_out_pin ) {
495
+ if (destination == 0x0 && !state -> inputs . has_out_pin ) {
492
496
mp_raise_ValueError_varg (translate ("Missing first_out_pin. %q[%u] writes pin(s)" ), what_program , i );
493
497
}
494
- if (source == 0x0 && !state -> has_in_pin ) {
498
+ if (source == 0x0 && !state -> inputs . has_in_pin ) {
495
499
mp_raise_ValueError_varg (translate ("Missing first_in_pin. %q[%u] reads pin(s)" ), what_program , i );
496
500
}
497
501
if (destination == 0x6 ) {
498
- state -> in_loaded = true;
502
+ state -> outputs . in_loaded = true;
499
503
} else if (destination == 0x7 ) {
500
- state -> out_loaded = true;
504
+ state -> outputs . out_loaded = true;
501
505
}
502
506
}
503
507
}
@@ -539,24 +543,26 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
539
543
540
544
// Look through the program to see what we reference and make sure it was provided.
541
545
introspect_t state = {
542
- .pins_we_use = pins_we_use ,
543
- .has_jmp_pin = jmp_pin != NULL ,
544
- .has_in_pin = first_in_pin != NULL ,
545
- .has_out_pin = first_out_pin != NULL ,
546
- .has_set_pin = first_set_pin != NULL ,
547
- .in_pin_count = in_pin_count ,
548
- .out_pin_count = out_pin_count ,
549
- .auto_pull = auto_pull ,
550
- .auto_push = auto_push ,
546
+ .inputs = {
547
+ .pins_we_use = pins_we_use ,
548
+ .has_jmp_pin = jmp_pin != NULL ,
549
+ .has_in_pin = first_in_pin != NULL ,
550
+ .has_out_pin = first_out_pin != NULL ,
551
+ .has_set_pin = first_set_pin != NULL ,
552
+ .in_pin_count = in_pin_count ,
553
+ .out_pin_count = out_pin_count ,
554
+ .auto_pull = auto_pull ,
555
+ .auto_push = auto_push ,
556
+ }
551
557
};
552
558
consider_program (& state , program , program_len , MP_QSTR_program );
553
559
consider_program (& state , init , init_len , MP_QSTR_init );
554
560
consider_program (& state , may_exec , may_exec_len , MP_QSTR_may_exec );
555
561
556
- if (!state .in_loaded && state .in_used ) {
562
+ if (!state .outputs . in_loaded && state . outputs .in_used ) {
557
563
mp_raise_ValueError_varg (translate ("Program does IN without loading ISR" ));
558
564
}
559
- if (!state .out_loaded && state .out_used ) {
565
+ if (!state .outputs . out_loaded && state . outputs .out_used ) {
560
566
mp_raise_ValueError_varg (translate ("Program does OUT without loading OSR" ));
561
567
}
562
568
@@ -609,7 +615,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
609
615
first_sideset_pin , sideset_pin_count ,
610
616
initial_pin_state , initial_pin_direction ,
611
617
jmp_pin ,
612
- pins_we_use , state .tx_fifo , state .rx_fifo ,
618
+ pins_we_use , state .outputs . tx_fifo , state . outputs .rx_fifo ,
613
619
auto_pull , pull_threshold , out_shift_right ,
614
620
wait_for_txstall ,
615
621
auto_push , push_threshold , in_shift_right ,
0 commit comments