Skip to content

Commit c9ac8e7

Browse files
authored
Merge pull request micropython#5042 from NathanY3G/add-support-for-jmp-pin
Added support for specifying the JMP pin (RP2 PIO)
2 parents e790ff7 + 3b7cf7d commit c9ac8e7

File tree

12 files changed

+26
-3
lines changed

12 files changed

+26
-3
lines changed

locale/circuitpython.pot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,7 @@ msgstr ""
11871187

11881188
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
11891189
#, c-format
1190-
msgid "Instruction %d jumps on pin"
1190+
msgid "Missing jmp_pin. Instruction %d jumps on pin"
11911191
msgstr ""
11921192

11931193
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c

ports/raspberrypi/bindings/rp2pio/StateMachine.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
//| :param int sideset_pin_count: the count of consecutive pins to use with a side set starting at first_sideset_pin
110110
//| :param int initial_sideset_pin_state: the initial output value for sideset pins starting at first_sideset_pin
111111
//| :param int initial_sideset_pin_direction: the initial output direction for sideset pins starting at first_sideset_pin
112+
//| :param ~microcontroller.Pin jmp_pin: the pin which determines the branch taken by JMP PIN instructions
112113
//| :param bool exclusive_pin_use: When True, do not share any pins with other state machines. Pins are never shared with other peripherals
113114
//| :param bool auto_pull: When True, automatically load data from the tx FIFO into the
114115
//| output shift register (OSR) when an OUT instruction shifts more than pull_threshold bits
@@ -138,6 +139,7 @@ STATIC mp_obj_t rp2pio_statemachine_make_new(const mp_obj_type_t *type, size_t n
138139
ARG_pull_in_pin_up, ARG_pull_in_pin_down,
139140
ARG_first_set_pin, ARG_set_pin_count, ARG_initial_set_pin_state, ARG_initial_set_pin_direction,
140141
ARG_first_sideset_pin, ARG_sideset_pin_count, ARG_initial_sideset_pin_state, ARG_initial_sideset_pin_direction,
142+
ARG_jmp_pin,
141143
ARG_exclusive_pin_use,
142144
ARG_auto_pull, ARG_pull_threshold, ARG_out_shift_right,
143145
ARG_wait_for_txstall,
@@ -167,6 +169,8 @@ STATIC mp_obj_t rp2pio_statemachine_make_new(const mp_obj_type_t *type, size_t n
167169
{ MP_QSTR_initial_sideset_pin_state, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
168170
{ MP_QSTR_initial_sideset_pin_direction, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0x1f} },
169171

172+
{ MP_QSTR_jmp_pin, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
173+
170174
{ MP_QSTR_exclusive_pin_use, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
171175
{ MP_QSTR_auto_pull, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
172176
{ MP_QSTR_pull_threshold, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 32} },
@@ -210,6 +214,8 @@ STATIC mp_obj_t rp2pio_statemachine_make_new(const mp_obj_type_t *type, size_t n
210214
mp_raise_ValueError(translate("Side set pin count must be between 1 and 5"));
211215
}
212216

217+
const mcu_pin_obj_t *jmp_pin = validate_obj_is_pin_or_none(args[ARG_jmp_pin].u_obj);
218+
213219
mp_int_t pull_threshold = args[ARG_pull_threshold].u_int;
214220
mp_int_t push_threshold = args[ARG_push_threshold].u_int;
215221
if (pull_threshold < 1 || pull_threshold > 32) {
@@ -241,6 +247,7 @@ STATIC mp_obj_t rp2pio_statemachine_make_new(const mp_obj_type_t *type, size_t n
241247
first_in_pin, args[ARG_in_pin_count].u_int, args[ARG_pull_in_pin_up].u_int, args[ARG_pull_in_pin_down].u_int,
242248
first_set_pin, args[ARG_set_pin_count].u_int, args[ARG_initial_set_pin_state].u_int, args[ARG_initial_set_pin_direction].u_int,
243249
first_sideset_pin, args[ARG_sideset_pin_count].u_int, args[ARG_initial_sideset_pin_state].u_int, args[ARG_initial_sideset_pin_direction].u_int,
250+
jmp_pin,
244251
0,
245252
args[ARG_exclusive_pin_use].u_bool,
246253
args[ARG_auto_pull].u_bool, pull_threshold, args[ARG_out_shift_right].u_bool,

ports/raspberrypi/bindings/rp2pio/StateMachine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
4444
const mcu_pin_obj_t *first_in_pin, uint8_t in_pin_count, uint32_t pull_pin_up, uint32_t pull_pin_down,
4545
const mcu_pin_obj_t *first_set_pin, uint8_t set_pin_count, uint32_t initial_set_pin_state, uint32_t initial_set_pin_direction,
4646
const mcu_pin_obj_t *first_sideset_pin, uint8_t sideset_pin_count, uint32_t initial_sideset_pin_state, uint32_t initial_sideset_pin_direction,
47+
const mcu_pin_obj_t *jmp_pin,
4748
uint32_t wait_gpio_mask,
4849
bool exclusive_pin_use,
4950
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,

ports/raspberrypi/common-hal/audiobusio/I2SOut.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ void common_hal_audiobusio_i2sout_construct(audiobusio_i2sout_obj_t *self,
126126
0, 0, // in pulls
127127
NULL, 0, 0, 0x1f, // set pins
128128
bit_clock, 2, 0, 0x1f, // sideset pins
129+
NULL, // jump pin
129130
0, // wait gpio pins
130131
true, // exclusive pin use
131132
false, 32, false, // shift out left to start with MSB

ports/raspberrypi/common-hal/audiobusio/PDMIn.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t *self,
7171
0, 0, // in pulls
7272
NULL, 0, 0, 0x1f, // set pins
7373
clock_pin, 1, 0, 0x1f, // sideset pins
74+
NULL, // jump pin
7475
0, // wait gpio pins
7576
true, // exclusive pin use
7677
false, 32, false, // out settings

ports/raspberrypi/common-hal/displayio/ParallelBus.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *sel
9999
NULL, 0, 0, 0, // first in pin, # in pins
100100
NULL, 0, 0, 0, // first set pin
101101
write, 1, 0, 1, // first sideset pin
102+
NULL, // jump pin
102103
0, // wait gpio pins
103104
true, // exclusive pin usage
104105
true, 8, true, // TX, auto pull every 8 bits. shift left to output msb first

ports/raspberrypi/common-hal/imagecapture/ParallelImageCapture.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ void common_hal_imagecapture_parallelimagecapture_construct(imagecapture_paralle
111111
#else
112112
NULL, 0, 0, 0, // sideset pins
113113
#endif
114+
NULL, // jump pin
114115
(1 << vertical_sync->number) | (1 << horizontal_reference->number) | (1 << data_clock->number), // wait gpio pins
115116
true, // exclusive pin use
116117
false, 32, false, // out settings

ports/raspberrypi/common-hal/neopixel_write/__init__.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t *digitalinout,
7171
NULL, 1, // set
7272
digitalinout->pin, 1, // sideset
7373
0, pins_we_use, // initial pin state
74+
NULL, // jump pin
7475
pins_we_use, true, false,
7576
true, 8, false, // TX, auto pull every 8 bits. shift left to output msb first
7677
true, // Wait for txstall. If we don't, then we'll deinit too quickly.

ports/raspberrypi/common-hal/pulseio/PulseIn.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self,
6767
NULL, 0,
6868
NULL, 0,
6969
1, 0,
70+
NULL, // jump pin
7071
1 << self->pin, false, true,
7172
false, 8, false, // TX, unused
7273
false,

ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode
8484
3, 0, // in pulls
8585
NULL, 0, 0, 0x1f, // set pins
8686
NULL, 0, 0, 0x1f, // sideset pins
87+
NULL, // jump pin
8788
0, // wait gpio pins
8889
true, // exclusive pin use
8990
false, 32, false, // out settings

ports/raspberrypi/common-hal/rp2pio/StateMachine.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
158158
const mcu_pin_obj_t *first_set_pin, uint8_t set_pin_count,
159159
const mcu_pin_obj_t *first_sideset_pin, uint8_t sideset_pin_count,
160160
uint32_t initial_pin_state, uint32_t initial_pin_direction,
161+
const mcu_pin_obj_t *jmp_pin,
161162
uint32_t pins_we_use, bool tx_fifo, bool rx_fifo,
162163
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
163164
bool wait_for_txstall,
@@ -278,6 +279,9 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
278279
sm_config_set_sideset(&c, sideset_pin_count, false /* optional */, false /* pin direction */);
279280
sm_config_set_sideset_pins(&c, first_sideset_pin->number);
280281
}
282+
if (jmp_pin != NULL) {
283+
sm_config_set_jmp_pin(&c, jmp_pin->number);
284+
}
281285
sm_config_set_wrap(&c, program_offset, program_offset + program_len - 1);
282286
sm_config_set_in_shift(&c, in_shift_right, auto_push, push_threshold);
283287
sm_config_set_out_shift(&c, out_shift_right, auto_pull, pull_threshold);
@@ -329,6 +333,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
329333
uint32_t pull_pin_up, uint32_t pull_pin_down,
330334
const mcu_pin_obj_t *first_set_pin, uint8_t set_pin_count, uint32_t initial_set_pin_state, uint32_t initial_set_pin_direction,
331335
const mcu_pin_obj_t *first_sideset_pin, uint8_t sideset_pin_count, uint32_t initial_sideset_pin_state, uint32_t initial_sideset_pin_direction,
336+
const mcu_pin_obj_t *jmp_pin,
332337
uint32_t wait_gpio_mask,
333338
bool exclusive_pin_use,
334339
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
@@ -341,6 +346,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
341346
pins_we_use |= _check_pins_free(first_in_pin, in_pin_count, exclusive_pin_use);
342347
pins_we_use |= _check_pins_free(first_set_pin, set_pin_count, exclusive_pin_use);
343348
pins_we_use |= _check_pins_free(first_sideset_pin, sideset_pin_count, exclusive_pin_use);
349+
pins_we_use |= _check_pins_free(jmp_pin, 1, exclusive_pin_use);
344350

345351
// Look through the program to see what we reference and make sure it was provided.
346352
bool tx_fifo = false;
@@ -363,8 +369,8 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
363369
}
364370
if (instruction == pio_instr_bits_jmp) {
365371
uint16_t condition = (full_instruction & 0x00e0) >> 5;
366-
if (condition == 0x6) { // GPIO
367-
mp_raise_NotImplementedError_varg(translate("Instruction %d jumps on pin"), i);
372+
if ((condition == 0x6) && (jmp_pin == NULL)) {
373+
mp_raise_ValueError_varg(translate("Missing jmp_pin. Instruction %d jumps on pin"), i);
368374
}
369375
}
370376
if (instruction == pio_instr_bits_wait) {
@@ -486,6 +492,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
486492
first_set_pin, set_pin_count,
487493
first_sideset_pin, sideset_pin_count,
488494
initial_pin_state, initial_pin_direction,
495+
jmp_pin,
489496
pins_we_use, tx_fifo, rx_fifo,
490497
auto_pull, pull_threshold, out_shift_right,
491498
wait_for_txstall,

ports/raspberrypi/common-hal/rp2pio/StateMachine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
6868
const mcu_pin_obj_t *first_set_pin, uint8_t set_pin_count,
6969
const mcu_pin_obj_t *first_sideset_pin, uint8_t sideset_pin_count,
7070
uint32_t initial_pin_state, uint32_t initial_pin_direction,
71+
const mcu_pin_obj_t *jmp_pin,
7172
uint32_t pins_we_use, bool tx_fifo, bool rx_fifo,
7273
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
7374
bool wait_for_txstall,

0 commit comments

Comments
 (0)