summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2026-01-07 22:58:33 +0100
committerUros Majstorovic <majstor@majstor.org>2026-01-07 22:58:33 +0100
commit46b08fc235f3f068034355970697acc0956e5c99 (patch)
tree96e2bde5d95c295a57afae353684a25544fb09fa /fw/fe310/eos/eve
parent285ddd410a559449b7e2cbab9b2b10e850efbd08 (diff)
introduced EOSMessage struct for SPI and Event queue messages; added APP <-> FE310 bridge SPI messages; LCD/touch panel driver for app module; save relevant state to AON module before sleep;
Diffstat (limited to 'fw/fe310/eos/eve')
-rw-r--r--fw/fe310/eos/eve/eve.c36
-rw-r--r--fw/fe310/eos/eve/eve.h7
-rwxr-xr-xfw/fe310/eos/eve/eve_config.h28
-rw-r--r--fw/fe310/eos/eve/eve_platform.h5
-rw-r--r--fw/fe310/eos/eve/eve_touch_engine.c5
-rw-r--r--fw/fe310/eos/eve/eve_touch_engine.h1
-rw-r--r--fw/fe310/eos/eve/widget/selectw.c113
-rw-r--r--fw/fe310/eos/eve/widget/selectw.h4
8 files changed, 98 insertions, 101 deletions
diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c
index e5c5f80..2f01358 100644
--- a/fw/fe310/eos/eve/eve.c
+++ b/fw/fe310/eos/eve/eve.c
@@ -12,9 +12,6 @@ static uint16_t cmd_offset;
static char dl_burst;
static uint32_t dl_addr;
-static uint8_t power_state = EVE_PSTATE_ACTIVE;
-static int lcd_absent = 0;
-
void eve_command(uint8_t command, uint8_t parameter) {
eve_spi_set_cs();
eve_spi_xchg24(((uint32_t)command << 16) | ((uint32_t)parameter << 8), 0);
@@ -384,7 +381,7 @@ int eve_init(void) {
#endif
/* nothing is being displayed yet... the pixel clock is still 0x00 */
- power_state = EVE_PSTATE_ACTIVE;
+ eve_pwr_set_state(EVE_PSTATE_ACTIVE);
return EVE_OK;
}
@@ -408,16 +405,16 @@ void eve_intr_disable(void) {
}
void eve_activate(void) {
- if (power_state == EVE_PSTATE_ACTIVE) return;
+ if (eve_pwr_get_state() == EVE_PSTATE_ACTIVE) return;
eve_command(EVE_ACTIVE, 0);
- if (power_state == EVE_PSTATE_SLEEP) {
+ if (eve_pwr_get_state() == EVE_PSTATE_SLEEP) {
eve_sleep(20);
}
}
void eve_deactivate(void) {
- switch (power_state) {
+ switch (eve_pwr_get_state()) {
case EVE_PSTATE_ACTIVE:
return;
@@ -432,33 +429,29 @@ void eve_deactivate(void) {
}
void eve_pwr_standby(void) {
- if (power_state != EVE_PSTATE_ACTIVE) return;
+ if (eve_pwr_get_state() != EVE_PSTATE_ACTIVE) return;
eve_command(EVE_STANDBY, 0);
- power_state = EVE_PSTATE_STANDBY;
+ eve_pwr_set_state(EVE_PSTATE_STANDBY);
}
void eve_pwr_sleep(void) {
- if (power_state != EVE_PSTATE_ACTIVE) return;
+ if (eve_pwr_get_state() != EVE_PSTATE_ACTIVE) return;
eve_command(EVE_SLEEP, 0);
- power_state = EVE_PSTATE_SLEEP;
+ eve_pwr_set_state(EVE_PSTATE_SLEEP);
}
void eve_pwr_wake(void) {
eve_activate();
- power_state = EVE_PSTATE_ACTIVE;
-}
-
-void eve_pwr_set_state(uint8_t state) {
- power_state = state;
+ eve_pwr_set_state(EVE_PSTATE_ACTIVE);
}
uint8_t eve_pwr_state(void) {
- return power_state;
+ return eve_pwr_get_state();
}
int eve_gpio_get(int gpio) {
@@ -505,13 +498,14 @@ void eve_gpio_write_dir(uint16_t dir) {
eve_write16(REG_GPIOX_DIR, reg);
}
-void eve_brightness(uint8_t b) {
- if (lcd_absent) b = 0;
+void eve_set_brightness(uint8_t b) {
+ if (eve_lcd_get_absent()) b = 0;
+ if (b > 0x80) b = 0x80;
eve_write8(REG_PWM_DUTY, b);
}
-void eve_lcd_absent(void) {
- lcd_absent = 1;
+uint8_t eve_get_brightness(void) {
+ return eve_read8(REG_PWM_DUTY);
}
void eve_copro_reset(void) {
diff --git a/fw/fe310/eos/eve/eve.h b/fw/fe310/eos/eve/eve.h
index 02388bb..7936fc2 100644
--- a/fw/fe310/eos/eve/eve.h
+++ b/fw/fe310/eos/eve/eve.h
@@ -8,7 +8,6 @@
/* defined in eve_platform.h */
#define EVE_GPIO_MASK 0x800f
-#define EVE_GPIO_DISP 15
#define EVE_PSTATE_ACTIVE 0
#define EVE_PSTATE_STANDBY 1
@@ -69,8 +68,6 @@ void eve_deactivate(void);
void eve_pwr_standby(void);
void eve_pwr_sleep(void);
void eve_pwr_wake(void);
-void eve_pwr_set_state(uint8_t state);
-
uint8_t eve_pwr_state(void);
int eve_gpio_get(int gpio);
@@ -80,6 +77,6 @@ void eve_gpio_write(uint16_t gpio);
uint16_t eve_gpio_read_dir(void);
void eve_gpio_write_dir(uint16_t dir);
-void eve_brightness(uint8_t b);
-void eve_lcd_absent(void);
+void eve_set_brightness(uint8_t b);
+uint8_t eve_get_brightness(void);
void eve_copro_reset(void);
diff --git a/fw/fe310/eos/eve/eve_config.h b/fw/fe310/eos/eve/eve_config.h
index 1126277..4a99992 100755
--- a/fw/fe310/eos/eve/eve_config.h
+++ b/fw/fe310/eos/eve/eve_config.h
@@ -3,31 +3,31 @@
/* FocusLCDs E50RG84885LWAM520-CA */
+#define EVE_HFP 8 /* horizontal front porch */
#define EVE_HLPW 6 /* horizontal low pulse width */
#define EVE_HBP 6 /* horizontal back porch */
-#define EVE_HFP 6 /* horizontal front porch */
#define EVE_HACT 480 /* horizontal active pixels */
-#define EVE_HTOT (EVE_HLPW + EVE_HBP + EVE_HFP + EVE_HACT + 10)
+#define EVE_HTOT (EVE_HLPW + EVE_HBP + EVE_HFP + EVE_HACT)
+#define EVE_HFPX (EVE_HFP - 2) /* refer to AN_336 - FT8xx - Selecting an LCD Display */
-
-#define EVE_VLPW 6 /* vertical low pulse width */
-#define EVE_VBP 6 /* vertical back porch */
-#define EVE_VFP 6 /* vertical front porch */
+#define EVE_VFP 26 /* vertical front porch */
+#define EVE_VLPW 10 /* vertical low pulse width */
+#define EVE_VBP 10 /* vertical back porch */
#define EVE_VACT 854 /* vertical active pixels */
-#define EVE_VTOT (EVE_VLPW + EVE_VBP + EVE_VFP + EVE_VACT + 10)
-
+#define EVE_VTOT (EVE_VLPW + EVE_VBP + EVE_VFP + EVE_VACT)
+#define EVE_VFPY (EVE_VFP - 2) /* refer to AN_336 - FT8xx - Selecting an LCD Display */
#define EVE_HCYCLE (EVE_HTOT) /* Th Total length of line (visible and non-visible) (in PCLKs) */
#define EVE_HSIZE (EVE_HACT) /* Length of visible part of line (in PCLKs) - display width */
-#define EVE_HOFFSET (EVE_HFP + EVE_HLPW + EVE_HBP) /* Length of non-visible part of line (in PCLK cycles) */
-#define EVE_HSYNC0 (EVE_HFP) /* Horizontal Front Porch */
-#define EVE_HSYNC1 (EVE_HFP + EVE_HLPW) /* Horizontal Front Porch plus Hsync Pulse width */
+#define EVE_HOFFSET (EVE_HFPX + EVE_HLPW + EVE_HBP) /* Length of non-visible part of line (in PCLK cycles) */
+#define EVE_HSYNC0 (EVE_HFPX) /* Horizontal Front Porch */
+#define EVE_HSYNC1 (EVE_HFPX + EVE_HLPW) /* Horizontal Front Porch plus Hsync Pulse width */
#define EVE_VCYCLE (EVE_VTOT) /* Total number of lines (visible and non-visible) (in lines) */
#define EVE_VSIZE (EVE_VACT) /* Number of visible lines (in lines) - display height */
-#define EVE_VOFFSET (EVE_VFP + EVE_VLPW + EVE_VBP) /* Number of non-visible lines (in lines) */
-#define EVE_VSYNC0 (EVE_VFP) /* Vertical Front Porch */
-#define EVE_VSYNC1 (EVE_VFP + EVE_VLPW) /* Vertical Front Porch plus Vsync Pulse width */
+#define EVE_VOFFSET (EVE_VFPY + EVE_VLPW + EVE_VBP) /* Number of non-visible lines (in lines) */
+#define EVE_VSYNC0 (EVE_VFPY) /* Vertical Front Porch */
+#define EVE_VSYNC1 (EVE_VFPY + EVE_VLPW) /* Vertical Front Porch plus Vsync Pulse width */
#define EVE_PCLKPOL 1 /* PCLK polarity (0 = rising edge, 1 = falling edge) */
#define EVE_SWIZZLE 0 /* Defines the arrangement of the RGB pins */
diff --git a/fw/fe310/eos/eve/eve_platform.h b/fw/fe310/eos/eve/eve_platform.h
index 6f34b81..49c87dc 100644
--- a/fw/fe310/eos/eve/eve_platform.h
+++ b/fw/fe310/eos/eve/eve_platform.h
@@ -6,6 +6,7 @@
#include "../log.h"
#include "../soc/timer.h"
#include "../soc/spi.h"
+#include "../dev/aon.h"
#ifdef EOS_DEBUG
#define EVE_DEBUG 1
@@ -49,6 +50,10 @@ void eve_free(void *);
#define eve_spi_xchg16 eos_spi_xchg16
#define eve_spi_xchg24 eos_spi_xchg24
#define eve_spi_xchg32 eos_spi_xchg32
+#define eve_pwr_get_state eos_aon_load4eve_pwr
+#define eve_pwr_set_state eos_aon_save4eve_pwr
+#define eve_lcd_get_absent eos_aon_load4eve_lcd
+#define eve_lcd_set_absent eos_aon_save4eve_lcd
void eve_sleep(uint32_t ms);
uint32_t eve_get_tick(void);
diff --git a/fw/fe310/eos/eve/eve_touch_engine.c b/fw/fe310/eos/eve/eve_touch_engine.c
index 7c5b39f..aadd07d 100644
--- a/fw/fe310/eos/eve/eve_touch_engine.c
+++ b/fw/fe310/eos/eve/eve_touch_engine.c
@@ -59,6 +59,11 @@ void eve_touch_set_engine(uint16_t engine) {
}
}
+void eve_touch_reset_engine(void) {
+ eve_write8(REG_CPURESET, 2); /* touch engine reset */
+ eve_write8(REG_CPURESET, 0); /* clear reset */
+}
+
void eve_touch_intr_enable(void) {
uint16_t intr_mask;
diff --git a/fw/fe310/eos/eve/eve_touch_engine.h b/fw/fe310/eos/eve/eve_touch_engine.h
index 8eb7333..a144885 100644
--- a/fw/fe310/eos/eve/eve_touch_engine.h
+++ b/fw/fe310/eos/eve/eve_touch_engine.h
@@ -9,6 +9,7 @@
void eve_touch_init_engine(uint16_t engine);
uint16_t eve_touch_get_engine(void);
void eve_touch_set_engine(uint16_t engine);
+void eve_touch_reset_engine(void);
void eve_touch_intr_enable(void);
void eve_touch_intr_disable(void);
void eve_touch_start(void);
diff --git a/fw/fe310/eos/eve/widget/selectw.c b/fw/fe310/eos/eve/widget/selectw.c
index c0e2bfe..ee924c7 100644
--- a/fw/fe310/eos/eve/widget/selectw.c
+++ b/fw/fe310/eos/eve/widget/selectw.c
@@ -14,44 +14,42 @@
#define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0))
-static int selectw_verify(utf8_t *option, uint16_t option_size, EVEFont *font, size_t *_o_len) {
- size_t o_len;
- uint16_t o_curr;
+static int selectw_verify(utf8_t *option, uint16_t option_size, EVEFont *font, size_t *len) {
+ size_t _len, curr;
int rv;
- o_curr = 0;
- while (o_curr < option_size) {
- rv = eve_font_verify(font, option + o_curr, option_size - o_curr, NULL, &o_len);
+ curr = 0;
+ while (curr < option_size) {
+ rv = eve_font_verify(font, option + curr, option_size - curr, NULL, &_len);
if (rv) {
- if (_o_len) *_o_len = o_curr;
+ if (len) *len = curr;
return rv;
}
- o_curr += o_len + 1;
- if (o_len == 0) {
- if (_o_len) *_o_len = o_curr;
+ curr += _len + 1;
+ if (_len == 0) {
+ if (len) *len = curr;
return EVE_OK;
}
}
- if (_o_len) *_o_len = o_curr;
+ if (len) *len = curr;
return EVE_OK;
}
static int selectw_count(EVESelectWidget *widget) {
- int o_len;
- int o_curr;
+ size_t len, curr;
int i;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (o_len == widget->option_size - o_curr) return i;
- if (o_len) {
- o_curr += o_len + 1;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (len == widget->option_size - curr) return i;
+ if (len) {
+ curr += len + 1;
i++;
}
- } while (o_len);
+ } while (len);
return i;
}
@@ -124,11 +122,10 @@ void eve_selectw_destroy(EVEWidget *_widget) {
uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
EVESelectWidget *widget = (EVESelectWidget *)_widget;
EVEPage *page = _widget->page;
- int o_len;
- int o_curr;
- int i, s;
+ size_t len, curr;
int16_t x1, x2, y1, y2;
uint16_t new_h;
+ int i, s;
int line0, lineN;
@@ -143,11 +140,11 @@ uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
_widget->tagN = tag0;
widget->line0 = line0;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (!o_len || (o_len == widget->option_size - o_curr)) break;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (!len || (len == widget->option_size - curr)) break;
if ((i >= line0) && (i < lineN)) {
if (_widget->tagN != EVE_NOTAG) {
eve_cmd_dl(TAG(_widget->tagN));
@@ -170,13 +167,13 @@ uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
}
eve_cmd_dl(END());
if (s) eve_cmd_dl(COLOR_RGBC(page->v.color_bg));
- eve_cmd(CMD_TEXT, "hhhhs", x1, y1, widget->font->id, 0, widget->option + o_curr);
+ eve_cmd(CMD_TEXT, "hhhhs", x1, y1, widget->font->id, 0, widget->option + curr);
if (s) eve_cmd_dl(COLOR_RGBC(page->v.color_fg));
}
- o_curr += o_len + 1;
+ curr += len + 1;
i++;
- } while (o_len);
+ } while (len);
return _widget->tagN;
}
@@ -216,19 +213,18 @@ int eve_selectw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
}
utf8_t *eve_selectw_option(EVESelectWidget *widget, int idx) {
- int o_len;
- int o_curr;
+ size_t len, curr;
int i;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (o_len == widget->option_size - o_curr) return NULL;
- if (o_len && (i == idx)) return widget->option + o_curr;
- o_curr += o_len + 1;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (len == widget->option_size - curr) return NULL;
+ if (len && (i == idx)) return widget->option + curr;
+ curr += len + 1;
i++;
- } while (o_len);
+ } while (len);
return NULL;
}
@@ -239,26 +235,25 @@ utf8_t *eve_selectw_option_selected(EVESelectWidget *widget) {
}
int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option) {
- int o_len;
- int o_curr;
+ size_t len, curr;
int rv, i;
rv = eve_font_verify(widget->font, option, 0, NULL, NULL);
if (rv) return rv;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (o_len == widget->option_size - o_curr) return EVE_ERR_FULL;
- if (o_len) {
- o_curr += o_len + 1;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (len == widget->option_size - curr) return EVE_ERR_FULL;
+ if (len) {
+ curr += len + 1;
i++;
}
- } while (o_len);
+ } while (len);
- if (o_curr + strlen(option) + 1 > widget->option_size) return EVE_ERR_FULL;
- strcpy(widget->option + o_curr, option);
+ if (curr + strlen(option) + 1 > widget->option_size) return EVE_ERR_FULL;
+ strcpy(widget->option + curr, option);
widget->option_count = i + 1;
selectw_update_sz(widget, 1);
@@ -266,16 +261,16 @@ int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option) {
return EVE_OK;
}
-int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
+int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t len) {
int rv, i;
- if (option_size > widget->option_size) return EVE_ERR_FULL;
+ if (len > widget->option_size) return EVE_ERR_FULL;
- rv = selectw_verify(option, option_size, widget->font, NULL);
+ rv = selectw_verify(option, len, widget->font, NULL);
if (rv) return rv;
- memcpy(widget->option, option, option_size);
- memset(widget->option + option_size, 0, widget->option_size - option_size);
+ memcpy(widget->option, option, len);
+ memset(widget->option + len, 0, widget->option_size - len);
widget->option_count = selectw_count(widget);
selectw_update_sz(widget, 1);
@@ -283,22 +278,22 @@ int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t opt
return EVE_OK;
}
-void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
+void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t len) {
size_t good_l, bad_l;
int rv;
do {
- rv = selectw_verify(option, option_size, widget->font, &good_l);
+ rv = selectw_verify(option, len, widget->font, &good_l);
if (rv == EVE_OK) return;
option += good_l;
- option_size -= good_l;
+ len -= good_l;
- bad_l = strnlen(option, option_size);
- if (bad_l != option_size) {
+ bad_l = strnlen(option, len);
+ if (bad_l != len) {
bad_l++;
}
- memmove(option, option + bad_l, option_size - bad_l);
- memset(option + option_size - bad_l, 0, bad_l);
- } while (bad_l != option_size);
+ memmove(option, option + bad_l, len - bad_l);
+ memset(option + len - bad_l, 0, bad_l);
+ } while (bad_l != len);
}
diff --git a/fw/fe310/eos/eve/widget/selectw.h b/fw/fe310/eos/eve/widget/selectw.h
index 185d787..577fb86 100644
--- a/fw/fe310/eos/eve/widget/selectw.h
+++ b/fw/fe310/eos/eve/widget/selectw.h
@@ -30,5 +30,5 @@ int eve_selectw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt);
utf8_t *eve_selectw_option(EVESelectWidget *widget, int idx);
utf8_t *eve_selectw_option_selected(EVESelectWidget *widget);
int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option);
-int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size);
-void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size);
+int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t len);
+void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t len);