Skip to content

Commit 46722ba

Browse files
committed
sharpdisplay: Prevent 'ValueError: <pin> in use' exception
.. when constructing the SPI bus again after reset. Testing performed: on nRF52840, that these sequences would work repeatedly when soft-resetting in between invocations: ``` import displayio, board, sharpdisplay displayio.release_displays() bus = board.SPI() framebuffer = sharpdisplay.SharpMemoryFramebuffer(bus, board.D2, 400, 240) ``` and ``` import displayio, board, sharpdisplay, busio displayio.release_displays() bus = busio.SPI(board.SCK, MOSI=board.MOSI) framebuffer = sharpdisplay.SharpMemoryFramebuffer(bus, board.D2, 400, 240) ``` .. and that an actual demo would work across soft resets as well. This feels a bit ad-hoc. Better would be to make "never reset bus" be a counted thing and add some "un-never-resets" in the right spots. An area for future improvement.
1 parent a28d0f6 commit 46722ba

File tree

5 files changed

+19
-7
lines changed

5 files changed

+19
-7
lines changed

shared-bindings/sharpdisplay/SharpMemoryFramebuffer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ STATIC mp_int_t sharpdisplay_framebuffer_get_buffer(mp_obj_t self_in, mp_buffer_
7171

7272
STATIC mp_obj_t sharpdisplay_framebuffer_deinit(mp_obj_t self_in) {
7373
sharpdisplay_framebuffer_obj_t *self = (sharpdisplay_framebuffer_obj_t*)self_in;
74-
common_hal_sharpdisplay_framebuffer_deinit(self);
74+
common_hal_sharpdisplay_framebuffer_deinit(self, false);
7575

7676
return mp_const_none;
7777
}

shared-module/board/__init__.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
#include "shared-module/displayio/__init__.h"
4040
#endif
4141

42+
#if CIRCUITPY_SHARPDISPLAY
43+
#include "shared-bindings/sharpdisplay/SharpMemoryFramebuffer.h"
44+
#include "shared-module/sharpdisplay/SharpMemoryFramebuffer.h"
45+
#endif
46+
4247
#if BOARD_I2C
4348
// Statically allocate the I2C object so it can live past the end of the heap and into the next VM.
4449
// That way it can be used by built-in I2CDisplay displays and be accessible through board.I2C().
@@ -152,9 +157,16 @@ void reset_board_busses(void) {
152157
display_using_spi = true;
153158
break;
154159
}
160+
#if CIRCUITPY_SHARPDISPLAY
161+
if (displays[i].sharpdisplay.bus == spi_singleton) {
162+
display_using_spi = true;
163+
break;
164+
}
165+
#endif
155166
}
156167
#endif
157168
if (!display_using_spi) {
169+
common_hal_busio_spi_deinit(spi_singleton);
158170
spi_singleton = NULL;
159171
}
160172
#endif

shared-module/displayio/__init__.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ void common_hal_displayio_release_displays(void) {
113113
#endif
114114
#if CIRCUITPY_SHARPDISPLAY
115115
} else if (displays[i].bus_base.type == &sharpdisplay_framebuffer_type) {
116-
common_hal_sharpdisplay_framebuffer_deinit(&displays[i].sharpdisplay);
116+
common_hal_sharpdisplay_framebuffer_deinit(&displays[i].sharpdisplay, false);
117117
#endif
118118
}
119119
displays[i].fourwire_bus.base.type = &mp_type_NoneType;
@@ -189,7 +189,7 @@ void reset_displays(void) {
189189
if(any_display_uses_this_framebuffer(&sharp->base)) {
190190
common_hal_sharpdisplay_framebuffer_reset(sharp);
191191
} else {
192-
common_hal_sharpdisplay_framebuffer_deinit(sharp);
192+
common_hal_sharpdisplay_framebuffer_deinit(sharp, true);
193193
}
194194
#endif
195195
} else {

shared-module/sharpdisplay/SharpMemoryFramebuffer.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@ void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_ob
127127
*bufinfo = self->bufinfo;
128128
}
129129

130-
void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *self) {
130+
void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *self, bool from_reset) {
131131
if (self->base.type != &sharpdisplay_framebuffer_type) {
132132
return;
133133
}
134134

135-
if (self->bus == &self->inline_bus) {
135+
if (from_reset || self->bus == &self->inline_bus) {
136136
common_hal_busio_spi_deinit(self->bus);
137137
}
138138

@@ -208,7 +208,7 @@ void common_hal_sharpdisplay_framebuffer_swapbuffers(sharpdisplay_framebuffer_ob
208208

209209
STATIC void sharpdisplay_framebuffer_deinit(mp_obj_t self_in) {
210210
sharpdisplay_framebuffer_obj_t *self = self_in;
211-
common_hal_sharpdisplay_framebuffer_deinit(self);
211+
common_hal_sharpdisplay_framebuffer_deinit(self, false);
212212
}
213213

214214
STATIC void sharpdisplay_framebuffer_get_bufinfo(mp_obj_t self_in, mp_buffer_info_t *bufinfo) {

shared-module/sharpdisplay/SharpMemoryFramebuffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef struct {
4747

4848
void common_hal_sharpdisplay_framebuffer_construct(sharpdisplay_framebuffer_obj_t *self, busio_spi_obj_t *spi, mcu_pin_obj_t *chip_select, int baudrate, int width, int height);
4949
void common_hal_sharpdisplay_framebuffer_swap_buffers(sharpdisplay_framebuffer_obj_t *self, uint8_t *dirty_row_bitmask);
50-
void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *self);
50+
void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *self, bool from_reset);
5151
void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_obj_t *self, mp_buffer_info_t *bufinfo);
5252
int common_hal_sharpdisplay_framebuffer_get_height(sharpdisplay_framebuffer_obj_t *self);
5353
int common_hal_sharpdisplay_framebuffer_get_width(sharpdisplay_framebuffer_obj_t *self);

0 commit comments

Comments
 (0)