Skip to content

Commit 3a98de1

Browse files
committed
Add reset() to display busses to detect whether it works
1 parent 24b3096 commit 3a98de1

File tree

11 files changed

+75
-9
lines changed

11 files changed

+75
-9
lines changed

ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ EXTERNAL_FLASH_DEVICE_COUNT = 2
1212
EXTERNAL_FLASH_DEVICES = "W25Q16FW, GD25Q16C"
1313
LONGINT_IMPL = MPZ
1414

15+
CIRCUITPY_I2CSLAVE = 0
16+
CIRCUITPY_RTC = 0
17+
1518
CFLAGS_INLINE_LIMIT = 60
1619
SUPEROPT_GC = 0
1720

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* sel
7979
self->write_group = &PORT->Group[write->number / 32];
8080
self->write_mask = 1 << (write->number % 32);
8181

82+
self->reset.base.type = &mp_type_NoneType;
8283
if (reset != NULL) {
8384
self->reset.base.type = &digitalio_digitalinout_type;
8485
common_hal_digitalio_digitalinout_construct(&self->reset, reset);
@@ -108,12 +109,16 @@ void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self)
108109
reset_pin_number(self->reset.pin->number);
109110
}
110111

111-
void common_hal_displayio_parallelbus_reset(mp_obj_t obj) {
112+
bool common_hal_displayio_parallelbus_reset(mp_obj_t obj) {
112113
displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj);
114+
if (self->reset.base.type == &mp_type_NoneType) {
115+
return false;
116+
}
113117

114118
common_hal_digitalio_digitalinout_set_value(&self->reset, false);
115119
common_hal_mcu_delay_us(4);
116120
common_hal_digitalio_digitalinout_set_value(&self->reset, true);
121+
return true;
117122
}
118123

119124
bool common_hal_displayio_parallelbus_bus_free(mp_obj_t obj) {

shared-bindings/displayio/FourWire.c

+16
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,21 @@ STATIC mp_obj_t displayio_fourwire_make_new(const mp_obj_type_t *type, size_t n_
103103
return self;
104104
}
105105

106+
//| .. method:: reset()
107+
//|
108+
//| Performs a hardware reset via the reset pin. Raises an exception if called when no reset pin
109+
//| is available.
110+
//|
111+
STATIC mp_obj_t displayio_fourwire_obj_reset(mp_obj_t self_in) {
112+
displayio_fourwire_obj_t *self = self_in;
113+
114+
if (!common_hal_displayio_fourwire_reset(self)) {
115+
mp_raise_RuntimeError(translate("no reset pin available"));
116+
}
117+
return mp_const_none;
118+
}
119+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_fourwire_reset_obj, displayio_fourwire_obj_reset);
120+
106121
//| .. method:: send(command, data, *, toggle_every_byte=False)
107122
//|
108123
//| Sends the given command value followed by the full set of data. Display state, such as
@@ -140,6 +155,7 @@ STATIC mp_obj_t displayio_fourwire_obj_send(size_t n_args, const mp_obj_t *pos_a
140155
MP_DEFINE_CONST_FUN_OBJ_KW(displayio_fourwire_send_obj, 3, displayio_fourwire_obj_send);
141156

142157
STATIC const mp_rom_map_elem_t displayio_fourwire_locals_dict_table[] = {
158+
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&displayio_fourwire_reset_obj) },
143159
{ MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&displayio_fourwire_send_obj) },
144160
};
145161
STATIC MP_DEFINE_CONST_DICT(displayio_fourwire_locals_dict, displayio_fourwire_locals_dict_table);

shared-bindings/displayio/FourWire.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void common_hal_displayio_fourwire_construct(displayio_fourwire_obj_t* self,
4040

4141
void common_hal_displayio_fourwire_deinit(displayio_fourwire_obj_t* self);
4242

43-
void common_hal_displayio_fourwire_reset(mp_obj_t self);
43+
bool common_hal_displayio_fourwire_reset(mp_obj_t self);
4444
bool common_hal_displayio_fourwire_bus_free(mp_obj_t self);
4545

4646
bool common_hal_displayio_fourwire_begin_transaction(mp_obj_t self);

shared-bindings/displayio/I2CDisplay.c

+16
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,21 @@ STATIC mp_obj_t displayio_i2cdisplay_make_new(const mp_obj_type_t *type, size_t
9595
return self;
9696
}
9797

98+
//| .. method:: reset()
99+
//|
100+
//| Performs a hardware reset via the reset pin. Raises an exception if called when no reset pin
101+
//| is available.
102+
//|
103+
STATIC mp_obj_t displayio_i2cdisplay_obj_reset(mp_obj_t self_in) {
104+
displayio_i2cdisplay_obj_t *self = self_in;
105+
106+
if (!common_hal_displayio_i2cdisplay_reset(self)) {
107+
mp_raise_RuntimeError(translate("no reset pin available"));
108+
}
109+
return mp_const_none;
110+
}
111+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_i2cdisplay_reset_obj, displayio_i2cdisplay_obj_reset);
112+
98113
//| .. method:: send(command, data)
99114
//|
100115
//| Sends the given command value followed by the full set of data. Display state, such as
@@ -124,6 +139,7 @@ STATIC mp_obj_t displayio_i2cdisplay_obj_send(mp_obj_t self, mp_obj_t command_ob
124139
MP_DEFINE_CONST_FUN_OBJ_3(displayio_i2cdisplay_send_obj, displayio_i2cdisplay_obj_send);
125140

126141
STATIC const mp_rom_map_elem_t displayio_i2cdisplay_locals_dict_table[] = {
142+
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&displayio_i2cdisplay_reset_obj) },
127143
{ MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&displayio_i2cdisplay_send_obj) },
128144
};
129145
STATIC MP_DEFINE_CONST_DICT(displayio_i2cdisplay_locals_dict, displayio_i2cdisplay_locals_dict_table);

shared-bindings/displayio/I2CDisplay.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void common_hal_displayio_i2cdisplay_construct(displayio_i2cdisplay_obj_t* self,
3737

3838
void common_hal_displayio_i2cdisplay_deinit(displayio_i2cdisplay_obj_t* self);
3939

40-
void common_hal_displayio_i2cdisplay_reset(mp_obj_t self);
40+
bool common_hal_displayio_i2cdisplay_reset(mp_obj_t self);
4141
bool common_hal_displayio_i2cdisplay_bus_free(mp_obj_t self);
4242

4343
bool common_hal_displayio_i2cdisplay_begin_transaction(mp_obj_t self);

shared-bindings/displayio/ParallelBus.c

+16
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,21 @@ STATIC mp_obj_t displayio_parallelbus_make_new(const mp_obj_type_t *type, size_t
106106
return self;
107107
}
108108

109+
//| .. method:: reset()
110+
//|
111+
//| Performs a hardware reset via the reset pin. Raises an exception if called when no reset pin
112+
//| is available.
113+
//|
114+
STATIC mp_obj_t displayio_parallelbus_obj_reset(mp_obj_t self_in) {
115+
displayio_parallelbus_obj_t *self = self_in;
116+
117+
if (!common_hal_displayio_parallelbus_reset(self)) {
118+
mp_raise_RuntimeError(translate("no reset pin available"));
119+
}
120+
return mp_const_none;
121+
}
122+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_parallelbus_reset_obj, displayio_parallelbus_obj_reset);
123+
109124
//| .. method:: send(command, data)
110125
//|
111126
//| Sends the given command value followed by the full set of data. Display state, such as
@@ -133,6 +148,7 @@ STATIC mp_obj_t displayio_parallelbus_obj_send(mp_obj_t self, mp_obj_t command_o
133148
MP_DEFINE_CONST_FUN_OBJ_3(displayio_parallelbus_send_obj, displayio_parallelbus_obj_send);
134149

135150
STATIC const mp_rom_map_elem_t displayio_parallelbus_locals_dict_table[] = {
151+
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&displayio_parallelbus_reset_obj) },
136152
{ MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&displayio_parallelbus_send_obj) },
137153
};
138154
STATIC MP_DEFINE_CONST_DICT(displayio_parallelbus_locals_dict, displayio_parallelbus_locals_dict_table);

shared-bindings/displayio/ParallelBus.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* sel
4040

4141
void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self);
4242

43-
void common_hal_displayio_parallelbus_reset(mp_obj_t self);
43+
bool common_hal_displayio_parallelbus_reset(mp_obj_t self);
4444
bool common_hal_displayio_parallelbus_bus_free(mp_obj_t self);
4545

4646
bool common_hal_displayio_parallelbus_begin_transaction(mp_obj_t self);

shared-module/displayio/FourWire.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ void common_hal_displayio_fourwire_construct(displayio_fourwire_obj_t* self,
5555
common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select);
5656
common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL);
5757

58+
self->reset.base.type = &mp_type_NoneType;
5859
if (reset != NULL) {
60+
self->reset.base.type = &digitalio_digitalinout_type;
5961
common_hal_digitalio_digitalinout_construct(&self->reset, reset);
6062
common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL);
6163
never_reset_pin_number(reset->number);
@@ -76,12 +78,16 @@ void common_hal_displayio_fourwire_deinit(displayio_fourwire_obj_t* self) {
7678
reset_pin_number(self->reset.pin->number);
7779
}
7880

79-
void common_hal_displayio_fourwire_reset(mp_obj_t obj) {
81+
bool common_hal_displayio_fourwire_reset(mp_obj_t obj) {
8082
displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj);
83+
if (self->reset.base.type == &mp_type_NoneType) {
84+
return false;
85+
}
8186
common_hal_digitalio_digitalinout_set_value(&self->reset, false);
8287
common_hal_time_delay_ms(1);
8388
common_hal_digitalio_digitalinout_set_value(&self->reset, true);
8489
common_hal_time_delay_ms(1);
90+
return true;
8591
}
8692

8793
bool common_hal_displayio_fourwire_bus_free(mp_obj_t obj) {

shared-module/displayio/I2CDisplay.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ void common_hal_displayio_i2cdisplay_construct(displayio_i2cdisplay_obj_t* self,
5555

5656
self->address = device_address;
5757

58+
self->reset.base.type = &mp_type_NoneType;
5859
if (reset != NULL) {
60+
self->reset.base.type = &digitalio_digitalinout_type;
5961
common_hal_digitalio_digitalinout_construct(&self->reset, reset);
6062
common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL);
6163
never_reset_pin_number(reset->number);
@@ -71,16 +73,18 @@ void common_hal_displayio_i2cdisplay_deinit(displayio_i2cdisplay_obj_t* self) {
7173
reset_pin_number(self->reset.pin->number);
7274
}
7375

74-
75-
void common_hal_displayio_i2cdisplay_reset(mp_obj_t obj) {
76+
bool common_hal_displayio_i2cdisplay_reset(mp_obj_t obj) {
7677
displayio_i2cdisplay_obj_t* self = MP_OBJ_TO_PTR(obj);
78+
if (self->reset.base.type == &mp_type_NoneType) {
79+
return false;
80+
}
7781

7882
common_hal_digitalio_digitalinout_set_value(&self->reset, false);
7983
common_hal_mcu_delay_us(1);
8084
common_hal_digitalio_digitalinout_set_value(&self->reset, true);
85+
return true;
8186
}
8287

83-
8488
bool common_hal_displayio_i2cdisplay_bus_free(mp_obj_t obj) {
8589
displayio_i2cdisplay_obj_t* self = MP_OBJ_TO_PTR(obj);
8690
if (!common_hal_busio_i2c_try_lock(self->bus)) {

shared-module/displayio/display_core.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
#define NO_COMMAND 0x100
3535

36-
typedef void (*display_bus_bus_reset)(mp_obj_t bus);
36+
typedef bool (*display_bus_bus_reset)(mp_obj_t bus);
3737
typedef bool (*display_bus_bus_free)(mp_obj_t bus);
3838
typedef bool (*display_bus_begin_transaction)(mp_obj_t bus);
3939
typedef void (*display_bus_send)(mp_obj_t bus, bool command, bool toggle_every_byte, uint8_t *data, uint32_t data_length);

0 commit comments

Comments
 (0)