37
37
#include "hardware/irq.h"
38
38
#include "hardware/pio.h"
39
39
40
- #define PIO_NUM (pio ) ((pio) == pio0 ? 0 : 1)
41
-
42
40
typedef struct _rp2_pio_obj_t {
43
41
mp_obj_base_t base ;
44
42
PIO pio ;
@@ -82,15 +80,15 @@ static void pio_irq0(PIO pio) {
82
80
pio -> irq = ints >> 8 ;
83
81
84
82
// Call handler if it is registered, for PIO irqs.
85
- rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [PIO_NUM (pio )]);
83
+ rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [pio_get_index (pio )]);
86
84
if (irq != NULL && (ints & irq -> trigger )) {
87
85
irq -> flags = ints & irq -> trigger ;
88
86
mp_irq_handler (& irq -> base );
89
87
}
90
88
91
89
// Call handler if it is registered, for StateMachine irqs.
92
90
for (size_t i = 0 ; i < 4 ; ++ i ) {
93
- rp2_state_machine_irq_obj_t * irq = MP_STATE_PORT (rp2_state_machine_irq_obj [PIO_NUM (pio ) * 4 + i ]);
91
+ rp2_state_machine_irq_obj_t * irq = MP_STATE_PORT (rp2_state_machine_irq_obj [pio_get_index (pio ) * 4 + i ]);
94
92
if (irq != NULL && ((ints >> (8 + i )) & irq -> trigger )) {
95
93
irq -> flags = 1 ;
96
94
mp_irq_handler (& irq -> base );
@@ -280,7 +278,7 @@ static mp_obj_t rp2_pio_add_program(mp_obj_t self_in, mp_obj_t prog_in) {
280
278
uint offset = rp2_pio_add_managed_program (self -> pio , & pio_program );
281
279
282
280
// Store the program offset in the program object.
283
- prog [PROG_OFFSET_PIO0 + PIO_NUM (self -> pio )] = MP_OBJ_NEW_SMALL_INT (offset );
281
+ prog [PROG_OFFSET_PIO0 + pio_get_index (self -> pio )] = MP_OBJ_NEW_SMALL_INT (offset );
284
282
285
283
return mp_const_none ;
286
284
}
@@ -301,12 +299,12 @@ static mp_obj_t rp2_pio_remove_program(size_t n_args, const mp_obj_t *args) {
301
299
mp_buffer_info_t bufinfo ;
302
300
mp_get_buffer_raise (prog [PROG_DATA ], & bufinfo , MP_BUFFER_READ );
303
301
length = bufinfo .len / 2 ;
304
- offset = mp_obj_get_int (prog [PROG_OFFSET_PIO0 + PIO_NUM (self -> pio )]);
302
+ offset = mp_obj_get_int (prog [PROG_OFFSET_PIO0 + pio_get_index (self -> pio )]);
305
303
if (offset < 0 ) {
306
304
mp_raise_ValueError ("prog not in instruction memory" );
307
305
}
308
306
// Invalidate the program offset in the program object.
309
- prog [PROG_OFFSET_PIO0 + PIO_NUM (self -> pio )] = MP_OBJ_NEW_SMALL_INT (-1 );
307
+ prog [PROG_OFFSET_PIO0 + pio_get_index (self -> pio )] = MP_OBJ_NEW_SMALL_INT (-1 );
310
308
}
311
309
312
310
// Remove the program from the instruction memory.
@@ -354,7 +352,7 @@ static mp_obj_t rp2_pio_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k
354
352
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
355
353
356
354
// Get the IRQ object.
357
- rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [PIO_NUM (self -> pio )]);
355
+ rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [pio_get_index (self -> pio )]);
358
356
359
357
// Allocate the IRQ object if it doesn't already exist.
360
358
if (irq == NULL ) {
@@ -364,7 +362,7 @@ static mp_obj_t rp2_pio_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k
364
362
irq -> base .parent = MP_OBJ_FROM_PTR (self );
365
363
irq -> base .handler = mp_const_none ;
366
364
irq -> base .ishard = false;
367
- MP_STATE_PORT (rp2_pio_irq_obj [PIO_NUM (self -> pio )]) = irq ;
365
+ MP_STATE_PORT (rp2_pio_irq_obj [pio_get_index (self -> pio )]) = irq ;
368
366
}
369
367
370
368
if (n_args > 1 || kw_args -> used != 0 ) {
@@ -426,7 +424,7 @@ MP_DEFINE_CONST_OBJ_TYPE(
426
424
427
425
static mp_uint_t rp2_pio_irq_trigger (mp_obj_t self_in , mp_uint_t new_trigger ) {
428
426
rp2_pio_obj_t * self = MP_OBJ_TO_PTR (self_in );
429
- rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [PIO_NUM (self -> pio )]);
427
+ rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [pio_get_index (self -> pio )]);
430
428
irq_set_enabled (self -> irq , false);
431
429
irq -> flags = 0 ;
432
430
irq -> trigger = new_trigger ;
@@ -436,7 +434,7 @@ static mp_uint_t rp2_pio_irq_trigger(mp_obj_t self_in, mp_uint_t new_trigger) {
436
434
437
435
static mp_uint_t rp2_pio_irq_info (mp_obj_t self_in , mp_uint_t info_type ) {
438
436
rp2_pio_obj_t * self = MP_OBJ_TO_PTR (self_in );
439
- rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [PIO_NUM (self -> pio )]);
437
+ rp2_pio_irq_obj_t * irq = MP_STATE_PORT (rp2_pio_irq_obj [pio_get_index (self -> pio )]);
440
438
if (info_type == MP_IRQ_INFO_FLAGS ) {
441
439
return irq -> flags ;
442
440
} else if (info_type == MP_IRQ_INFO_TRIGGERS ) {
@@ -537,10 +535,10 @@ static mp_obj_t rp2_state_machine_init_helper(const rp2_state_machine_obj_t *sel
537
535
mp_obj_get_array_fixed_n (args [ARG_prog ].u_obj , PROG_MAX_FIELDS , & prog );
538
536
539
537
// Get and the program offset, and load it into memory if it's not already there.
540
- mp_int_t offset = mp_obj_get_int (prog [PROG_OFFSET_PIO0 + PIO_NUM (self -> pio )]);
538
+ mp_int_t offset = mp_obj_get_int (prog [PROG_OFFSET_PIO0 + pio_get_index (self -> pio )]);
541
539
if (offset < 0 ) {
542
- rp2_pio_add_program (& rp2_pio_obj [PIO_NUM (self -> pio )], args [ARG_prog ].u_obj );
543
- offset = mp_obj_get_int (prog [PROG_OFFSET_PIO0 + PIO_NUM (self -> pio )]);
540
+ rp2_pio_add_program (& rp2_pio_obj [pio_get_index (self -> pio )], args [ARG_prog ].u_obj );
541
+ offset = mp_obj_get_int (prog [PROG_OFFSET_PIO0 + pio_get_index (self -> pio )]);
544
542
}
545
543
rp2_state_machine_initial_pc [self -> id ] = offset ;
546
544
@@ -907,7 +905,7 @@ MP_DEFINE_CONST_OBJ_TYPE(
907
905
908
906
static mp_uint_t rp2_state_machine_irq_trigger (mp_obj_t self_in , mp_uint_t new_trigger ) {
909
907
rp2_state_machine_obj_t * self = MP_OBJ_TO_PTR (self_in );
910
- rp2_state_machine_irq_obj_t * irq = MP_STATE_PORT (rp2_state_machine_irq_obj [PIO_NUM (self -> pio )]);
908
+ rp2_state_machine_irq_obj_t * irq = MP_STATE_PORT (rp2_state_machine_irq_obj [pio_get_index (self -> pio )]);
911
909
irq_set_enabled (self -> irq , false);
912
910
irq -> flags = 0 ;
913
911
irq -> trigger = new_trigger ;
@@ -917,7 +915,7 @@ static mp_uint_t rp2_state_machine_irq_trigger(mp_obj_t self_in, mp_uint_t new_t
917
915
918
916
static mp_uint_t rp2_state_machine_irq_info (mp_obj_t self_in , mp_uint_t info_type ) {
919
917
rp2_state_machine_obj_t * self = MP_OBJ_TO_PTR (self_in );
920
- rp2_state_machine_irq_obj_t * irq = MP_STATE_PORT (rp2_state_machine_irq_obj [PIO_NUM (self -> pio )]);
918
+ rp2_state_machine_irq_obj_t * irq = MP_STATE_PORT (rp2_state_machine_irq_obj [pio_get_index (self -> pio )]);
921
919
if (info_type == MP_IRQ_INFO_FLAGS ) {
922
920
return irq -> flags ;
923
921
} else if (info_type == MP_IRQ_INFO_TRIGGERS ) {
0 commit comments