From ec6e2d16c68507a64b051b3118e907f857906f62 Mon Sep 17 00:00:00 2001 From: draradech <kasten.m@gmx.de> Date: Thu, 22 Aug 2019 15:50:13 +0200 Subject: [PATCH] control display backlight brightness (epic part) --- epicardium/epicardium.h | 12 +++++++ epicardium/modules/display.c | 11 +++++++ lib/card10/display.c | 63 ++---------------------------------- lib/gfx/GUI_DEV/DEV_Config.c | 55 +++++++++++++++++++++++++++++++ lib/gfx/GUI_DEV/DEV_Config.h | 3 +- 5 files changed, 82 insertions(+), 62 deletions(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 9bc91189..12acffb8 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 - 1000 + * :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 b6bf3624..c8dc5149 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 52bca138..6bf37a0d 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(200); 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 099ce0a4..044ca00b 100644 --- a/lib/gfx/GUI_DEV/DEV_Config.c +++ b/lib/gfx/GUI_DEV/DEV_Config.c @@ -58,3 +58,58 @@ void lcd_write(uint8_t *data, int size) SPI_MasterTrans(SPI, &req); } +// Parameters for PWM output +#define PORT_PWM PORT_0 // port +#define PIN_PWM PIN_28 // pin +#define FREQ 200 // (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 + unsigned int period_ticks = PeripheralClock / FREQ; + unsigned int duty_ticks = period_ticks * _Value / 1000; + + // 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"); +} + diff --git a/lib/gfx/GUI_DEV/DEV_Config.h b/lib/gfx/GUI_DEV/DEV_Config.h index 64487005..cbc4c5f6 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 -- GitLab