@@ -42,6 +42,7 @@ typedef struct _machine_encoder_obj_t {
42
42
mp_obj_base_t base ;
43
43
ENC_Type * instance ;
44
44
int8_t id ;
45
+ bool active ;
45
46
uint8_t input_a ;
46
47
uint8_t input_b ;
47
48
uint8_t mode ;
@@ -69,13 +70,6 @@ typedef struct _encoder_xbar_signal_t {
69
70
#define ENCODER_TRIGGER_ROLL_UNDER (kENC_PositionRollUnderFlag)
70
71
#define ENCODER_ALL_INTERRUPTS (0x7f)
71
72
72
- #if !defined(XBAR_ENC_DIR_OFFSET )
73
- #define XBAR_ENC_DIR_OFFSET (12)
74
- #define XBAR_ENC_DIR_REGISTER GPR6
75
- #define XBAR_OUT_MIN (4)
76
- #define XBAR_OUT_MAX (19)
77
- #endif
78
-
79
73
#define XBAR_IN (1)
80
74
#define XBAR_OUT (0)
81
75
@@ -86,6 +80,58 @@ typedef struct _encoder_xbar_signal_t {
86
80
87
81
STATIC void encoder_deinit_single (machine_encoder_obj_t * self );
88
82
83
+ #if defined MIMXRT117x_SERIES
84
+
85
+ #define XBAR_ENC_DIR_OFFSET_1 (4)
86
+ #define XBAR_ENC_DIR_REGISTER_1 GPR20
87
+ #define XBAR_ENC_DIR_OFFSET_2 (32)
88
+ #define XBAR_ENC_DIR_REGISTER_2 GPR21
89
+ #define XBAR_OUT_MIN (4)
90
+ #define XBAR_OUT_MAX (42)
91
+ #define XBAR_STRING "XBAR1_INOUT"
92
+ #define XBAR_STRING_LEN strlen(XBAR_STRING)
93
+
94
+ static encoder_xbar_signal_t xbar_signal_table [FSL_FEATURE_SOC_ENC_COUNT ] = {
95
+ { kXBARA1_OutputDec1Phasea ,
96
+ kXBARA1_OutputDec1Phaseb ,
97
+ kXBARA1_OutputDec1Index ,
98
+ kXBARA1_OutputDec1Home ,
99
+ kXBARA1_OutputDec1Trigger ,
100
+ kXBARA1_InputDec1PosMatch },
101
+
102
+ { kXBARA1_OutputDec2Phasea ,
103
+ kXBARA1_OutputDec2Phaseb ,
104
+ kXBARA1_OutputDec2Index ,
105
+ kXBARA1_OutputDec2Home ,
106
+ kXBARA1_OutputDec2Trigger ,
107
+ kXBARA1_InputDec2PosMatch },
108
+
109
+ { kXBARA1_OutputDec3Phasea ,
110
+ kXBARA1_OutputDec3Phaseb ,
111
+ kXBARA1_OutputDec3Index ,
112
+ kXBARA1_OutputDec3Home ,
113
+ kXBARA1_OutputDec3Trigger ,
114
+ kXBARA1_InputDec3PosMatch },
115
+
116
+ { kXBARA1_OutputDec4Phasea ,
117
+ kXBARA1_OutputDec4Phaseb ,
118
+ kXBARA1_OutputDec4Index ,
119
+ kXBARA1_OutputDec4Home ,
120
+ kXBARA1_OutputDec4Trigger ,
121
+ kXBARA1_InputDec4PosMatch },
122
+ };
123
+
124
+ #else // defined MIMXRT117x_SERIES
125
+
126
+ #if !defined(XBAR_ENC_DIR_OFFSET )
127
+ #define XBAR_ENC_DIR_OFFSET (12)
128
+ #define XBAR_ENC_DIR_REGISTER GPR6
129
+ #define XBAR_OUT_MIN (4)
130
+ #define XBAR_OUT_MAX (19)
131
+ #endif
132
+ #define XBAR_STRING "XBAR_INOUT"
133
+ #define XBAR_STRING_LEN strlen(XBAR_STRING)
134
+
89
135
static encoder_xbar_signal_t xbar_signal_table [FSL_FEATURE_SOC_ENC_COUNT ] = {
90
136
{ kXBARA1_OutputEnc1PhaseAInput ,
91
137
kXBARA1_OutputEnc1PhaseBInput ,
@@ -122,6 +168,7 @@ static encoder_xbar_signal_t xbar_signal_table[FSL_FEATURE_SOC_ENC_COUNT] = {
122
168
#endif
123
169
#endif
124
170
};
171
+ #endif // defined MIMXRT117x_SERIES
125
172
126
173
static machine_encoder_obj_t * encoder_table [FSL_FEATURE_SOC_ENC_COUNT ];
127
174
static ENC_Type * enc_instances [] = ENC_BASE_PTRS ;
@@ -172,7 +219,7 @@ STATIC void mp_machine_encoder_print(const mp_print_t *print, mp_obj_t self_in,
172
219
self -> id , self -> cpc , self -> enc_config .positionCompareValue , self -> filter );
173
220
}
174
221
175
- // Utililty functions
222
+ // Utility functions
176
223
//
177
224
178
225
STATIC void encoder_set_iomux (const machine_pin_obj_t * pin , const machine_pin_af_obj_t * af ) {
@@ -185,13 +232,14 @@ STATIC const machine_pin_af_obj_t *af_name_decode_xbar(const machine_pin_af_obj_
185
232
xbar_input_signal_t * io_number ) {
186
233
const char * str ;
187
234
size_t len ;
235
+ size_t xlen = XBAR_STRING_LEN ;
188
236
str = (char * )qstr_data (af_obj -> name , & len );
189
- // test for the name starting with XBAR_INOUT
190
- if (len < 12 || strncmp (str , "XBAR_INOUT" , 10 ) != 0 ) {
237
+ // test for the name starting with XBAR
238
+ if (len < ( xlen + 2 ) || strncmp (str , XBAR_STRING , xlen ) != 0 ) {
191
239
return NULL ;
192
240
}
193
241
// Get I/O number, e.g. XBAR_INOUT03
194
- * io_number = (str [10 ] - '0' ) * 10 + (str [11 ] - '0' );
242
+ * io_number = (str [xlen ] - '0' ) * 10 + (str [xlen + 1 ] - '0' );
195
243
return af_obj ;
196
244
}
197
245
@@ -215,12 +263,26 @@ STATIC uint8_t connect_pin_to_encoder(mp_obj_t desc, xbar_output_signal_t encode
215
263
XBARA_SetSignalsConnection (XBARA1 , xbar_pin , encoder_signal );
216
264
} else {
217
265
// No API here, so do basic Register access.
266
+ #if defined MIMXRT117x_SERIES
267
+ if (xbar_pin >= XBAR_OUT_MIN && xbar_pin <= XBAR_OUT_MAX ) {
268
+ if (xbar_pin < XBAR_ENC_DIR_OFFSET_2 ) {
269
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER_1 |= 1 << (xbar_pin - XBAR_ENC_DIR_OFFSET_1 );
270
+ XBARA_SetSignalsConnection (XBARA1 , encoder_signal , xbar_pin );
271
+ } else {
272
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER_2 |= 1 << (xbar_pin - XBAR_ENC_DIR_OFFSET_2 );
273
+ XBARA_SetSignalsConnection (XBARA1 , encoder_signal , xbar_pin );
274
+ }
275
+ } else {
276
+ mp_raise_ValueError (MP_ERROR_TEXT ("invalid match Pin" ));
277
+ }
278
+ #else
218
279
if (xbar_pin >= XBAR_OUT_MIN && xbar_pin <= XBAR_OUT_MAX ) {
219
280
IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER |= 1 << (xbar_pin + XBAR_ENC_DIR_OFFSET ); // Compare the offset 12 with other MCU
220
281
XBARA_SetSignalsConnection (XBARA1 , encoder_signal , xbar_pin );
221
282
} else {
222
283
mp_raise_ValueError (MP_ERROR_TEXT ("invalid match Pin" ));
223
284
}
285
+ #endif // defined MIMXRT117x_SERIES
224
286
}
225
287
return xbar_pin ;
226
288
}
@@ -239,7 +301,12 @@ STATIC void clear_encoder_registers(machine_encoder_obj_t *self) {
239
301
//
240
302
STATIC uint32_t calc_filter (uint32_t filter_ns , uint16_t * count , uint16_t * period ) {
241
303
304
+ #if defined MIMXRT117x_SERIES
305
+ uint32_t freq_khz = CLOCK_GetRootClockFreq (kCLOCK_Root_Bus ) / 1000 ;
306
+ #else
242
307
uint32_t freq_kh
F438
z = CLOCK_GetIpgFreq () / 1000 ;
308
+ #endif
309
+
243
310
uint32_t cycles = (filter_ns * (freq_khz / 1000 )) / 1000 ;
244
311
if (cycles == 0 ) {
245
312
// Set filter off
@@ -277,7 +344,15 @@ STATIC void mp_machine_encoder_init_helper_common(machine_encoder_obj_t *self,
277
344
self -> match_pin = connect_pin_to_encoder (args [ARG_match_pin ].u_obj , xbar_signal_table [self -> id ].enc_match , XBAR_OUT );
278
345
} else {
279
346
// Disconnect the XBAR from the output by switching it to an input.
347
+ #if defined MIMXRT117x_SERIES
348
+ if (self -> match_pin < XBAR_ENC_DIR_OFFSET_2 ) {
349
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER_1 &= ~(1 << (self -> match_pin - XBAR_ENC_DIR_OFFSET_1 ));
350
+ } else {
351
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER_2 &= ~(1 << (self -> match_pin - XBAR_ENC_DIR_OFFSET_2 ));
352
+ }
353
+ #else
280
354
IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER &= ~(1 << (self -> match_pin + XBAR_ENC_DIR_OFFSET ));
355
+ #endif
281
356
}
282
357
}
283
358
@@ -321,6 +396,7 @@ STATIC void mp_machine_encoder_init_helper_common(machine_encoder_obj_t *self,
321
396
ENC_Init (self -> instance , enc_config );
322
397
clear_encoder_registers (self );
323
398
ENC_ClearStatusFlags (self -> instance , 0xff ); // Clear all status flags
399
+ self -> active = true;
324
400
}
325
401
326
402
STATIC void mp_machine_encoder_init_helper (machine_encoder_obj_t * self ,
@@ -420,15 +496,26 @@ STATIC mp_obj_t mp_machine_encoder_make_new(const mp_obj_type_t *type, size_t n_
420
496
}
421
497
422
498
STATIC void encoder_deinit_single (machine_encoder_obj_t * self ) {
423
- if (self -> irq -> handler ) {
424
- DisableIRQ (enc_irqn [self -> id + 1 ]);
425
- ENC_DisableInterrupts (self -> instance , ENCODER_ALL_INTERRUPTS );
426
- }
427
- if (self -> match_pin != 0 ) {
428
- // Disconnect the XBAR from the output by switching it to an input.
429
- IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER &= ~(1 << (self -> match_pin + XBAR_ENC_DIR_OFFSET ));
499
+ if (self -> active ) {
500
+ if (self -> irq && self -> irq -> handler ) {
501
+ DisableIRQ (enc_irqn [self -> id + 1 ]);
502
+ ENC_DisableInterrupts (self -> instance , ENCODER_ALL_INTERRUPTS );
503
+ }
504
+ if (self -> match_pin != 0 ) {
505
+ // Disconnect the XBAR from the output by switching it to an input.
506
+ #if defined MIMXRT117x_SERIES
507
+ if (self -> match_pin < XBAR_ENC_DIR_OFFSET_2 ) {
508
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER_1 &= ~(1 << (self -> match_pin - XBAR_ENC_DIR_OFFSET_1 ));
509
+ } else {
510
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER_2 &= ~(1 << (self -> match_pin - XBAR_ENC_DIR_OFFSET_2 ));
511
+ }
512
+ #else
513
+ IOMUXC_GPR -> XBAR_ENC_DIR_REGISTER &= ~(1 << (self -> match_pin + XBAR_ENC_DIR_OFFSET ));
514
+ #endif
515
+ }
516
+ ENC_Deinit (self -> instance );
430
517
}
431
- ENC_Deinit ( self -> instance ) ;
518
+ self -> active = false ;
432
519
}
433
520
434
521
// encoder_deinit_all()
@@ -458,6 +545,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_encoder_status_obj, machine_encoder_sta
458
545
// encoder.value([value])
459
546
STATIC mp_obj_t machine_encoder_value (size_t n_args , const mp_obj_t * args ) {
460
547
machine_encoder_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
548
+ if (!self -> active ) {
549
+ mp_raise_ValueError (MP_ERROR_TEXT ("device stopped" ));
550
+ }
461
551
uint32_t actual_value = ENC_GetPositionValue (self -> instance );
462
552
if (n_args > 1 ) {
463
553
// Set the encoder position value and clear the rev counter.
@@ -481,6 +571,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_encoder_value_obj, 1, 2, mach
481
571
// encoder.cycles([value])
482
572
STATIC mp_obj_t machine_encoder_cycles (size_t n_args , const mp_obj_t * args ) {
483
573
machine_encoder_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
574
+ if (!self -> active ) {
575
+ mp_raise_ValueError (MP_ERROR_TEXT ("device stopped" ));
576
+ }
577
+
484
578
int16_t cycles = (int16_t )ENC_GetRevolutionValue (self -> instance );
485
579
if (n_args > 1 ) {
486
580
// Set the revolution value
@@ -502,6 +596,9 @@ STATIC mp_obj_t machine_encoder_irq(size_t n_args, const mp_obj_t *pos_args, mp_
502
596
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
503
597
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
504
598
machine_encoder_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
599
+ if (!self -> active ) {
600
+ mp_raise_ValueError (MP_ERROR_TEXT ("device stopped" ));
601
+ }
505
602
506
603
if (self -> irq == NULL ) {
507
604
self -> irq = m_new_obj (mp_irq_obj_t );
0 commit comments