diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 9bc91189382365cb525fcdd49607610f928f3151..12acffb83a6659ed637da50f8968c8ed3c9b1c29 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 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..6bf37a0d4f0861904ecf654487980dd7cefc8108 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 099ce0a419260a7f43c4509d3ff6ecd3d496aacd..044ca00b58f6f1009e0b34a502d0bdc1e44905b1 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 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