diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 9bc91189382365cb525fcdd49607610f928f3151..60f008a33f8ba4271384af19a7ae0844a856ce23 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -53,6 +53,7 @@ typedef _Bool bool; #define API_DISP_CIRC 0x27 #define API_DISP_PIXEL 0x28 #define API_DISP_FRAMEBUFFER 0x29 +#define API_DISP_BACKLIGHT 0x2a /* API_BATTERY_VOLTAGE 0x30 */ #define API_BATTERY_CURRENT 0x31 @@ -1333,6 +1334,17 @@ API(API_DISP_CIRC, API(API_DISP_FRAMEBUFFER, int epic_disp_framebuffer(union disp_framebuffer *fb)); +/** + * Set the backlight brightness value + * + * :param brightness: brightness from 0 - 100 + * :return: ``0`` on success or negative value in case of an error: + * + * - ``-EBUSY``: Display was already locked from another task. + */ +API(API_DISP_BACKLIGHT, int epic_disp_backlight(uint16_t brightness)); + + /** * Start continuous readout of the light sensor. Will read light level * at preconfigured interval and make it available via `epic_light_sensor_get()`. diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index b6bf36249f61aed4b60b3fcbb62900ac72f15756..c8dc51492ba51f3867405784e30719935282147b 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -171,6 +171,17 @@ int epic_disp_framebuffer(union disp_framebuffer *fb) return 0; } +int epic_disp_backlight(uint16_t brightness) +{ + int cl = check_lock(); + if (cl < 0) { + return cl; + } + + LCD_SetBacklight(brightness); + return 0; +} + int epic_disp_open() { TaskHandle_t task = xTaskGetCurrentTaskHandle(); diff --git a/lib/card10/display.c b/lib/card10/display.c index 52bca138023930b9057e92a2081c673774a9f722..f5fd471579a41a0ea520f35594dd0553b089490d 100644 --- a/lib/card10/display.c +++ b/lib/card10/display.c @@ -4,77 +4,19 @@ #include "textbuffer.h" #include "gpio.h" -#include "tmr.h" #include "portexpander.h" #include "MAX77650-Arduino-Library.h" #include <stdint.h> #include <stdio.h> + /***** Globals *****/ const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE }; struct gfx_region display_screen; struct txt_buffer display_textb; -// Parameters for PWM output -#define PORT_PWM PORT_0 // port -#define PIN_PWM PIN_28 // pin -#define FREQ 200 // (Hz) -//#define DUTY_CYCLE 75 // (%) -#define DUTY_CYCLE 20 // (%) -#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed - /***** Functions *****/ -void PWM_Output(void) -{ - // Declare variables - gpio_cfg_t gpio_pwm; // to configure GPIO - tmr_cfg_t tmr; // to congigure timer - tmr_pwm_cfg_t tmr_pwm; // for configure PWM - unsigned int period_ticks = PeripheralClock / FREQ; - unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100; - - // Congfigure GPIO port and pin for PWM - gpio_pwm.func = GPIO_FUNC_ALT4; - gpio_pwm.port = PORT_PWM; - gpio_pwm.mask = PIN_PWM; - gpio_pwm.pad = GPIO_PAD_PULL_DOWN; - - if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) { - printf("Failed GPIO_Config for pwm.\n"); - } - - /* - Steps for configuring a timer for PWM mode: - 1. Disable the timer - 2. Set the prescale value - 3. Configure the timer for PWM mode - 4. Set polarity, pwm parameters - 5. Enable Timer - */ - - TMR_Disable(PWM_TIMER); - - TMR_Init(PWM_TIMER, TMR_PRES_1, 0); - - tmr.mode = TMR_MODE_PWM; - tmr.cmp_cnt = period_ticks; - tmr.pol = 0; - TMR_Config(PWM_TIMER, &tmr); - - tmr_pwm.pol = 1; - tmr_pwm.per_cnt = period_ticks; - tmr_pwm.duty_cnt = duty_ticks; - - if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) { - printf("Failed TMR_PWMConfig.\n"); - } - - TMR_Enable(PWM_TIMER); - - printf("PWM started.\n"); -} - void display_set_reset_pin(uint8_t state) { if (!portexpander_detected()) { @@ -95,8 +37,7 @@ void display_init(void) GPIO_Config(&DEV_DC_PIN); - PWM_Output(); - LCD_SetBacklight(500); + LCD_SetBacklight(20); LCD_Init(); display_screen = gfx_screen(LCD_framebuffer()); diff --git a/lib/gfx/GUI_DEV/DEV_Config.c b/lib/gfx/GUI_DEV/DEV_Config.c index 099ce0a419260a7f43c4509d3ff6ecd3d496aacd..bd2475e49b9037f8521fc94ce34257a1acf5fdeb 100644 --- a/lib/gfx/GUI_DEV/DEV_Config.c +++ b/lib/gfx/GUI_DEV/DEV_Config.c @@ -1,60 +1,118 @@ -/***************************************************************************** -* | File : DEV_Config.c -* | Author : Waveshare team -* | Function : Hardware underlying interface -* | Info : -* Used to shield the underlying layers of each master -* and enhance portability -*---------------- -* | This version: V1.0 -* | Date : 2018-11-22 -* | Info : - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#include "DEV_Config.h" -#include "spi.h" - -#define SPI SPI2 - -//const gpio_cfg_t DEV_CS_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE}; -//const gpio_cfg_t DEV_BL_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE}; -static spi_req_t req = {.rx_data = NULL, .bits=8, .width = SPI17Y_WIDTH_1, .ssel = 0, .deass = 1, .ssel_pol = SPI17Y_POL_LOW, .tx_num = 0, .rx_num = 0}; -#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate. Display has 15 MHz limit - -/********************************************************************************/ -void lcd_write(uint8_t *data, int size) -{ - sys_cfg_spi_t spi17y_master_cfg; - - spi17y_master_cfg.map = MAP_A; - spi17y_master_cfg.ss0 = Enable; - spi17y_master_cfg.ss1 = Disable; - spi17y_master_cfg.ss2 = Disable; - if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) { - printf("Error configuring SPI\n"); - while (1) - ; - } - req.tx_data = data; - req.len = size; - SPI_MasterTrans(SPI, &req); -} - +/***************************************************************************** +* | File : DEV_Config.c +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V1.0 +* | Date : 2018-11-22 +* | Info : + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "DEV_Config.h" +#include "spi.h" + +#define SPI SPI2 + +//const gpio_cfg_t DEV_CS_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE}; +//const gpio_cfg_t DEV_BL_PIN = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE}; +static spi_req_t req = { .rx_data = NULL, + .bits = 8, + .width = SPI17Y_WIDTH_1, + .ssel = 0, + .deass = 1, + .ssel_pol = SPI17Y_POL_LOW, + .tx_num = 0, + .rx_num = 0 }; +#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate. Display has 15 MHz limit + +/********************************************************************************/ +void lcd_write(uint8_t *data, int size) +{ + sys_cfg_spi_t spi17y_master_cfg; + + spi17y_master_cfg.map = MAP_A; + spi17y_master_cfg.ss0 = Enable; + spi17y_master_cfg.ss1 = Disable; + spi17y_master_cfg.ss2 = Disable; + if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) { + printf("Error configuring SPI\n"); + while (1) + ; + } + req.tx_data = data; + req.len = size; + SPI_MasterTrans(SPI, &req); +} + +// Parameters for PWM output +#define PORT_PWM PORT_0 // port +#define PIN_PWM PIN_28 // pin +#define FREQ 1000 // (Hz) +#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed +void DEV_Set_BL(uint16_t _Value) +{ + // Declare variables + gpio_cfg_t gpio_pwm; // to configure GPIO + tmr_cfg_t tmr; // to congigure timer + tmr_pwm_cfg_t tmr_pwm; // for configure PWM + + if (_Value > 100) { + _Value = 100; + } + + unsigned int period_ticks = PeripheralClock / FREQ; + unsigned int duty_ticks = period_ticks * _Value / 100; + + TMR_Disable(PWM_TIMER); + + if (duty_ticks > 0) { + // Congfigure GPIO port and pin for PWM + gpio_pwm.func = GPIO_FUNC_ALT4; + gpio_pwm.port = PORT_PWM; + gpio_pwm.mask = PIN_PWM; + gpio_pwm.pad = GPIO_PAD_PULL_DOWN; + GPIO_Config(&gpio_pwm); + + TMR_Init(PWM_TIMER, TMR_PRES_1, 0); + + tmr.mode = TMR_MODE_PWM; + tmr.cmp_cnt = period_ticks; + tmr.pol = 0; + TMR_Config(PWM_TIMER, &tmr); + + tmr_pwm.pol = 1; + tmr_pwm.per_cnt = period_ticks; + tmr_pwm.duty_cnt = duty_ticks; + + TMR_PWMConfig(PWM_TIMER, &tmr_pwm); + TMR_Enable(PWM_TIMER); + } else { + gpio_pwm.func = GPIO_FUNC_OUT; + gpio_pwm.port = PORT_PWM; + gpio_pwm.mask = PIN_PWM; + gpio_pwm.pad = GPIO_PAD_PULL_DOWN; + GPIO_Config(&gpio_pwm); + GPIO_OutClr(&gpio_pwm); + } +} diff --git a/lib/gfx/GUI_DEV/DEV_Config.h b/lib/gfx/GUI_DEV/DEV_Config.h index 644870058ac120db1f3a83f6dcdb3e890c11344f..cbc4c5f655d5cb6a3d2fcfa5c46a2235bc0027ed 100644 --- a/lib/gfx/GUI_DEV/DEV_Config.h +++ b/lib/gfx/GUI_DEV/DEV_Config.h @@ -34,6 +34,7 @@ #include "Debug.h" #include "spi.h" +#include "tmr.h" #include "tmr_utils.h" #include <stdint.h> #include <stdio.h> @@ -72,7 +73,7 @@ void display_set_reset_pin(uint8_t state); **/ //#define DEV_Set_BL(_Value) DEV_BL_PIN= _Value -#define DEV_Set_BL(_Value) +void DEV_Set_BL(uint16_t _Value); /*-----------------------------------------------------------------------------*/ #endif diff --git a/lib/gfx/LCD/LCD_Driver.c b/lib/gfx/LCD/LCD_Driver.c index 481d6929ffdca96dc4711788621200d9faecd9b9..55c872a824ad9ef355bdb9eb4db7018c6d44eeaa 100644 --- a/lib/gfx/LCD/LCD_Driver.c +++ b/lib/gfx/LCD/LCD_Driver.c @@ -50,7 +50,7 @@ static void LCD_Reset(void) function: Setting backlight parameter : - value : Range 0~1000 Duty cycle is value/1000 + value : Range 0~100 Duty cycle is value/100 *******************************************************************************/ void LCD_SetBacklight(UWORD Value) { diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py index 3a93af78cc5d359ee96cceb10cc28b10a33e0351..e957977d6fc3603889f3155e515d351dc8f1753b 100644 --- a/pycardium/modules/py/display.py +++ b/pycardium/modules/py/display.py @@ -91,6 +91,16 @@ class Display: sys_display.pixel(x, y, col) return self + def backlight(self, brightness): + """ + Set display backlight brightness + + :param brightness: backlight brightness 0 <= brightness <= 100 + """ + + sys_display.backlight(brightness) + return self + def line(self, xs, ys, xe, ye, *, col=None, dotted=False, size=1): """ Draws a line on the display. diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index e418c24db58105796aa5b2cb34a1d80acd82af3b..5c9c63a17f50dcf976d2001f641feb3ce274b86d 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -85,6 +85,7 @@ Q(sys_display) Q(display) Q(print) Q(pixel) +Q(backlight) Q(line) Q(rect) Q(circ) diff --git a/pycardium/modules/sys_display.c b/pycardium/modules/sys_display.c index cc550be6d1124b3e3dde68b477e726574f5feb16..f5523d54831695679965ddcb76e7df8c6fa2ba29 100644 --- a/pycardium/modules/sys_display.c +++ b/pycardium/modules/sys_display.c @@ -79,6 +79,21 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( display_pixel_obj, 3, 3, mp_display_pixel ); +/* set display backlight brightness */ +static mp_obj_t mp_display_backlight(size_t n_args, const mp_obj_t *args) +{ + uint16_t brightness = mp_obj_get_int(args[0]); + + int res = epic_disp_backlight(brightness); + if (res < 0) { + mp_raise_OSError(-res); + } + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( + display_backlight_obj, 1, 1, mp_display_backlight +); + /* draw line on the display */ static mp_obj_t mp_display_line(size_t n_args, const mp_obj_t *args) { @@ -220,6 +235,7 @@ static const mp_rom_map_elem_t display_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&display_close_obj) }, { MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&display_print_obj) }, { MP_ROM_QSTR(MP_QSTR_pixel), MP_ROM_PTR(&display_pixel_obj) }, + { MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&display_backlight_obj) }, { MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&display_line_obj) }, { MP_ROM_QSTR(MP_QSTR_rect), MP_ROM_PTR(&display_rect_obj) }, { MP_ROM_QSTR(MP_QSTR_circ), MP_ROM_PTR(&display_circ_obj) },