Skip to content
Snippets Groups Projects
Commit 330f8713 authored by schneider's avatar schneider
Browse files

Merge branch 'Draradech/firmware-backlight_control'

parents 314c5c01 125fd0f2
No related branches found
No related tags found
No related merge requests found
Pipeline #3071 passed
...@@ -53,6 +53,7 @@ typedef _Bool bool; ...@@ -53,6 +53,7 @@ typedef _Bool bool;
#define API_DISP_CIRC 0x27 #define API_DISP_CIRC 0x27
#define API_DISP_PIXEL 0x28 #define API_DISP_PIXEL 0x28
#define API_DISP_FRAMEBUFFER 0x29 #define API_DISP_FRAMEBUFFER 0x29
#define API_DISP_BACKLIGHT 0x2a
/* API_BATTERY_VOLTAGE 0x30 */ /* API_BATTERY_VOLTAGE 0x30 */
#define API_BATTERY_CURRENT 0x31 #define API_BATTERY_CURRENT 0x31
...@@ -1333,6 +1334,17 @@ API(API_DISP_CIRC, ...@@ -1333,6 +1334,17 @@ API(API_DISP_CIRC,
API(API_DISP_FRAMEBUFFER, int epic_disp_framebuffer(union disp_framebuffer *fb)); 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 * Start continuous readout of the light sensor. Will read light level
* at preconfigured interval and make it available via `epic_light_sensor_get()`. * at preconfigured interval and make it available via `epic_light_sensor_get()`.
......
...@@ -171,6 +171,17 @@ int epic_disp_framebuffer(union disp_framebuffer *fb) ...@@ -171,6 +171,17 @@ int epic_disp_framebuffer(union disp_framebuffer *fb)
return 0; 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() int epic_disp_open()
{ {
TaskHandle_t task = xTaskGetCurrentTaskHandle(); TaskHandle_t task = xTaskGetCurrentTaskHandle();
......
...@@ -4,77 +4,19 @@ ...@@ -4,77 +4,19 @@
#include "textbuffer.h" #include "textbuffer.h"
#include "gpio.h" #include "gpio.h"
#include "tmr.h"
#include "portexpander.h" #include "portexpander.h"
#include "MAX77650-Arduino-Library.h" #include "MAX77650-Arduino-Library.h"
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
/***** Globals *****/ /***** Globals *****/
const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE }; const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE };
struct gfx_region display_screen; struct gfx_region display_screen;
struct txt_buffer display_textb; 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 *****/ /***** 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) void display_set_reset_pin(uint8_t state)
{ {
if (!portexpander_detected()) { if (!portexpander_detected()) {
...@@ -95,8 +37,7 @@ void display_init(void) ...@@ -95,8 +37,7 @@ void display_init(void)
GPIO_Config(&DEV_DC_PIN); GPIO_Config(&DEV_DC_PIN);
PWM_Output(); LCD_SetBacklight(20);
LCD_SetBacklight(500);
LCD_Init(); LCD_Init();
display_screen = gfx_screen(LCD_framebuffer()); display_screen = gfx_screen(LCD_framebuffer());
......
/***************************************************************************** /*****************************************************************************
* | File : DEV_Config.c * | File : DEV_Config.c
* | Author : Waveshare team * | Author : Waveshare team
* | Function : Hardware underlying interface * | Function : Hardware underlying interface
* | Info : * | Info :
* Used to shield the underlying layers of each master * Used to shield the underlying layers of each master
* and enhance portability * and enhance portability
*---------------- *----------------
* | This version: V1.0 * | This version: V1.0
* | Date : 2018-11-22 * | Date : 2018-11-22
* | Info : * | Info :
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal # of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights # in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is # copies of the Software, and to permit persons to whom the Software is
# furished to do so, subject to the following conditions: # furished to do so, subject to the following conditions:
# #
# The above copyright notice and this permission notice shall be included in # The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software. # all copies or substantial portions of the Software.
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # 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 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
# #
******************************************************************************/ ******************************************************************************/
#include "DEV_Config.h" #include "DEV_Config.h"
#include "spi.h" #include "spi.h"
#define SPI SPI2 #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_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}; //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}; static spi_req_t req = { .rx_data = NULL,
#define SPI_SPEED (15 * 1000 * 1000) // Bit Rate. Display has 15 MHz limit .bits = 8,
.width = SPI17Y_WIDTH_1,
/********************************************************************************/ .ssel = 0,
void lcd_write(uint8_t *data, int size) .deass = 1,
{ .ssel_pol = SPI17Y_POL_LOW,
sys_cfg_spi_t spi17y_master_cfg; .tx_num = 0,
.rx_num = 0 };
spi17y_master_cfg.map = MAP_A; #define SPI_SPEED (15 * 1000 * 1000) // Bit Rate. Display has 15 MHz limit
spi17y_master_cfg.ss0 = Enable;
spi17y_master_cfg.ss1 = Disable; /********************************************************************************/
spi17y_master_cfg.ss2 = Disable; void lcd_write(uint8_t *data, int size)
if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) { {
printf("Error configuring SPI\n"); sys_cfg_spi_t spi17y_master_cfg;
while (1)
; spi17y_master_cfg.map = MAP_A;
} spi17y_master_cfg.ss0 = Enable;
req.tx_data = data; spi17y_master_cfg.ss1 = Disable;
req.len = size; spi17y_master_cfg.ss2 = Disable;
SPI_MasterTrans(SPI, &req); 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);
}
}
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "Debug.h" #include "Debug.h"
#include "spi.h" #include "spi.h"
#include "tmr.h"
#include "tmr_utils.h" #include "tmr_utils.h"
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
...@@ -72,7 +73,7 @@ void display_set_reset_pin(uint8_t state); ...@@ -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) DEV_BL_PIN= _Value
#define DEV_Set_BL(_Value) void DEV_Set_BL(uint16_t _Value);
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
#endif #endif
...@@ -50,7 +50,7 @@ static void LCD_Reset(void) ...@@ -50,7 +50,7 @@ static void LCD_Reset(void)
function: function:
Setting backlight Setting backlight
parameter : parameter :
value : Range 0~1000 Duty cycle is value/1000 value : Range 0~100 Duty cycle is value/100
*******************************************************************************/ *******************************************************************************/
void LCD_SetBacklight(UWORD Value) void LCD_SetBacklight(UWORD Value)
{ {
......
...@@ -91,6 +91,16 @@ class Display: ...@@ -91,6 +91,16 @@ class Display:
sys_display.pixel(x, y, col) sys_display.pixel(x, y, col)
return self 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): def line(self, xs, ys, xe, ye, *, col=None, dotted=False, size=1):
""" """
Draws a line on the display. Draws a line on the display.
......
...@@ -85,6 +85,7 @@ Q(sys_display) ...@@ -85,6 +85,7 @@ Q(sys_display)
Q(display) Q(display)
Q(print) Q(print)
Q(pixel) Q(pixel)
Q(backlight)
Q(line) Q(line)
Q(rect) Q(rect)
Q(circ) Q(circ)
......
...@@ -79,6 +79,21 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( ...@@ -79,6 +79,21 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
display_pixel_obj, 3, 3, mp_display_pixel 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 */ /* draw line on the display */
static mp_obj_t mp_display_line(size_t n_args, const mp_obj_t *args) 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[] = { ...@@ -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_close), MP_ROM_PTR(&display_close_obj) },
{ MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&display_print_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_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_line), MP_ROM_PTR(&display_line_obj) },
{ MP_ROM_QSTR(MP_QSTR_rect), MP_ROM_PTR(&display_rect_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) }, { MP_ROM_QSTR(MP_QSTR_circ), MP_ROM_PTR(&display_circ_obj) },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment