summaryrefslogtreecommitdiff
path: root/shared-module/displayio
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2019-01-25 18:31:27 -0800
committerScott Shawcroft <scott@tannewt.org>2019-01-31 11:42:14 -0800
commit69bc5e189baef183918dc21dadaacf55ce66bee3 (patch)
treed24fbf2f860a414926aaa3141bbcbd1929016784 /shared-module/displayio
parent1a1dbef992442682413f6103e36440a26bc2dad7 (diff)
Rudamentary backlight support
Diffstat (limited to 'shared-module/displayio')
-rw-r--r--shared-module/displayio/Display.c43
-rw-r--r--shared-module/displayio/Display.h14
-rw-r--r--shared-module/displayio/__init__.c3
3 files changed, 58 insertions, 2 deletions
diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c
index fd082c19d..504f130c7 100644
--- a/shared-module/displayio/Display.c
+++ b/shared-module/displayio/Display.c
@@ -29,6 +29,7 @@
#include "py/runtime.h"
#include "shared-bindings/displayio/FourWire.h"
#include "shared-bindings/displayio/ParallelBus.h"
+#include "shared-bindings/microcontroller/Pin.h"
#include "shared-bindings/time/__init__.h"
#include "shared-module/displayio/__init__.h"
#include "supervisor/shared/display.h"
@@ -42,7 +43,8 @@
void common_hal_displayio_display_construct(displayio_display_obj_t* self,
mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart,
uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command,
- uint8_t write_ram_command, uint8_t* init_sequence, uint16_t init_sequence_len) {
+ uint8_t write_ram_command, uint8_t* init_sequence, uint16_t init_sequence_len,
+ const mcu_pin_obj_t* backlight_pin) {
self->width = width;
self->height = height;
self->color_depth = color_depth;
@@ -96,6 +98,19 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
// initialization.
self->refresh = true;
self->current_group = &circuitpython_splash;
+
+ if (backlight_pin != NULL && common_hal_mcu_pin_is_free(backlight_pin)) {
+ pwmout_result_t result = common_hal_pulseio_pwmout_construct(&self->backlight_pwm, backlight_pin, 0, 5000, false);
+ if (result != PWMOUT_OK) {
+ self->backlight_inout.base.type = &digitalio_digitalinout_type;
+ common_hal_digitalio_digitalinout_construct(&self->backlight_inout, backlight_pin);
+ never_reset_pin_number(backlight_pin->number);
+ } else {
+ self->backlight_pwm.base.type = &pulseio_pwmout_type;
+ common_hal_pulseio_pwmout_never_reset(&self->backlight_pwm);
+ }
+ }
+ self->auto_brightness = true;
}
void common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group) {
@@ -158,3 +173,29 @@ bool displayio_display_send_pixels(displayio_display_obj_t* self, uint32_t* pixe
self->send(self->bus, false, (uint8_t*) pixels, length * 4);
return true;
}
+
+void displayio_display_update_backlight(displayio_display_obj_t* self) {
+ if (!self->auto_brightness || self->updating_backlight) {
+ return;
+ }
+ if (ticks_ms - self->last_backlight_refresh < 100) {
+ return;
+ }
+ self->updating_backlight = true;
+ if (self->backlight_pwm.base.type == &pulseio_pwmout_type) {
+ common_hal_pulseio_pwmout_set_duty_cycle(&self->backlight_pwm, 0xffff);
+ } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) {
+ common_hal_digitalio_digitalinout_set_value(&self->backlight_inout, true);
+ }
+ self->updating_backlight = false;
+ self->last_backlight_refresh = ticks_ms;
+}
+
+void release_display(displayio_display_obj_t* self) {
+ if (self->backlight_pwm.base.type == &pulseio_pwmout_type) {
+ common_hal_pulseio_pwmout_reset_ok(&self->backlight_pwm);
+ common_hal_pulseio_pwmout_deinit(&self->backlight_pwm);
+ } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) {
+ common_hal_digitalio_digitalinout_deinit(&self->backlight_inout);
+ }
+}
diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h
index 1f1355d31..0d7393aff 100644
--- a/shared-module/displayio/Display.h
+++ b/shared-module/displayio/Display.h
@@ -27,7 +27,9 @@
#ifndef MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H
#define MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H
-#include "shared-module/displayio/Group.h"
+#include "shared-bindings/digitalio/DigitalInOut.h"
+#include "shared-bindings/displayio/Group.h"
+#include "shared-bindings/pulseio/PWMOut.h"
typedef bool (*display_bus_begin_transaction)(mp_obj_t bus);
typedef void (*display_bus_send)(mp_obj_t bus, bool command, uint8_t *data, uint32_t data_length);
@@ -50,6 +52,16 @@ typedef struct {
display_bus_begin_transaction begin_transaction;
display_bus_send send;
display_bus_end_transaction end_transaction;
+ union {
+ digitalio_digitalinout_obj_t backlight_inout;
+ pulseio_pwmout_obj_t backlight_pwm;
+ };
+ uint64_t last_backlight_refresh;
+ bool auto_brightness:1;
+ bool updating_backlight:1;
} displayio_display_obj_t;
+void displayio_display_update_backlight(displayio_display_obj_t* self);
+void release_display(displayio_display_obj_t* self);
+
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H
diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c
index dbfeacc3d..8e4904954 100644
--- a/shared-module/displayio/__init__.c
+++ b/shared-module/displayio/__init__.c
@@ -20,6 +20,7 @@ void displayio_refresh_displays(void) {
continue;
}
displayio_display_obj_t* display = &displays[i].display;
+ displayio_display_update_backlight(display);
if (!displayio_display_frame_queued(display)) {
return;
@@ -82,6 +83,7 @@ void common_hal_displayio_release_displays(void) {
displays[i].fourwire_bus.base.type = &mp_type_NoneType;
}
for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
+ release_display(&displays[i].display);
displays[i].display.base.type = &mp_type_NoneType;
}
@@ -117,6 +119,7 @@ void reset_displays(void) {
continue;
}
displayio_display_obj_t* display = &displays[i].display;
+ display->auto_brightness = true;
common_hal_displayio_display_show(display, &circuitpython_splash);
}
}