Skip to content

Commit 1be5ca7

Browse files
authored
Merge pull request #4130 from gamblor21/rp_dp_parallel
Add RP2040 displayio.ParallelBus Support
2 parents 856bf30 + bdc3688 commit 1be5ca7

File tree

12 files changed

+133
-28
lines changed

12 files changed

+133
-28
lines changed

ports/atmel-samd/boards/pyportal/board.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ void board_init(void) {
6969
&pin_PB06, // Chip select
7070
&pin_PB09, // Write
7171
&pin_PB04, // Read
72-
&pin_PA00); // Reset
72+
&pin_PA00, // Reset
73+
0); // Frequency
7374

7475
displayio_display_obj_t *display = &displays[0].display;
7576
display->base.type = &displayio_display_type;

ports/atmel-samd/boards/pyportal_titano/board.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ void board_init(void) {
8686
&pin_PB06, // Chip select
8787
&pin_PB09, // Write
8888
&pin_PB04, // Read
89-
&pin_PA00); // Reset
89+
&pin_PA00, // Reset
90+
0); // Frequency
9091

9192
displayio_display_obj_t *display = &displays[0].display;
9293
display->base.type = &displayio_display_type;

ports/atmel-samd/common-hal/displayio/ParallelBus.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
#include "shared-bindings/digitalio/DigitalInOut.h"
3434
#include "shared-bindings/microcontroller/__init__.h"
3535

36-
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self,
37-
const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select,
38-
const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) {
36+
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
37+
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
38+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency) {
3939

4040
uint8_t data_pin = data0->number;
4141
if (data_pin % 8 != 0) {
@@ -55,7 +55,7 @@ void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* sel
5555
wrconfig |= 0xff << (data_pin % 32);
5656
}
5757
g->WRCONFIG.reg = wrconfig;
58-
self->bus = ((uint8_t*) &g->OUT.reg) + (data0->number % 32 / 8);
58+
self->bus = ((uint8_t *)&g->OUT.reg) + (data0->number % 32 / 8);
5959

6060
self->command.base.type = &digitalio_digitalinout_type;
6161
common_hal_digitalio_digitalinout_construct(&self->command, command);
@@ -95,7 +95,7 @@ void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* sel
9595
}
9696
}
9797

98-
void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self) {
98+
void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t *self) {
9999
for (uint8_t i = 0; i < 8; i++) {
100100
reset_pin_number(self->data0_pin + i);
101101
}
@@ -108,7 +108,7 @@ void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self)
108108
}
109109

110110
bool common_hal_displayio_parallelbus_reset(mp_obj_t obj) {
111-
displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj);
111+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
112112
if (self->reset.base.type == &mp_type_NoneType) {
113113
return false;
114114
}
@@ -124,17 +124,17 @@ bool common_hal_displayio_parallelbus_bus_free(mp_obj_t obj) {
124124
}
125125

126126
bool common_hal_displayio_parallelbus_begin_transaction(mp_obj_t obj) {
127-
displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj);
127+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
128128
common_hal_digitalio_digitalinout_set_value(&self->chip_select, false);
129129
return true;
130130
}
131131

132132
void common_hal_displayio_parallelbus_send(mp_obj_t obj, display_byte_type_t byte_type,
133133
display_chip_select_behavior_t chip_select, const uint8_t *data, uint32_t data_length) {
134-
displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj);
134+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
135135
common_hal_digitalio_digitalinout_set_value(&self->command, byte_type == DISPLAY_DATA);
136-
uint32_t* clear_write = (uint32_t*) &self->write_group->OUTCLR.reg;
137-
uint32_t* set_write = (uint32_t*) &self->write_group->OUTSET.reg;
136+
uint32_t *clear_write = (uint32_t *)&self->write_group->OUTCLR.reg;
137+
uint32_t *set_write = (uint32_t *)&self->write_group->OUTSET.reg;
138138
uint32_t mask = self->write_mask;
139139
for (uint32_t i = 0; i < data_length; i++) {
140140
*clear_write = mask;
@@ -144,6 +144,6 @@ void common_hal_displayio_parallelbus_send(mp_obj_t obj, display_byte_type_t byt
144144
}
145145

146146
void common_hal_displayio_parallelbus_end_transaction(mp_obj_t obj) {
147-
displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj);
147+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
148148
common_hal_digitalio_digitalinout_set_value(&self->chip_select, true);
149149
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
4242
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
43-
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset) {
43+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency) {
4444

4545
uint8_t data_pin = data0->number;
4646
if (data_pin % 8 != 0) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
3737
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
38-
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset) {
38+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency) {
3939

4040
mp_raise_NotImplementedError(translate("ParallelBus not yet supported"));
4141
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
3737
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
38-
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset) {
38+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency) {
3939

4040
uint8_t data_pin = data0->number;
4141
if (data_pin % 8 != 0) {

ports/raspberrypi/bindings/rp2pio/StateMachine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
5252
void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self);
5353
bool common_hal_rp2pio_statemachine_deinited(rp2pio_statemachine_obj_t *self);
5454

55+
void common_hal_rp2pio_statemachine_never_reset(rp2pio_statemachine_obj_t *self);
56+
5557
void common_hal_rp2pio_statemachine_restart(rp2pio_statemachine_obj_t *self);
5658
void common_hal_rp2pio_statemachine_stop(rp2pio_statemachine_obj_t *self);
5759
void common_hal_rp2pio_statemachine_run(rp2pio_statemachine_obj_t *self, const uint16_t *instructions, size_t len);

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

Lines changed: 99 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,37 +32,128 @@
3232
#include "py/runtime.h"
3333
#include "shared-bindings/digitalio/DigitalInOut.h"
3434
#include "shared-bindings/microcontroller/__init__.h"
35+
#include "bindings/rp2pio/StateMachine.h"
36+
#include "common-hal/rp2pio/StateMachine.h"
37+
38+
static const uint16_t parallel_program[] = {
39+
// .side_set 1
40+
// .wrap_target
41+
0x6008, // out pins, 8 side 0
42+
0xB042 // nop side 1
43+
// .wrap
44+
};
3545

3646
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
3747
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
38-
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset) {
48+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency) {
49+
50+
uint8_t data_pin = data0->number;
51+
for (uint8_t i = 0; i < 8; i++) {
52+
if (!pin_number_is_free(data_pin + i)) {
53+
mp_raise_ValueError_varg(translate("Bus pin %d is already in use"), i);
54+
}
55+
}
56+
57+
uint8_t write_pin = write->number;
58+
if (!pin_number_is_free(write_pin)) {
59+
mp_raise_ValueError_varg(translate("Bus pin %d is already in use"), write_pin);
60+
}
61+
62+
self->command.base.type = &digitalio_digitalinout_type;
63+
common_hal_digitalio_digitalinout_construct(&self->command, command);
64+
common_hal_digitalio_digitalinout_switch_to_output(&self->command, true, DRIVE_MODE_PUSH_PULL);
65+
66+
self->chip_select.base.type = &digitalio_digitalinout_type;
67+
common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select);
68+
common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL);
69+
70+
self->read.base.type = &digitalio_digitalinout_type;
71+
common_hal_digitalio_digitalinout_construct(&self->read, read);
72+
common_hal_digitalio_digitalinout_switch_to_output(&self->read, true, DRIVE_MODE_PUSH_PULL);
73+
74+
self->data0_pin = data_pin;
75+
self->write = write_pin;
76+
77+
self->reset.base.type = &mp_type_NoneType;
78+
if (reset != NULL) {
79+
self->reset.base.type = &digitalio_digitalinout_type;
80+
common_hal_digitalio_digitalinout_construct(&self->reset, reset);
81+
common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL);
82+
never_reset_pin_number(reset->number);
83+
common_hal_displayio_parallelbus_reset(self);
84+
}
3985

40-
mp_raise_NotImplementedError(translate("ParallelBus not yet supported"));
41-
// TODO: Implement with PIO and DMA.
86+
never_reset_pin_number(command->number);
87+
never_reset_pin_number(chip_select->number);
88+
never_reset_pin_number(write_pin);
89+
never_reset_pin_number(read->number);
90+
for (uint8_t i = 0; i < 8; i++) {
91+
never_reset_pin_number(data_pin + i);
92+
}
93+
94+
common_hal_rp2pio_statemachine_construct(&self->state_machine,
95+
parallel_program, sizeof(parallel_program) / sizeof(parallel_program[0]),
96+
frequency * 2, // frequency multiplied by 2 as 2 PIO instructions
97+
NULL, 0, // init
98+
data0, 8, 0, 255, // first out pin, # out pins
99+
NULL, 0, 0, 0, // first in pin, # in pins
100+
NULL, 0, 0, 0, // first set pin
101+
write, 1, 0, 1, // first sideset pin
102+
true, // exclusive pin usage
103+
true, 8, true, // TX, auto pull every 8 bits. shift left to output msb first
104+
false, // wait for TX stall
105+
false, 32, true // RX setting we don't use
106+
);
107+
108+
common_hal_rp2pio_statemachine_never_reset(&self->state_machine);
42109
}
43110

44111
void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t *self) {
112+
common_hal_rp2pio_statemachine_deinit(&self->state_machine);
45113

114+
for (uint8_t i = 0; i < 8; i++) {
115+
reset_pin_number(self->data0_pin + i);
116+
}
117+
118+
reset_pin_number(self->command.pin->number);
119+
reset_pin_number(self->chip_select.pin->number);
120+
reset_pin_number(self->write);
121+
reset_pin_number(self->read.pin->number);
122+
reset_pin_number(self->reset.pin->number);
46123
}
47124

48125
bool common_hal_displayio_parallelbus_reset(mp_obj_t obj) {
49-
return false;
126+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
127+
if (self->reset.base.type == &mp_type_NoneType) {
128+
return false;
129+
}
130+
131+
common_hal_digitalio_digitalinout_set_value(&self->reset, false);
132+
common_hal_mcu_delay_us(4);
133+
common_hal_digitalio_digitalinout_set_value(&self->reset, true);
134+
return true;
50135
}
51136

52137
bool common_hal_displayio_parallelbus_bus_free(mp_obj_t obj) {
53-
return false;
138+
return true;
54139
}
55140

56141
bool common_hal_displayio_parallelbus_begin_transaction(mp_obj_t obj) {
57-
58-
return false;
142+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
143+
common_hal_digitalio_digitalinout_set_value(&self->chip_select, false);
144+
return true;
59145
}
60146

61147
void common_hal_displayio_parallelbus_send(mp_obj_t obj, display_byte_type_t byte_type,
62148
display_chip_select_behavior_t chip_select, const uint8_t *data, uint32_t data_length) {
63149

150+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
151+
152+
common_hal_digitalio_digitalinout_set_value(&self->command, byte_type == DISPLAY_DATA);
153+
common_hal_rp2pio_statemachine_write(&self->state_machine, data, data_length, 1);
64154
}
65155

66156
void common_hal_displayio_parallelbus_end_transaction(mp_obj_t obj) {
67-
157+
displayio_parallelbus_obj_t *self = MP_OBJ_TO_PTR(obj);
158+
common_hal_digitalio_digitalinout_set_value(&self->chip_select, true);
68159
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,18 @@
2828
#define MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_DISPLAYIO_PARALLELBUS_H
2929

3030
#include "common-hal/digitalio/DigitalInOut.h"
31+
#include "bindings/rp2pio/StateMachine.h"
32+
#include "common-hal/rp2pio/StateMachine.h"
3133

3234
typedef struct {
3335
mp_obj_base_t base;
36+
digitalio_digitalinout_obj_t command;
37+
digitalio_digitalinout_obj_t chip_select;
38+
digitalio_digitalinout_obj_t reset;
39+
digitalio_digitalinout_obj_t read;
40+
uint8_t write;
41+
uint8_t data0_pin;
42+
rp2pio_statemachine_obj_t state_machine;
3443
} displayio_parallelbus_obj_t;
3544

3645
#endif // MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_DISPLAYIO_PARALLELBUS_H

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
3737
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
38-
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset) {
38+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency) {
3939

4040
mp_raise_NotImplementedError(translate("ParallelBus not yet supported"));
4141
}

shared-bindings/displayio/ParallelBus.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,15 @@
6060
//| ...
6161
//|
6262
STATIC mp_obj_t displayio_parallelbus_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
63-
enum { ARG_data0, ARG_command, ARG_chip_select, ARG_write, ARG_read, ARG_reset };
63+
enum { ARG_data0, ARG_command, ARG_chip_select, ARG_write, ARG_read, ARG_reset, ARG_frequency };
6464
static const mp_arg_t allowed_args[] = {
6565
{ MP_QSTR_data0, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
6666
{ MP_QSTR_command, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
6767
{ MP_QSTR_chip_select, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
6868
{ MP_QSTR_write, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
6969
{ MP_QSTR_read, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
7070
{ MP_QSTR_reset, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
71+
{ MP_QSTR_frequency, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 30000000 } },
7172
};
7273
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
7374
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@@ -82,7 +83,7 @@ STATIC mp_obj_t displayio_parallelbus_make_new(const mp_obj_type_t *type, size_t
8283
displayio_parallelbus_obj_t *self = &allocate_display_bus_or_raise()->parallel_bus;
8384
self->base.type = &displayio_parallelbus_type;
8485

85-
common_hal_displayio_parallelbus_construct(self, data0, command, chip_select, write, read, reset);
86+
common_hal_displayio_parallelbus_construct(self, data0, command, chip_select, write, read, reset, args[ARG_frequency].u_int);
8687
return self;
8788
}
8889

shared-bindings/displayio/ParallelBus.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ extern const mp_obj_type_t displayio_parallelbus_type;
3737

3838
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t *self,
3939
const mcu_pin_obj_t *data0, const mcu_pin_obj_t *command, const mcu_pin_obj_t *chip_select,
40-
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset);
40+
const mcu_pin_obj_t *write, const mcu_pin_obj_t *read, const mcu_pin_obj_t *reset, uint32_t frequency);
4141

4242
void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t *self);
4343

0 commit comments

Comments
 (0)