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