From 9d1721008fe1d35abdedbff063ef29d35996124c Mon Sep 17 00:00:00 2001
From: Uros Majstorovic <majstor@majstor.org>
Date: Tue, 16 Nov 2021 19:19:51 +0100
Subject: board REV3 pins in board.h; eve BT817 support

---
 fw/fe310/eos/eve/eve.c          |   62 +-
 fw/fe310/eos/eve/eve_config.h   |    4 +-
 fw/fe310/eos/eve/eve_def.h      | 1185 ++++++++++++++++++---------------------
 fw/fe310/eos/eve/eve_platform.c |   12 +-
 fw/fe310/eos/eve/eve_platform.h |    1 -
 fw/fe310/eos/eve/eve_touch.c    |   47 +-
 fw/fe310/eos/eve/eve_touch.h    |    2 +-
 7 files changed, 612 insertions(+), 701 deletions(-)

(limited to 'fw/fe310/eos/eve')

diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c
index d625fec..f4aae01 100644
--- a/fw/fe310/eos/eve/eve.c
+++ b/fw/fe310/eos/eve/eve.c
@@ -364,24 +364,38 @@ void eve_brightness(uint8_t b) {
 
 static int _init(int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir) {
     uint8_t chipid = 0;
-    uint16_t timeout = 0;
+    uint8_t reset = 0x07;
+    uint16_t timeout;
 
-    eve_command(EVE_RST_PULSE, 0);
+    eve_command(EVE_CORERST, 0);
     eve_command(EVE_CLKEXT, 0);
+    eve_command(EVE_CLKSEL, 0x46);      /* set clock to 72 MHz */
     eve_command(EVE_ACTIVE, 0);         /* start EVE */
+    eve_time_sleep(40);
 
-    while (chipid != 0x7C) {            /* if chipid is not 0x7c, continue to read it until it is, EVE needs a moment for it's power on self-test and configuration */
+    timeout = 0;
+    while (chipid != 0x7c) {            /* if chipid is not 0x7c, continue to read it until it is, EVE needs a moment for it's power on self-test and configuration */
         eve_time_sleep(1);
         chipid = eve_read8(REG_ID);
         timeout++;
         if (timeout > 400) return EVE_ERR;
     }
 
-    eve_write8(REG_PWM_DUTY, 0);
+    timeout = 0;
+    while (reset != 0x00) {             /* check if EVE is in working status */
+        eve_time_sleep(1);
+        reset = eve_read8(REG_CPURESET) & 0x07;
+		timeout++;
+		if(timeout > 50) return EVE_ERR;
+	}
+
+    eve_write32(REG_FREQUENCY, 72000000);   /* tell EVE that we changed the frequency from default to 72MHz for BT8xx */
+
+    eve_write8(REG_PWM_DUTY, 0x00);
     eve_write16(REG_GPIOX_DIR, 0x8000 | (gpio_dir & 0x0f));
     eve_write16(REG_GPIOX, 0);
 
-    /* Initialize Display */
+    /* initialize display */
     eve_write16(REG_HCYCLE,  EVE_HCYCLE);   /* total number of clocks per line, incl front/back porch */
     eve_write16(REG_HOFFSET, EVE_HOFFSET);  /* start of active line */
     eve_write16(REG_HSYNC0,  EVE_HSYNC0);   /* start of horizontal sync pulse */
@@ -398,7 +412,7 @@ static int _init(int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir)
 
     /* do not set PCLK yet - wait for just after the first display list */
 
-    /* disable Audio */
+    /* disable audio */
     eve_write16(REG_SOUND, 0x0000);         /* set synthesizer to silence */
     eve_write8(REG_VOL_SOUND, 0x00);        /* turn synthesizer volume off */
     eve_write8(REG_VOL_PB, 0x00);           /* turn recorded audio volume off */
@@ -414,40 +428,6 @@ static int _init(int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir)
     eve_write16(REG_GPIOX, 0x8000);         /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIOX_DIR by default */
     eve_write8(REG_PCLK, EVE_PCLK);         /* now start clocking data to the LCD panel */
 
-    /* configure Touch */
-    eve_write16(REG_TOUCH_CONFIG, 0xb81);                   /* enable touch low power mode: 0xb81 - default: 0x381 */
-    eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);       /* enable touch */
-    eve_write16(REG_TOUCH_RZTHRESH, EVE_TOUCH_RZTHRESH);    /* eliminate any false touches */
-
-    if (touch_calibrate) {
-        eve_write8(REG_PWM_DUTY, 0x40);
-        eve_cmd_dl(CMD_DLSTART);
-        eve_cmd_dl(CLEAR_COLOR_RGB(0,0,0));
-        eve_cmd_dl(CLEAR(1,1,1));
-        eve_cmd(CMD_TEXT, "hhhhs", EVE_HSIZE/2, EVE_VSIZE/2, 27, EVE_OPT_CENTER, "Please tap on the dot.");
-        eve_cmd(CMD_CALIBRATE, "w", 0);
-        eve_cmd_dl(DISPLAY());
-        eve_cmd_dl(CMD_SWAP);
-        eve_cmd_exec(1);
-        eve_write8(REG_PWM_DUTY, 0);
-
-        touch_matrix[0] = eve_read32(REG_TOUCH_TRANSFORM_A);
-        touch_matrix[1] = eve_read32(REG_TOUCH_TRANSFORM_B);
-        touch_matrix[2] = eve_read32(REG_TOUCH_TRANSFORM_C);
-        touch_matrix[3] = eve_read32(REG_TOUCH_TRANSFORM_D);
-        touch_matrix[4] = eve_read32(REG_TOUCH_TRANSFORM_E);
-        touch_matrix[5] = eve_read32(REG_TOUCH_TRANSFORM_F);
-    } else {
-        eve_write32(REG_TOUCH_TRANSFORM_A, touch_matrix[0]);
-        eve_write32(REG_TOUCH_TRANSFORM_B, touch_matrix[1]);
-        eve_write32(REG_TOUCH_TRANSFORM_C, touch_matrix[2]);
-        eve_write32(REG_TOUCH_TRANSFORM_D, touch_matrix[3]);
-        eve_write32(REG_TOUCH_TRANSFORM_E, touch_matrix[4]);
-        eve_write32(REG_TOUCH_TRANSFORM_F, touch_matrix[5]);
-    }
-
-    eve_write8(REG_CTOUCH_EXTENDED, 0x00);
-
     eve_cmd(CMD_SETROTATE, "w", 2);
     eve_cmd_exec(1);
 
@@ -467,7 +447,7 @@ int eve_init(int pwr_on, int touch_calibrate, uint32_t *touch_matrix, uint8_t gp
         eve_active();
     }
 
-    eve_touch_init();
+    eve_touch_init(pwr_on, touch_calibrate, touch_matrix);
     eve_platform_init();
 
     eve_spi_stop();
diff --git a/fw/fe310/eos/eve/eve_config.h b/fw/fe310/eos/eve/eve_config.h
index 882ea89..6b9b0a6 100755
--- a/fw/fe310/eos/eve/eve_config.h
+++ b/fw/fe310/eos/eve/eve_config.h
@@ -33,7 +33,7 @@
 #define EVE_PCLK            (1L)                            /* 60MHz / REG_PCLK = PCLK frequency - 30 MHz */
 #define EVE_CSPREAD         (0L)                            /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */
 #define EVE_TOUCH_RZTHRESH  (1200L)                         /* touch-sensitivity */
-#define EVE_HAS_CRYSTAL
-#define FT81X_ENABLE
+
+#define EVE_GEN             4
 
 #endif /* EVE_CONFIG_H */
diff --git a/fw/fe310/eos/eve/eve_def.h b/fw/fe310/eos/eve/eve_def.h
index 25e4927..e607320 100755
--- a/fw/fe310/eos/eve/eve_def.h
+++ b/fw/fe310/eos/eve/eve_def.h
@@ -76,345 +76,496 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
 #ifndef EVE_H_
 #define EVE_H_
 
+/* Memory */
+#define EVE_RAM_G               0x00000000
+#define EVE_ROM_CHIPID          0x000C0000
+#define EVE_ROM_FONT            0x001E0000
+#define EVE_ROM_FONT_ADDR       0x002FFFFC
+#define EVE_RAM_DL              0x00300000
+#define EVE_RAM_REG             0x00302000
+#define EVE_RAM_CMD             0x00308000
 
-#define DL_CLEAR		0x26000000UL /* requires OR'd arguments */
-#define DL_CLEAR_RGB	0x02000000UL /* requires OR'd arguments */
-#define DL_COLOR_RGB	0x04000000UL /* requires OR'd arguments */
-#define DL_POINT_SIZE	0x0D000000UL /* requires OR'd arguments */
-#define DL_END			0x21000000UL
-#define DL_BEGIN		0x1F000000UL /* requires OR'd arguments */
-#define DL_DISPLAY		0x00000000UL
+/* Memory buffer sizes */
+#define EVE_RAM_G_SIZE          (1024*1024UL)
+#define EVE_CMDFIFO_SIZE        (4*1024UL)
+#define EVE_RAM_DL_SIZE         (8*1024UL)
+
+#define DL_CLEAR                0x26000000UL /* requires OR'd arguments */
+#define DL_CLEAR_RGB            0x02000000UL /* requires OR'd arguments */
+#define DL_COLOR_RGB            0x04000000UL /* requires OR'd arguments */
+#define DL_POINT_SIZE           0x0D000000UL /* requires OR'd arguments */
+#define DL_END                  0x21000000UL
+#define DL_BEGIN                0x1F000000UL /* requires OR'd arguments */
+#define DL_DISPLAY              0x00000000UL
 
-#define CLR_COL              0x4
-#define CLR_STN              0x2
-#define CLR_TAG              0x1
+#define CLR_COL                 0x4
+#define CLR_STN                 0x2
+#define CLR_TAG                 0x1
 
 
 /* Host commands */
-#define EVE_ACTIVE	0x00  /* place FT8xx in active state */
-#define EVE_STANDBY	0x41  /* place FT8xx in Standby (clk running) */
-#define EVE_SLEEP	0x42  /* place FT8xx in Sleep (clk off) */
-#define EVE_PWRDOWN	0x50  /* place FT8xx in Power Down (core off) */
-#define EVE_CLKEXT	0x44  /* select external clock source */
-#define EVE_CLKINT	0x48  /* select internal clock source */
-#define EVE_CORERST	0x68  /* reset core - all registers default and processors reset */
-#define EVE_CLK48M	0x62  /* select 48MHz PLL output */
-#define EVE_CLK36M	0x61  /* select 36MHz PLL output */
-
-
-/* defines used for graphics commands */
-#define EVE_NEVER                0UL
-#define EVE_LESS                 1UL
-#define EVE_LEQUAL               2UL
-#define EVE_GREATER              3UL
-#define EVE_GEQUAL               4UL
-#define EVE_EQUAL                5UL
-#define EVE_NOTEQUAL             6UL
-#define EVE_ALWAYS               7UL
+#define EVE_ACTIVE              0x00 /* place FT8xx in active state */
+#define EVE_STANDBY             0x41 /* place FT8xx in Standby (clk running) */
+#define EVE_SLEEP               0x42 /* place FT8xx in Sleep (clk off) */
+#define EVE_PWRDOWN             0x50 /* place FT8xx in Power Down (core off) */
+#define EVE_CLKEXT              0x44 /* select external clock source */
+#define EVE_CLKINT              0x48 /* select internal clock source */
+#define EVE_CORERST             0x68 /* reset core - all registers default and processors reset */
+#define EVE_CLK48M              0x62 /* select 48MHz PLL output */
+#define EVE_CLK36M              0x61 /* select 36MHz PLL output */
+#define EVE_CLKSEL              0x61 /* configure system clock */
+#define EVE_RST_PULSE           0x68 /* reset core - all registers default and processors reset */
+#define EVE_PINDRIVE            0x70 /* setup drive strength for various pins */
+#define EVE_PIN_PD_STATE        0x71 /* setup how pins behave during power down */
+
+
+/* Graphic command options */
+#define EVE_NEVER               0UL
+#define EVE_LESS                1UL
+#define EVE_LEQUAL              2UL
+#define EVE_GREATER             3UL
+#define EVE_GEQUAL              4UL
+#define EVE_EQUAL               5UL
+#define EVE_NOTEQUAL            6UL
+#define EVE_ALWAYS              7UL
 
 
 /* Bitmap formats */
-#define EVE_ARGB1555             0UL
-#define EVE_L1                   1UL
-#define EVE_L4                   2UL
-#define EVE_L8                   3UL
-#define EVE_RGB332               4UL
-#define EVE_ARGB2                5UL
-#define EVE_ARGB4                6UL
-#define EVE_RGB565               7UL
-#define EVE_PALETTED             8UL
-#define EVE_TEXT8X8              9UL
-#define EVE_TEXTVGA              10UL
-#define EVE_BARGRAPH             11UL
+#define EVE_ARGB1555            0UL
+#define EVE_L1                  1UL
+#define EVE_L4                  2UL
+#define EVE_L8                  3UL
+#define EVE_RGB332              4UL
+#define EVE_ARGB2               5UL
+#define EVE_ARGB4               6UL
+#define EVE_RGB565              7UL
+#define EVE_PALETTED            8UL
+#define EVE_TEXT8X8             9UL
+#define EVE_TEXTVGA             10UL
+#define EVE_BARGRAPH            11UL
 
 
 /* Bitmap filter types */
-#define EVE_NEAREST              0UL
-#define EVE_BILINEAR             1UL
+#define EVE_NEAREST             0UL
+#define EVE_BILINEAR            1UL
 
 
 /* Bitmap wrap types */
-#define EVE_BORDER               0UL
-#define EVE_REPEAT               1UL
+#define EVE_BORDER              0UL
+#define EVE_REPEAT              1UL
 
 
 /* Stencil defines */
-#define EVE_KEEP                 1UL
-#define EVE_REPLACE              2UL
-#define EVE_INCR                 3UL
-#define EVE_DECR                 4UL
-#define EVE_INVERT               5UL
+#define EVE_KEEP                1UL
+#define EVE_REPLACE             2UL
+#define EVE_INCR                3UL
+#define EVE_DECR                4UL
+#define EVE_INVERT              5UL
 
 
 /* Graphics display list swap defines */
-#define EVE_DLSWAP_DONE          0UL
-#define EVE_DLSWAP_LINE          1UL
-#define EVE_DLSWAP_FRAME         2UL
+#define EVE_DLSWAP_DONE         0UL
+#define EVE_DLSWAP_LINE         1UL
+#define EVE_DLSWAP_FRAME        2UL
 
 
 /* Interrupt bits */
-#define EVE_INT_SWAP             0x01
-#define EVE_INT_TOUCH            0x02
-#define EVE_INT_TAG              0x04
-#define EVE_INT_SOUND            0x08
-#define EVE_INT_PLAYBACK         0x10
-#define EVE_INT_CMDEMPTY         0x20
-#define EVE_INT_CMDFLAG          0x40
-#define EVE_INT_CONVCOMPLETE     0x80
+#define EVE_INT_SWAP            0x01
+#define EVE_INT_TOUCH           0x02
+#define EVE_INT_TAG             0x04
+#define EVE_INT_SOUND           0x08
+#define EVE_INT_PLAYBACK        0x10
+#define EVE_INT_CMDEMPTY        0x20
+#define EVE_INT_CMDFLAG         0x40
+#define EVE_INT_CONVCOMPLETE    0x80
 
 
 /* Touch mode */
-#define EVE_TMODE_OFF        	0
-#define EVE_TMODE_ONESHOT    	1
-#define EVE_TMODE_FRAME      	2
-#define EVE_TMODE_CONTINUOUS 	3
+#define EVE_TMODE_OFF           0
+#define EVE_TMODE_ONESHOT       1
+#define EVE_TMODE_FRAME         2
+#define EVE_TMODE_CONTINUOUS    3
 
 
 /* Alpha blending */
-#define EVE_ZERO                 0UL
-#define EVE_ONE                  1UL
-#define EVE_SRC_ALPHA            2UL
-#define EVE_DST_ALPHA            3UL
-#define EVE_ONE_MINUS_SRC_ALPHA  4UL
-#define EVE_ONE_MINUS_DST_ALPHA  5UL
+#define EVE_ZERO                0UL
+#define EVE_ONE                 1UL
+#define EVE_SRC_ALPHA           2UL
+#define EVE_DST_ALPHA           3UL
+#define EVE_ONE_MINUS_SRC_ALPHA 4UL
+#define EVE_ONE_MINUS_DST_ALPHA 5UL
 
 
 /* Graphics primitives */
-#define EVE_BITMAPS              1UL
-#define EVE_POINTS               2UL
-#define EVE_LINES                3UL
-#define EVE_LINE_STRIP           4UL
-#define EVE_EDGE_STRIP_R         5UL
-#define EVE_EDGE_STRIP_L         6UL
-#define EVE_EDGE_STRIP_A         7UL
-#define EVE_EDGE_STRIP_B         8UL
-#define EVE_RECTS                9UL
-
-
-/* Widget command */
-#define EVE_OPT_MONO             1
-#define EVE_OPT_NODL             2
-#define EVE_OPT_FLAT             256
-#define EVE_OPT_CENTERX          512
-#define EVE_OPT_CENTERY          1024
-#define EVE_OPT_CENTER           (EVE_OPT_CENTERX | EVE_OPT_CENTERY)
-#define EVE_OPT_NOBACK           4096
-#define EVE_OPT_NOTICKS          8192
-#define EVE_OPT_NOHM             16384
-#define EVE_OPT_NOPOINTER        16384
-#define EVE_OPT_NOSECS           32768
-#define EVE_OPT_NOHANDS          49152
-#define EVE_OPT_RIGHTX           2048
-#define EVE_OPT_SIGNED           256
-
+#define EVE_BITMAPS             1UL
+#define EVE_POINTS              2UL
+#define EVE_LINES               3UL
+#define EVE_LINE_STRIP          4UL
+#define EVE_EDGE_STRIP_R        5UL
+#define EVE_EDGE_STRIP_L        6UL
+#define EVE_EDGE_STRIP_A        7UL
+#define EVE_EDGE_STRIP_B        8UL
+#define EVE_RECTS               9UL
+#define EVE_INT_G8              18UL
+#define EVE_INT_L8C             12UL
+#define EVE_INT_VGA             13UL
+#define EVE_PALETTED565         14UL
+#define EVE_PALETTED4444        15UL
+#define EVE_PALETTED8           16UL
+#define EVE_L2                  17UL
+
+
+/* Widget command options */
+#define EVE_OPT_MONO            1
+#define EVE_OPT_NODL            2
+#define EVE_OPT_FLAT            256
+#define EVE_OPT_CENTERX         512
+#define EVE_OPT_CENTERY         1024
+#define EVE_OPT_CENTER          (EVE_OPT_CENTERX | EVE_OPT_CENTERY)
+#define EVE_OPT_NOBACK          4096
+#define EVE_OPT_NOTICKS         8192
+#define EVE_OPT_NOHM            16384
+#define EVE_OPT_NOPOINTER       16384
+#define EVE_OPT_NOSECS          32768
+#define EVE_OPT_NOHANDS         49152
+#define EVE_OPT_RIGHTX          2048
+#define EVE_OPT_SIGNED          256
+
+#define EVE_OPT_MEDIAFIFO       16UL
+#define EVE_OPT_FULLSCREEN      8UL
+#define EVE_OPT_NOTEAR          4UL
+#define EVE_OPT_SOUND           32UL
+
+
+/* ADC */
+#define EVE_ADC_DIFFERENTIAL    1UL
+#define EVE_ADC_SINGLE_ENDED    0UL
 
 /* Defines related to inbuilt font */
-#define EVE_NUMCHAR_PERFONT 		(128L)  /* number of font characters per bitmap handle */
-#define EVE_FONT_TABLE_SIZE 		(148L)  /* size of the font table - utilized for loopup by the graphics engine */
-#define EVE_FONT_TABLE_POINTER	(0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */
+#define EVE_NUMCHAR_PERFONT     (128L) /* number of font characters per bitmap handle */
+#define EVE_FONT_TABLE_SIZE     (148L) /* size of the font table - utilized for loopup by the graphics engine */
+#define EVE_FONT_TABLE_POINTER  (0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */
 
 
 /* Audio sample type defines */
-#define EVE_LINEAR_SAMPLES       0UL	/* 8bit signed samples */
-#define EVE_ULAW_SAMPLES         1UL	/* 8bit ulaw samples */
-#define EVE_ADPCM_SAMPLES        2UL	/* 4bit ima adpcm samples */
+#define EVE_LINEAR_SAMPLES      0UL /* 8bit signed samples */
+#define EVE_ULAW_SAMPLES        1UL /* 8bit ulaw samples */
+#define EVE_ADPCM_SAMPLES       2UL /* 4bit ima adpcm samples */
 
 
 /* Synthesized sound */
-#define EVE_SILENCE              0x00
-#define EVE_SQUAREWAVE           0x01
-#define EVE_SINEWAVE             0x02
-#define EVE_SAWTOOTH             0x03
-#define EVE_TRIANGLE             0x04
-#define EVE_BEEPING              0x05
-#define EVE_ALARM                0x06
-#define EVE_WARBLE               0x07
-#define EVE_CAROUSEL             0x08
-#define EVE_PIPS(n)              (0x0F + (n))
-#define EVE_HARP                 0x40
-#define EVE_XYLOPHONE            0x41
-#define EVE_TUBA                 0x42
-#define EVE_GLOCKENSPIEL         0x43
-#define EVE_ORGAN                0x44
-#define EVE_TRUMPET              0x45
-#define EVE_PIANO                0x46
-#define EVE_CHIMES               0x47
-#define EVE_MUSICBOX             0x48
-#define EVE_BELL                 0x49
-#define EVE_CLICK                0x50
-#define EVE_SWITCH               0x51
-#define EVE_COWBELL              0x52
-#define EVE_NOTCH                0x53
-#define EVE_HIHAT                0x54
-#define EVE_KICKDRUM             0x55
-#define EVE_POP                  0x56
-#define EVE_CLACK                0x57
-#define EVE_CHACK                0x58
-#define EVE_MUTE                 0x60
-#define EVE_UNMUTE               0x61
+#define EVE_SILENCE             0x00
+#define EVE_SQUAREWAVE          0x01
+#define EVE_SINEWAVE            0x02
+#define EVE_SAWTOOTH            0x03
+#define EVE_TRIANGLE            0x04
+#define EVE_BEEPING             0x05
+#define EVE_ALARM               0x06
+#define EVE_WARBLE              0x07
+#define EVE_CAROUSEL            0x08
+#define EVE_PIPS(n)             (0x0F + (n))
+#define EVE_HARP                0x40
+#define EVE_XYLOPHONE           0x41
+#define EVE_TUBA                0x42
+#define EVE_GLOCKENSPIEL        0x43
+#define EVE_ORGAN               0x44
+#define EVE_TRUMPET             0x45
+#define EVE_PIANO               0x46
+#define EVE_CHIMES              0x47
+#define EVE_MUSICBOX            0x48
+#define EVE_BELL                0x49
+#define EVE_CLICK               0x50
+#define EVE_SWITCH              0x51
+#define EVE_COWBELL             0x52
+#define EVE_NOTCH               0x53
+#define EVE_HIHAT               0x54
+#define EVE_KICKDRUM            0x55
+#define EVE_POP                 0x56
+#define EVE_CLACK               0x57
+#define EVE_CHACK               0x58
+#define EVE_MUTE                0x60
+#define EVE_UNMUTE              0x61
 
 
 /* Synthesized sound frequencies, midi note */
-#define EVE_MIDI_A0   21
-#define EVE_MIDI_A_0  22
-#define EVE_MIDI_B0   23
-#define EVE_MIDI_C1   24
-#define EVE_MIDI_C_1  25
-#define EVE_MIDI_D1   26
-#define EVE_MIDI_D_1  27
-#define EVE_MIDI_E1   28
-#define EVE_MIDI_F1   29
-#define EVE_MIDI_F_1  30
-#define EVE_MIDI_G1   31
-#define EVE_MIDI_G_1  32
-#define EVE_MIDI_A1   33
-#define EVE_MIDI_A_1  34
-#define EVE_MIDI_B1   35
-#define EVE_MIDI_C2   36
-#define EVE_MIDI_C_2  37
-#define EVE_MIDI_D2   38
-#define EVE_MIDI_D_2  39
-#define EVE_MIDI_E2   40
-#define EVE_MIDI_F2   41
-#define EVE_MIDI_F_2  42
-#define EVE_MIDI_G2   43
-#define EVE_MIDI_G_2  44
-#define EVE_MIDI_A2   45
-#define EVE_MIDI_A_2  46
-#define EVE_MIDI_B2   47
-#define EVE_MIDI_C3   48
-#define EVE_MIDI_C_3  49
-#define EVE_MIDI_D3   50
-#define EVE_MIDI_D_3  51
-#define EVE_MIDI_E3   52
-#define EVE_MIDI_F3   53
-#define EVE_MIDI_F_3  54
-#define EVE_MIDI_G3   55
-#define EVE_MIDI_G_3  56
-#define EVE_MIDI_A3   57
-#define EVE_MIDI_A_3  58
-#define EVE_MIDI_B3   59
-#define EVE_MIDI_C4   60
-#define EVE_MIDI_C_4  61
-#define EVE_MIDI_D4   62
-#define EVE_MIDI_D_4  63
-#define EVE_MIDI_E4   64
-#define EVE_MIDI_F4   65
-#define EVE_MIDI_F_4  66
-#define EVE_MIDI_G4   67
-#define EVE_MIDI_G_4  68
-#define EVE_MIDI_A4   69
-#define EVE_MIDI_A_4  70
-#define EVE_MIDI_B4   71
-#define EVE_MIDI_C5   72
-#define EVE_MIDI_C_5  73
-#define EVE_MIDI_D5   74
-#define EVE_MIDI_D_5  75
-#define EVE_MIDI_E5   76
-#define EVE_MIDI_F5   77
-#define EVE_MIDI_F_5  78
-#define EVE_MIDI_G5   79
-#define EVE_MIDI_G_5  80
-#define EVE_MIDI_A5   81
-#define EVE_MIDI_A_5  82
-#define EVE_MIDI_B5   83
-#define EVE_MIDI_C6   84
-#define EVE_MIDI_C_6  85
-#define EVE_MIDI_D6   86
-#define EVE_MIDI_D_6  87
-#define EVE_MIDI_E6   88
-#define EVE_MIDI_F6   89
-#define EVE_MIDI_F_6  90
-#define EVE_MIDI_G6   91
-#define EVE_MIDI_G_6  92
-#define EVE_MIDI_A6   93
-#define EVE_MIDI_A_6  94
-#define EVE_MIDI_B6   95
-#define EVE_MIDI_C7   96
-#define EVE_MIDI_C_7  97
-#define EVE_MIDI_D7   98
-#define EVE_MIDI_D_7  99
-#define EVE_MIDI_E7   100
-#define EVE_MIDI_F7   101
-#define EVE_MIDI_F_7  102
-#define EVE_MIDI_G7   103
-#define EVE_MIDI_G_7  104
-#define EVE_MIDI_A7   105
-#define EVE_MIDI_A_7  106
-#define EVE_MIDI_B7   107
-#define EVE_MIDI_C8   108
+#define EVE_MIDI_A0             21
+#define EVE_MIDI_A_0            22
+#define EVE_MIDI_B0             23
+#define EVE_MIDI_C1             24
+#define EVE_MIDI_C_1            25
+#define EVE_MIDI_D1             26
+#define EVE_MIDI_D_1            27
+#define EVE_MIDI_E1             28
+#define EVE_MIDI_F1             29
+#define EVE_MIDI_F_1            30
+#define EVE_MIDI_G1             31
+#define EVE_MIDI_G_1            32
+#define EVE_MIDI_A1             33
+#define EVE_MIDI_A_1            34
+#define EVE_MIDI_B1             35
+#define EVE_MIDI_C2             36
+#define EVE_MIDI_C_2            37
+#define EVE_MIDI_D2             38
+#define EVE_MIDI_D_2            39
+#define EVE_MIDI_E2             40
+#define EVE_MIDI_F2             41
+#define EVE_MIDI_F_2            42
+#define EVE_MIDI_G2             43
+#define EVE_MIDI_G_2            44
+#define EVE_MIDI_A2             45
+#define EVE_MIDI_A_2            46
+#define EVE_MIDI_B2             47
+#define EVE_MIDI_C3             48
+#define EVE_MIDI_C_3            49
+#define EVE_MIDI_D3             50
+#define EVE_MIDI_D_3            51
+#define EVE_MIDI_E3             52
+#define EVE_MIDI_F3             53
+#define EVE_MIDI_F_3            54
+#define EVE_MIDI_G3             55
+#define EVE_MIDI_G_3            56
+#define EVE_MIDI_A3             57
+#define EVE_MIDI_A_3            58
+#define EVE_MIDI_B3             59
+#define EVE_MIDI_C4             60
+#define EVE_MIDI_C_4            61
+#define EVE_MIDI_D4             62
+#define EVE_MIDI_D_4            63
+#define EVE_MIDI_E4             64
+#define EVE_MIDI_F4             65
+#define EVE_MIDI_F_4            66
+#define EVE_MIDI_G4             67
+#define EVE_MIDI_G_4            68
+#define EVE_MIDI_A4             69
+#define EVE_MIDI_A_4            70
+#define EVE_MIDI_B4             71
+#define EVE_MIDI_C5             72
+#define EVE_MIDI_C_5            73
+#define EVE_MIDI_D5             74
+#define EVE_MIDI_D_5            75
+#define EVE_MIDI_E5             76
+#define EVE_MIDI_F5             77
+#define EVE_MIDI_F_5            78
+#define EVE_MIDI_G5             79
+#define EVE_MIDI_G_5            80
+#define EVE_MIDI_A5             81
+#define EVE_MIDI_A_5            82
+#define EVE_MIDI_B5             83
+#define EVE_MIDI_C6             84
+#define EVE_MIDI_C_6            85
+#define EVE_MIDI_D6             86
+#define EVE_MIDI_D_6            87
+#define EVE_MIDI_E6             88
+#define EVE_MIDI_F6             89
+#define EVE_MIDI_F_6            90
+#define EVE_MIDI_G6             91
+#define EVE_MIDI_G_6            92
+#define EVE_MIDI_A6             93
+#define EVE_MIDI_A_6            94
+#define EVE_MIDI_B6             95
+#define EVE_MIDI_C7             96
+#define EVE_MIDI_C_7            97
+#define EVE_MIDI_D7             98
+#define EVE_MIDI_D_7            99
+#define EVE_MIDI_E7             100
+#define EVE_MIDI_F7             101
+#define EVE_MIDI_F_7            102
+#define EVE_MIDI_G7             103
+#define EVE_MIDI_G_7            104
+#define EVE_MIDI_A7             105
+#define EVE_MIDI_A_7            106
+#define EVE_MIDI_B7             107
+#define EVE_MIDI_C8             108
 
 
 /* GPIO bits */
-#define EVE_GPIO0	0
-#define EVE_GPIO1	1	/* default gpio pin for audio shutdown, 1 - enable, 0 - disable */
-#define EVE_GPIO7	7	/* default gpio pin for display enable, 1 - enable, 0 - disable */
+#define EVE_GPIO0               0
+#define EVE_GPIO1               1 /* default gpio pin for audio shutdown, 1 - enable, 0 - disable */
+#define EVE_GPIO7               7 /* default gpio pin for display enable, 1 - enable, 0 - disable */
 
 
 /* Display rotation */
-#define EVE_DISPLAY_0		0	/* 0 degrees rotation */
-#define EVE_DISPLAY_180		1	/* 180 degrees rotation */
+#define EVE_DISPLAY_0           0 /* 0 degrees rotation */
+#define EVE_DISPLAY_180         1 /* 180 degrees rotation */
 
 
 /* commands common to EVE/EVE2/EVE3 */
-#define CMD_APPEND				0xFFFFFF1E
-#define CMD_BGCOLOR				0xFFFFFF09
-#define CMD_BUTTON				0xFFFFFF0D
-#define CMD_CALIBRATE			0xFFFFFF15
-#define CMD_CLOCK				0xFFFFFF14
-#define CMD_COLDSTART			0xFFFFFF32
-#define CMD_DIAL				0xFFFFFF2D
-#define CMD_DLSTART				0xFFFFFF00
-#define CMD_FGCOLOR				0xFFFFFF0A
-#define CMD_GAUGE				0xFFFFFF13
-#define CMD_GETMATRIX			0xFFFFFF33
-#define CMD_GETPROPS			0xFFFFFF25
-#define CMD_GETPTR				0xFFFFFF23
-#define CMD_GRADCOLOR			0xFFFFFF34
-#define CMD_GRADIENT			0xFFFFFF0B
-#define CMD_INFLATE				0xFFFFFF22
-#define CMD_INTERRUPT			0xFFFFFF02
-#define CMD_KEYS				0xFFFFFF0E
-#define CMD_LOADIDENTITY		0xFFFFFF26
-#define CMD_LOADIMAGE			0xFFFFFF24
-#define CMD_LOGO				0xFFFFFF31
-#define CMD_MEMCPY				0xFFFFFF1D
-#define CMD_MEMCRC				0xFFFFFF18
-#define CMD_MEMSET				0xFFFFFF1B
-#define CMD_MEMWRITE			0xFFFFFF1A
-#define CMD_MEMZERO				0xFFFFFF1C
-#define CMD_NUMBER				0xFFFFFF2E
-#define CMD_PROGRESS			0xFFFFFF0F
-#define CMD_REGREAD				0xFFFFFF19
-#define CMD_ROTATE				0xFFFFFF29
-#define CMD_SCALE				0xFFFFFF28
-#define CMD_SCREENSAVER			0xFFFFFF2F
-#define CMD_SCROLLBAR			0xFFFFFF11
-#define CMD_SETFONT				0xFFFFFF2B
-#define CMD_SETMATRIX			0xFFFFFF2A
-#define CMD_SKETCH				0xFFFFFF30
-#define CMD_SLIDER				0xFFFFFF10
-#define CMD_SNAPSHOT			0xFFFFFF1F
-#define CMD_SPINNER				0xFFFFFF16
-#define CMD_STOP				0xFFFFFF17
-#define CMD_SWAP				0xFFFFFF01
-#define CMD_TEXT				0xFFFFFF0C
-#define CMD_TOGGLE				0xFFFFFF12
-#define CMD_TRACK				0xFFFFFF2C
-#define CMD_TRANSLATE			0xFFFFFF27
+#define CMD_APPEND              0xFFFFFF1E
+#define CMD_BGCOLOR             0xFFFFFF09
+#define CMD_BUTTON              0xFFFFFF0D
+#define CMD_CALIBRATE           0xFFFFFF15
+#define CMD_CLOCK               0xFFFFFF14
+#define CMD_COLDSTART           0xFFFFFF32
+#define CMD_DIAL                0xFFFFFF2D
+#define CMD_DLSTART             0xFFFFFF00
+#define CMD_FGCOLOR             0xFFFFFF0A
+#define CMD_GAUGE               0xFFFFFF13
+#define CMD_GETMATRIX           0xFFFFFF33
+#define CMD_GETPROPS            0xFFFFFF25
+#define CMD_GETPTR              0xFFFFFF23
+#define CMD_GRADCOLOR           0xFFFFFF34
+#define CMD_GRADIENT            0xFFFFFF0B
+#define CMD_INFLATE             0xFFFFFF22
+#define CMD_INTERRUPT           0xFFFFFF02
+#define CMD_KEYS                0xFFFFFF0E
+#define CMD_LOADIDENTITY        0xFFFFFF26
+#define CMD_LOADIMAGE           0xFFFFFF24
+#define CMD_MEDIAFIFO           0xFFFFFF39
+#define CMD_LOGO                0xFFFFFF31
+#define CMD_MEMCPY              0xFFFFFF1D
+#define CMD_MEMCRC              0xFFFFFF18
+#define CMD_MEMSET              0xFFFFFF1B
+#define CMD_MEMWRITE            0xFFFFFF1A
+#define CMD_MEMZERO             0xFFFFFF1C
+#define CMD_NUMBER              0xFFFFFF2E
+#define CMD_PLAYVIDEO           0xFFFFFF3A
+#define CMD_PROGRESS            0xFFFFFF0F
+#define CMD_REGREAD             0xFFFFFF19
+#define CMD_ROMFONT             0xFFFFFF3F
+#define CMD_ROTATE              0xFFFFFF29
+#define CMD_SCALE               0xFFFFFF28
+#define CMD_SCREENSAVER         0xFFFFFF2F
+#define CMD_SCROLLBAR           0xFFFFFF11
+#define CMD_SETBASE             0xFFFFFF38
+#define CMD_SETBITMAP           0xFFFFFF43
+#define CMD_SETFONT             0xFFFFFF2B
+#define CMD_SETFONT2            0xFFFFFF3B
+#define CMD_SETMATRIX           0xFFFFFF2A
+#define CMD_SETROTATE           0xFFFFFF36
+#define CMD_SETSCRATCH          0xFFFFFF3C
+#define CMD_SKETCH              0xFFFFFF30
+#define CMD_SLIDER              0xFFFFFF10
+#define CMD_SNAPSHOT            0xFFFFFF1F
+#define CMD_SNAPSHOT2           0xFFFFFF37
+#define CMD_SPINNER             0xFFFFFF16
+#define CMD_STOP                0xFFFFFF17
+#define CMD_SWAP                0xFFFFFF01
+#define CMD_TEXT                0xFFFFFF0C
+#define CMD_TOGGLE              0xFFFFFF12
+#define CMD_TRACK               0xFFFFFF2C
+#define CMD_TRANSLATE           0xFFFFFF27
+#define CMD_VIDEOFRAME          0xFFFFFF41
+#define CMD_VIDEOSTART          0xFFFFFF40
 
 
 /* the following are undocumented commands that therefore should not be used */
 #if 0
-#define CMD_CRC					0xFFFFFF03
-#define CMD_HAMMERAUX			0xFFFFFF04
-#define CMD_MARCH				0xFFFFFF05
-#define CMD_IDCT				0xFFFFFF06
-#define CMD_EXECUTE				0xFFFFFF07
-#define CMD_GETPOINT			0xFFFFFF08
-#define CMD_TOUCH_TRANSFORM		0xFFFFFF20
+#define CMD_CRC                 0xFFFFFF03
+#define CMD_HAMMERAUX           0xFFFFFF04
+#define CMD_MARCH               0xFFFFFF05
+#define CMD_IDCT                0xFFFFFF06
+#define CMD_EXECUTE             0xFFFFFF07
+#define CMD_GETPOINT            0xFFFFFF08
+#define CMD_TOUCH_TRANSFORM     0xFFFFFF20
 #endif
 
+/* Registers */
+#define REG_ANA_COMP            0x00302184 /* only listed in datasheet */
+#define REG_BIST_EN             0x00302174 /* only listed in datasheet */
+#define REG_CLOCK               0x00302008
+#define REG_CMDB_SPACE          0x00302574
+#define REG_CMDB_WRITE          0x00302578
+#define REG_CMD_DL              0x00302100
+#define REG_CMD_READ            0x003020f8
+#define REG_CMD_WRITE           0x003020fc
+#define REG_CPURESET            0x00302020
+#define REG_CSPREAD             0x00302068
+#define REG_CTOUCH_EXTENDED     0x00302108
+#define REG_CTOUCH_TOUCH0_XY    0x00302124 /* only listed in datasheet */
+#define REG_CTOUCH_TOUCH4_X     0x0030216c
+#define REG_CTOUCH_TOUCH4_Y     0x00302120
+#define REG_CTOUCH_TOUCH1_XY    0x0030211c
+#define REG_CTOUCH_TOUCH2_XY    0x0030218c
+#define REG_CTOUCH_TOUCH3_XY    0x00302190
+#define REG_TOUCH_CONFIG        0x00302168
+#define REG_DATESTAMP           0x00302564 /* only listed in datasheet */
+#define REG_DITHER              0x00302060
+#define REG_DLSWAP              0x00302054
+#define REG_FRAMES              0x00302004
+#define REG_FREQUENCY           0x0030200c
+#define REG_GPIO                0x00302094
+#define REG_GPIOX               0x0030209c
+#define REG_GPIOX_DIR           0x00302098
+#define REG_GPIO_DIR            0x00302090
+#define REG_HCYCLE              0x0030202c
+#define REG_HOFFSET             0x00302030
+#define REG_HSIZE               0x00302034
+#define REG_HSYNC0              0x00302038
+#define REG_HSYNC1              0x0030203c
+#define REG_ID                  0x00302000
+#define REG_INT_EN              0x003020ac
+#define REG_INT_FLAGS           0x003020a8
+#define REG_INT_MASK            0x003020b0
+#define REG_MACRO_0             0x003020d8
+#define REG_MACRO_1             0x003020dc
+#define REG_MEDIAFIFO_READ      0x00309014 /* only listed in programmers guide */
+#define REG_MEDIAFIFO_WRITE     0x00309018 /* only listed in programmers guide */
+#define REG_OUTBITS             0x0030205c
+#define REG_PCLK                0x00302070
+#define REG_PCLK_POL            0x0030206c
+#define REG_PLAY                0x0030208c
+#define REG_PLAYBACK_FORMAT     0x003020c4
+#define REG_PLAYBACK_FREQ       0x003020c0
+#define REG_PLAYBACK_LENGTH     0x003020b8
+#define REG_PLAYBACK_LOOP       0x003020c8
+#define REG_PLAYBACK_PLAY       0x003020cc
+#define REG_PLAYBACK_READPTR    0x003020bc
+#define REG_PLAYBACK_START      0x003020b4
+#define REG_PWM_DUTY            0x003020d4
+#define REG_PWM_HZ              0x003020d0
+#define REG_RENDERMODE          0x00302010 /* only listed in datasheet */
+#define REG_ROTATE              0x00302058
+#define REG_SNAPFORMAT          0x0030201c /* only listed in datasheet */
+#define REG_SNAPSHOT            0x00302018 /* only listed in datasheet */
+#define REG_SNAPY               0x00302014 /* only listed in datasheet */
+#define REG_SOUND               0x00302088
+#define REG_SPI_WIDTH           0x00302188 /* listed with false offset in programmers guide V1.1 */
+#define REG_SWIZZLE             0x00302064
+#define REG_TAG                 0x0030207c
+#define REG_TAG_X               0x00302074
+#define REG_TAG_Y               0x00302078
+#define REG_TAP_CRC             0x00302024 /* only listed in datasheet */
+#define REG_TAP_MASK            0x00302028 /* only listed in datasheet */
+#define REG_TOUCH_ADC_MODE      0x00302108
+#define REG_TOUCH_CHARGE        0x0030210c
+#define REG_TOUCH_DIRECT_XY     0x0030218c
+#define REG_TOUCH_DIRECT_Z1Z2   0x00302190
+#define REG_TOUCH_MODE          0x00302104
+#define REG_TOUCH_OVERSAMPLE    0x00302114
+#define REG_TOUCH_RAW_XY        0x0030211c
+#define REG_TOUCH_RZ            0x00302120
+#define REG_TOUCH_RZTHRESH      0x00302118
+#define REG_TOUCH_SCREEN_XY     0x00302124
+#define REG_TOUCH_SETTLE        0x00302110
+#define REG_TOUCH_TAG           0x0030212c
+#define REG_TOUCH_TAG1          0x00302134 /* only listed in datasheet */
+#define REG_TOUCH_TAG1_XY       0x00302130 /* only listed in datasheet */
+#define REG_TOUCH_TAG2          0x0030213c /* only listed in datasheet */
+#define REG_TOUCH_TAG2_XY       0x00302138 /* only listed in datasheet */
+#define REG_TOUCH_TAG3          0x00302144 /* only listed in datasheet */
+#define REG_TOUCH_TAG3_XY       0x00302140 /* only listed in datasheet */
+#define REG_TOUCH_TAG4          0x0030214c /* only listed in datasheet */
+#define REG_TOUCH_TAG4_XY       0x00302148 /* only listed in datasheet */
+#define REG_TOUCH_TAG_XY        0x00302128
+#define REG_TOUCH_TRANSFORM_A   0x00302150
+#define REG_TOUCH_TRANSFORM_B   0x00302154
+#define REG_TOUCH_TRANSFORM_C   0x00302158
+#define REG_TOUCH_TRANSFORM_D   0x0030215c
+#define REG_TOUCH_TRANSFORM_E   0x00302160
+#define REG_TOUCH_TRANSFORM_F   0x00302164
+#define REG_TRACKER             0x00309000 /* only listed in programmers guide */
+#define REG_TRACKER_1           0x00309004 /* only listed in programmers guide */
+#define REG_TRACKER_2           0x00309008 /* only listed in programmers guide */
+#define REG_TRACKER_3           0x0030900c /* only listed in programmers guide */
+#define REG_TRACKER_4           0x00309010 /* only listed in programmers guide */
+#define REG_TRIM                0x00302180
+#define REG_VCYCLE              0x00302040
+#define REG_VOFFSET             0x00302044
+#define REG_VOL_PB              0x00302080
+#define REG_VOL_SOUND           0x00302084
+#define REG_VSIZE               0x00302048
+#define REG_VSYNC0              0x0030204c
+#define REG_VSYNC1              0x00302050
 
 /* FT8xx graphics engine specific macros useful for static display list generation */
 #define ALPHA_FUNC(func,ref) ((9UL<<24)|(((func)&7UL)<<8)|(((ref)&255UL)<<0))
@@ -422,6 +573,9 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
 #define BITMAP_HANDLE(handle) ((5UL<<24)|(((handle)&31UL)<<0))
 #define BITMAP_LAYOUT(format,linestride,height) ((7UL<<24)|(((format)&31UL)<<19)|(((linestride)&1023UL)<<9)|(((height)&511UL)<<0))
 #define BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((8UL<<24)|(((filter)&1UL)<<20)|(((wrapx)&1UL)<<19)|(((wrapy)&1UL)<<18)|(((width)&511UL)<<9)|(((height)&511UL)<<0))
+#define BITMAP_LAYOUT_H(linestride,height) ((40UL<<24)|((((linestride&0xC00)>>10)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0))
+#define BITMAP_SIZE_H(width,height) ((41UL<<24)|((((width&0x600)>>9)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0))
+#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&4194303UL)<<0))
 #define BITMAP_TRANSFORM_A(a) ((21UL<<24)|(((a)&131071UL)<<0))
 #define BITMAP_TRANSFORM_B(b) ((22UL<<24)|(((b)&131071UL)<<0))
 #define BITMAP_TRANSFORM_C(c) ((23UL<<24)|(((c)&16777215UL)<<0))
@@ -444,10 +598,14 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
 #define JUMP(dest) ((30UL<<24)|(((dest)&65535UL)<<0))
 #define LINE_WIDTH(width) ((14UL<<24)|(((width)&4095UL)<<0))
 #define MACRO(m) ((37UL<<24)|(((m)&1UL)<<0))
+#define NOP() ((45UL<<24))
+#define PALETTE_SOURCE(addr) ((42UL<<24)|(((addr)&4194303UL)<<0))
 #define POINT_SIZE(size) ((13UL<<24)|(((size)&8191UL)<<0))
 #define RESTORE_CONTEXT() ((35UL<<24))
 #define RETURN() ((36UL<<24))
 #define SAVE_CONTEXT() ((34UL<<24))
+#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&4095UL)<<12)|(((height)&4095UL)<<0))
+#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&2047UL)<<11)|(((y)&2047UL)<<0))
 #define STENCIL_FUNC(func,ref,mask) ((10UL<<24)|(((func)&7UL)<<16)|(((ref)&255UL)<<8)|(((mask)&255UL)<<0))
 #define STENCIL_MASK(mask) ((19UL<<24)|(((mask)&255UL)<<0))
 #define STENCIL_OP(sfail,spass) ((12UL<<24)|(((sfail)&7UL)<<3)|(((spass)&7UL)<<0))
@@ -455,86 +613,89 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
 #define TAG_MASK(mask) ((20UL<<24)|(((mask)&1UL)<<0))
 #define VERTEX2F(x,y) ((1UL<<30)|(((x)&32767UL)<<15)|(((y)&32767UL)<<0))
 #define VERTEX2II(x,y,handle,cell) ((2UL<<30)|(((x)&511UL)<<21)|(((y)&511UL)<<12)|(((handle)&31UL)<<7)|(((cell)&127UL)<<0))
+#define VERTEX_FORMAT(frac) ((39UL<<24)|(((frac)&7UL)<<0))
+#define VERTEX_TRANSLATE_X(x) ((43UL<<24)|(((x)&131071UL)<<0))
+#define VERTEX_TRANSLATE_Y(y) ((44UL<<24)|(((y)&131071UL)<<0))
 
 
-/* ----------------- BT81x exclusive definitions -----------------*/
-#if defined (BT81X_ENABLE)
+/* EVE Generation 3: BT815 / BT816 definitions -----------------*/
+#if EVE_GEN > 2
 
-#define EVE_GLFORMAT 31UL	/* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */
+#define EVE_GLFORMAT            31UL /* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */
 
-#define DL_BITMAP_EXT_FORMAT	0x2E000000 /* requires OR'd arguments */
+#define DL_BITMAP_EXT_FORMAT    0x2E000000 /* requires OR'd arguments */
 
 /* extended Bitmap formats */
-#define EVE_COMPRESSED_RGBA_ASTC_4x4_KHR   37808UL
-#define EVE_COMPRESSED_RGBA_ASTC_5x4_KHR   37809UL
-#define EVE_COMPRESSED_RGBA_ASTC_5x5_KHR   37810UL
-#define EVE_COMPRESSED_RGBA_ASTC_6x5_KHR   37811UL
-#define EVE_COMPRESSED_RGBA_ASTC_6x6_KHR   37812UL
-#define EVE_COMPRESSED_RGBA_ASTC_8x5_KHR   37813UL
-#define EVE_COMPRESSED_RGBA_ASTC_8x6_KHR   37814UL
-#define EVE_COMPRESSED_RGBA_ASTC_8x8_KHR   37815UL
-#define EVE_COMPRESSED_RGBA_ASTC_10x5_KHR  37816UL
-#define EVE_COMPRESSED_RGBA_ASTC_10x6_KHR  37817UL
-#define EVE_COMPRESSED_RGBA_ASTC_10x8_KHR  37818UL
-#define EVE_COMPRESSED_RGBA_ASTC_10x10_KHR 37819UL
-#define EVE_COMPRESSED_RGBA_ASTC_12x10_KHR 37820UL
-#define EVE_COMPRESSED_RGBA_ASTC_12x12_KHR 37821UL
+#define EVE_COMPRESSED_RGBA_ASTC_4x4_KHR    37808UL
+#define EVE_COMPRESSED_RGBA_ASTC_5x4_KHR    37809UL
+#define EVE_COMPRESSED_RGBA_ASTC_5x5_KHR    37810UL
+#define EVE_COMPRESSED_RGBA_ASTC_6x5_KHR    37811UL
+#define EVE_COMPRESSED_RGBA_ASTC_6x6_KHR    37812UL
+#define EVE_COMPRESSED_RGBA_ASTC_8x5_KHR    37813UL
+#define EVE_COMPRESSED_RGBA_ASTC_8x6_KHR    37814UL
+#define EVE_COMPRESSED_RGBA_ASTC_8x8_KHR    37815UL
+#define EVE_COMPRESSED_RGBA_ASTC_10x5_KHR   37816UL
+#define EVE_COMPRESSED_RGBA_ASTC_10x6_KHR   37817UL
+#define EVE_COMPRESSED_RGBA_ASTC_10x8_KHR   37818UL
+#define EVE_COMPRESSED_RGBA_ASTC_10x10_KHR  37819UL
+#define EVE_COMPRESSED_RGBA_ASTC_12x10_KHR  37820UL
+#define EVE_COMPRESSED_RGBA_ASTC_12x12_KHR  37821UL
 
 
 #define EVE_RAM_ERR_REPORT      0x309800UL /* max 128 bytes null terminated string */
 #define EVE_RAM_FLASH           0x800000UL
 #define EVE_RAM_FLASH_POSTBLOB  0x801000UL
 
-#define EVE_OPT_FLASH  64UL
-#define EVE_OPT_FORMAT 4096UL
-#define EVE_OPT_FILL   8192UL
+#define EVE_OPT_FLASH           64UL
+#define EVE_OPT_FORMAT          4096UL
+#define EVE_OPT_FILL            8192UL
 
 
 /* additional commands for BT81x */
-#define CMD_BITMAP_TRANSFORM 0xFFFFFF21
-#define CMD_SYNC             0xFFFFFF42		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */
-#define CMD_FLASHERASE       0xFFFFFF44		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */
-#define CMD_FLASHWRITE       0xFFFFFF45
-#define CMD_FLASHREAD        0xFFFFFF46
-#define CMD_FLASHUPDATE      0xFFFFFF47
-#define CMD_FLASHDETACH      0xFFFFFF48		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */
-#define CMD_FLASHATTACH      0xFFFFFF49		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */
-#define CMD_FLASHFAST        0xFFFFFF4A
-#define CMD_FLASHSPIDESEL    0xFFFFFF4B		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */
-#define CMD_FLASHSPITX       0xFFFFFF4C
-#define CMD_FLASHSPIRX       0xFFFFFF4D
-#define CMD_FLASHSOURCE      0xFFFFFF4E
-#define CMD_CLEARCACHE       0xFFFFFF4F		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */
-#define CMD_INFLATE2         0xFFFFFF50
-#define CMD_ROTATEAROUND     0xFFFFFF51
-#define CMD_RESETFONTS       0xFFFFFF52		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */
-#define CMD_ANIMSTART        0xFFFFFF53
-#define CMD_ANIMSTOP         0xFFFFFF54
-#define CMD_ANIMXY           0xFFFFFF55
-#define CMD_ANIMDRAW         0xFFFFFF56
-#define CMD_GRADIENTA        0xFFFFFF57
-#define CMD_FILLWIDTH        0xFFFFFF58
-#define CMD_APPENDF          0xFFFFFF59
-#define CMD_ANIMFRAME        0xFFFFFF5A
-#define CMD_VIDEOSTARTF      0xFFFFFF5F		/* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */
+#define CMD_BITMAP_TRANSFORM    0xFFFFFF21
+#define CMD_SYNC                0xFFFFFF42 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */
+#define CMD_FLASHERASE          0xFFFFFF44 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */
+#define CMD_FLASHWRITE          0xFFFFFF45
+#define CMD_FLASHREAD           0xFFFFFF46
+#define CMD_FLASHUPDATE         0xFFFFFF47
+#define CMD_FLASHDETACH         0xFFFFFF48 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */
+#define CMD_FLASHATTACH         0xFFFFFF49 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */
+#define CMD_FLASHFAST           0xFFFFFF4A
+#define CMD_FLASHSPIDESEL       0xFFFFFF4B /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */
+#define CMD_FLASHSPITX          0xFFFFFF4C
+#define CMD_FLASHSPIRX          0xFFFFFF4D
+#define CMD_FLASHSOURCE         0xFFFFFF4E
+#define CMD_CLEARCACHE          0xFFFFFF4F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */
+#define CMD_INFLATE2            0xFFFFFF50
+#define CMD_ROTATEAROUND        0xFFFFFF51
+#define CMD_RESETFONTS          0xFFFFFF52 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */
+#define CMD_ANIMSTART           0xFFFFFF53
+#define CMD_ANIMSTOP            0xFFFFFF54
+#define CMD_ANIMXY              0xFFFFFF55
+#define CMD_ANIMDRAW            0xFFFFFF56
+#define CMD_GRADIENTA           0xFFFFFF57
+#define CMD_FILLWIDTH           0xFFFFFF58
+#define CMD_APPENDF             0xFFFFFF59
+#define CMD_ANIMFRAME           0xFFFFFF5A
+#define CMD_VIDEOSTARTF         0xFFFFFF5F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */
 
 #if 0
 /* some undocumented commands for BT81x */
-#define CMD_NOP              0xFFFFFF5B
-#define CMD_SHA1             0xFFFFFF5C
-#define CMD_HMAC             0xFFFFFF5D
-#define CMD_LAST_            0xFFFFFF5E
+#define CMD_NOP                 0xFFFFFF5B
+#define CMD_SHA1                0xFFFFFF5C
+#define CMD_HMAC                0xFFFFFF5D
+#define CMD_LAST_               0xFFFFFF5E
 
 #endif
 
 
 /* additional registers for BT81x */
-#define REG_ADAPTIVE_FRAMERATE 0x30257cUL
-#define REG_PLAYBACK_PAUSE     0x3025ecUL
-#define REG_FLASH_STATUS       0x3025f0UL
-#define REG_FLASH_SIZE         0x309024UL
-#define REG_PLAY_CONTROL       0x30914eUL
-#define REG_COPRO_PATCH_DTR    0x309162UL
+#define REG_ADAPTIVE_FRAMERATE  0x30257cUL
+#define REG_PLAYBACK_PAUSE      0x3025ecUL
+#define REG_FLASH_STATUS        0x3025f0UL
+#define REG_FLASH_SIZE          0x309024UL
+#define REG_PLAY_CONTROL        0x30914eUL
+#define REG_COPRO_PATCH_DTR     0x309162UL
 
 
 /* BT81x graphics engine specific macros */
@@ -558,315 +719,39 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
 #define BITMAP_TRANSFORM_D(d) BITMAP_TRANSFORM_D_EXT(0,d)
 #define BITMAP_TRANSFORM_E(e) BITMAP_TRANSFORM_E_EXT(0,e)
 
-#endif
-
-/* ----------------- FT81x / BT81x exclusive definitions -----------------*/
-#if defined (FT81X_ENABLE)
-
-
-/* Host commands */
-#define EVE_CLKSEL			0x61 /* configure system clock */
-#define EVE_RST_PULSE		0x68 /* reset core - all registers default and processors reset */
-#define EVE_PINDRIVE		0x70 /* setup drive strength for various pins */
-#define EVE_PIN_PD_STATE	0x71 /* setup how pins behave during power down */
-
-
-/* Memory definitions */
-#define EVE_RAM_G			0x000000UL
-#define EVE_ROM_CHIPID		0x0C0000UL
-#define EVE_ROM_FONT		0x1E0000UL
-#define EVE_ROM_FONT_ADDR	0x2FFFFCUL
-#define EVE_RAM_DL			0x300000UL
-#define EVE_RAM_REG			0x302000UL
-#define EVE_RAM_CMD			0x308000UL
-
-
-/* Memory buffer sizes */
-#define EVE_RAM_G_SIZE		1024*1024L
-#define EVE_CMDFIFO_SIZE	4*1024L
-#define EVE_RAM_DL_SIZE		8*1024L
-
-
-/* various additional defines for FT81x */
-#define EVE_ADC_DIFFERENTIAL     1UL
-#define EVE_ADC_SINGLE_ENDED     0UL
-
-#define EVE_INT_G8               18UL
-#define EVE_INT_L8C              12UL
-#define EVE_INT_VGA              13UL
-
-#define EVE_OPT_MEDIAFIFO        16UL
-#define EVE_OPT_FULLSCREEN       8UL
-#define EVE_OPT_NOTEAR           4UL
-#define EVE_OPT_SOUND            32UL
-
-#define EVE_PALETTED565          14UL
-#define EVE_PALETTED4444         15UL
-#define EVE_PALETTED8            16UL
-#define EVE_L2                   17UL
-
-
-/* additional commands for FT81x */
-#define CMD_MEDIAFIFO			0xFFFFFF39
-#define CMD_PLAYVIDEO			0xFFFFFF3A
-#define CMD_ROMFONT				0xFFFFFF3F
-#define CMD_SETBASE				0xFFFFFF38
-#define CMD_SETBITMAP			0xFFFFFF43
-#define CMD_SETFONT2			0xFFFFFF3B
-#define CMD_SETROTATE			0xFFFFFF36
-#define CMD_SETSCRATCH			0xFFFFFF3C
-#define CMD_SNAPSHOT2			0xFFFFFF37
-#define CMD_VIDEOFRAME			0xFFFFFF41
-#define CMD_VIDEOSTART			0xFFFFFF40
-
-
-/* the following are undocumented commands that therefore should not be used */
-#if 0
-#define CMD_CSKETCH				0xFFFFFF35
-#define CMD_INT_RAMSHARED		0xFFFFFF3D
-#define CMD_INT_SWLOADIMAGE		0xFFFFFF3E
-#endif
-
-
-/* Register definitions */
-#define REG_ANA_COMP         0x302184UL /* only listed in datasheet */
-#define REG_BIST_EN          0x302174UL /* only listed in datasheet */
-#define REG_CLOCK            0x302008UL
-#define REG_CMDB_SPACE       0x302574UL
-#define REG_CMDB_WRITE       0x302578UL
-#define REG_CMD_DL           0x302100UL
-#define REG_CMD_READ         0x3020f8UL
-#define REG_CMD_WRITE        0x3020fcUL
-#define REG_CPURESET         0x302020UL
-#define REG_CSPREAD          0x302068UL
-#define REG_CTOUCH_EXTENDED  0x302108UL
-#define REG_CTOUCH_TOUCH0_XY 0x302124UL /* only listed in datasheet */
-#define REG_CTOUCH_TOUCH4_X  0x30216cUL
-#define REG_CTOUCH_TOUCH4_Y  0x302120UL
-#define REG_CTOUCH_TOUCH1_XY 0x30211cUL
-#define REG_CTOUCH_TOUCH2_XY 0x30218cUL
-#define REG_CTOUCH_TOUCH3_XY 0x302190UL
-#define REG_TOUCH_CONFIG     0x302168UL
-#define REG_DATESTAMP        0x302564UL /* only listed in datasheet */
-#define REG_DITHER           0x302060UL
-#define REG_DLSWAP           0x302054UL
-#define REG_FRAMES           0x302004UL
-#define REG_FREQUENCY        0x30200cUL
-#define REG_GPIO             0x302094UL
-#define REG_GPIOX            0x30209cUL
-#define REG_GPIOX_DIR        0x302098UL
-#define REG_GPIO_DIR         0x302090UL
-#define REG_HCYCLE           0x30202cUL
-#define REG_HOFFSET          0x302030UL
-#define REG_HSIZE            0x302034UL
-#define REG_HSYNC0           0x302038UL
-#define REG_HSYNC1           0x30203cUL
-#define REG_ID               0x302000UL
-#define REG_INT_EN           0x3020acUL
-#define REG_INT_FLAGS        0x3020a8UL
-#define REG_INT_MASK         0x3020b0UL
-#define REG_MACRO_0          0x3020d8UL
-#define REG_MACRO_1          0x3020dcUL
-#define REG_MEDIAFIFO_READ   0x309014UL /* only listed in programmers guide */
-#define REG_MEDIAFIFO_WRITE  0x309018UL /* only listed in programmers guide */
-#define REG_OUTBITS          0x30205cUL
-#define REG_PCLK             0x302070UL
-#define REG_PCLK_POL         0x30206cUL
-#define REG_PLAY             0x30208cUL
-#define REG_PLAYBACK_FORMAT  0x3020c4UL
-#define REG_PLAYBACK_FREQ    0x3020c0UL
-#define REG_PLAYBACK_LENGTH  0x3020b8UL
-#define REG_PLAYBACK_LOOP    0x3020c8UL
-#define REG_PLAYBACK_PLAY    0x3020ccUL
-#define REG_PLAYBACK_READPTR 0x3020bcUL
-#define REG_PLAYBACK_START   0x3020b4UL
-#define REG_PWM_DUTY         0x3020d4UL
-#define REG_PWM_HZ           0x3020d0UL
-#define REG_RENDERMODE       0x302010UL /* only listed in datasheet */
-#define REG_ROTATE           0x302058UL
-#define REG_SNAPFORMAT       0x30201cUL /* only listed in datasheet */
-#define REG_SNAPSHOT         0x302018UL /* only listed in datasheet */
-#define REG_SNAPY            0x302014UL /* only listed in datasheet */
-#define REG_SOUND            0x302088UL
-#define REG_SPI_WIDTH        0x302188UL /* listed with false offset in programmers guide V1.1 */
-#define REG_SWIZZLE          0x302064UL
-#define REG_TAG              0x30207cUL
-#define REG_TAG_X            0x302074UL
-#define REG_TAG_Y            0x302078UL
-#define REG_TAP_CRC          0x302024UL /* only listed in datasheet */
-#define REG_TAP_MASK         0x302028UL /* only listed in datasheet */
-#define REG_TOUCH_ADC_MODE   0x302108UL
-#define REG_TOUCH_CHARGE     0x30210cUL
-#define REG_TOUCH_DIRECT_XY  0x30218cUL
-#define REG_TOUCH_DIRECT_Z1Z2 0x302190UL
-#define REG_TOUCH_MODE       0x302104UL
-#define REG_TOUCH_OVERSAMPLE 0x302114UL
-#define REG_TOUCH_RAW_XY     0x30211cUL
-#define REG_TOUCH_RZ         0x302120UL
-#define REG_TOUCH_RZTHRESH   0x302118UL
-#define REG_TOUCH_SCREEN_XY  0x302124UL
-#define REG_TOUCH_SETTLE     0x302110UL
-#define REG_TOUCH_TAG        0x30212cUL
-#define REG_TOUCH_TAG1       0x302134UL /* only listed in datasheet */
-#define REG_TOUCH_TAG1_XY    0x302130UL /* only listed in datasheet */
-#define REG_TOUCH_TAG2       0x30213cUL /* only listed in datasheet */
-#define REG_TOUCH_TAG2_XY    0x302138UL /* only listed in datasheet */
-#define REG_TOUCH_TAG3       0x302144UL /* only listed in datasheet */
-#define REG_TOUCH_TAG3_XY    0x302140UL /* only listed in datasheet */
-#define REG_TOUCH_TAG4       0x30214cUL /* only listed in datasheet */
-#define REG_TOUCH_TAG4_XY    0x302148UL /* only listed in datasheet */
-#define REG_TOUCH_TAG_XY     0x302128UL
-#define REG_TOUCH_TRANSFORM_A 0x302150UL
-#define REG_TOUCH_TRANSFORM_B 0x302154UL
-#define REG_TOUCH_TRANSFORM_C 0x302158UL
-#define REG_TOUCH_TRANSFORM_D 0x30215cUL
-#define REG_TOUCH_TRANSFORM_E 0x302160UL
-#define REG_TOUCH_TRANSFORM_F 0x302164UL
-#define REG_TRACKER          0x309000UL /* only listed in programmers guide */
-#define REG_TRACKER_1        0x309004UL /* only listed in programmers guide */
-#define REG_TRACKER_2        0x309008UL /* only listed in programmers guide */
-#define REG_TRACKER_3        0x30900cUL /* only listed in programmers guide */
-#define REG_TRACKER_4        0x309010UL /* only listed in programmers guide */
-#define REG_TRIM             0x302180UL
-#define REG_VCYCLE           0x302040UL
-#define REG_VOFFSET          0x302044UL
-#define REG_VOL_PB           0x302080UL
-#define REG_VOL_SOUND        0x302084UL
-#define REG_VSIZE            0x302048UL
-#define REG_VSYNC0           0x30204cUL
-#define REG_VSYNC1           0x302050UL
-
-#if 0
-#define REG_BUSYBITS         0x3020e8UL /* only listed as "reserved" in datasheet */
-#define REG_CRC              0x302178UL /* only listed as "reserved" in datasheet */
-#define REG_SPI_EARLY_TX     0x30217cUL /* only listed as "reserved" in datasheet */
-#define REG_ROMSUB_SEL       0x3020f0UL /* only listed as "reserved" in datasheet */
-#define REG_TOUCH_FAULT      0x302170UL /* only listed as "reserved" in datasheet */
-#endif
-
-
-/* FT81x graphics engine specific macros useful for static display list generation */
-
-/* beware, these are different to FTDIs implementation as these take the original values as parameters and not only the upper bits */
-#define BITMAP_LAYOUT_H(linestride,height) ((40UL<<24)|((((linestride&0xC00)>>10)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0))
-#define BITMAP_SIZE_H(width,height) ((41UL<<24)|((((width&0x600)>>9)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0))
-
-#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&4194303UL)<<0))
-#define NOP() ((45UL<<24))
-#define PALETTE_SOURCE(addr) ((42UL<<24)|(((addr)&4194303UL)<<0))
-#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&4095UL)<<12)|(((height)&4095UL)<<0))
-#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&2047UL)<<11)|(((y)&2047UL)<<0))
-#define VERTEX_FORMAT(frac) ((39UL<<24)|(((frac)&7UL)<<0))
-#define VERTEX_TRANSLATE_X(x) ((43UL<<24)|(((x)&131071UL)<<0))
-#define VERTEX_TRANSLATE_Y(y) ((44UL<<24)|(((y)&131071UL)<<0))
-
-
-
-/* ----------------- FT80x exclusive definitions -----------------*/
-#else
-
-/* Memory definitions */
-#define EVE_RAM_G			0x000000UL
-#define EVE_ROM_CHIPID		0x0C0000UL
-#define EVE_ROM_FONT		0x0BB23CUL
-#define EVE_ROM_FONT_ADDR	0x0FFFFCUL
-#define EVE_RAM_DL			0x100000UL
-#define EVE_RAM_PAL			0x102000UL
-#define EVE_RAM_CMD			0x108000UL
-#define EVE_RAM_SCREENSHOT	0x1C2000UL
-
-
-/* Memory buffer sizes */
-#define EVE_RAM_G_SIZE		256*1024L
-#define EVE_CMDFIFO_SIZE	4*1024L
-#define EVE_RAM_DL_SIZE		8*1024L
-#define EVE_RAM_PAL_SIZE	1*1024L
-
-
-/* Register definitions */
-#define REG_ID					0x102400UL
-#define REG_FRAMES				0x102404UL
-#define REG_CLOCK				0x102408UL
-#define REG_FREQUENCY			0x10240CUL
-#define REG_SCREENSHOT_EN		0x102410UL
-#define REG_SCREENSHOT_Y		0x102414UL
-#define REG_SCREENSHOT_START	0x102418UL
-#define REG_CPURESET 			0x10241CUL
-#define REG_TAP_CRC 			0x102420UL
-#define REG_TAP_MASK 			0x102424UL
-#define REG_HCYCLE 				0x102428UL
-#define REG_HOFFSET 			0x10242CUL
-#define REG_HSIZE 				0x102430UL
-#define REG_HSYNC0 				0x102434UL
-#define REG_HSYNC1 				0x102438UL
-#define REG_VCYCLE 				0x10243CUL
-#define REG_VOFFSET 			0x102440UL
-#define REG_VSIZE 				0x102444UL
-#define REG_VSYNC0 				0x102448UL
-#define REG_VSYNC1 				0x10244CUL
-#define REG_DLSWAP 				0x102450UL
-#define REG_ROTATE 				0x102454UL
-#define REG_OUTBITS 			0x102458UL
-#define REG_DITHER 				0x10245CUL
-#define REG_SWIZZLE 			0x102460UL
-#define REG_CSPREAD 			0x102464UL
-#define REG_PCLK_POL 			0x102468UL
-#define REG_PCLK 				0x10246CUL
-#define REG_TAG_X 				0x102470UL
-#define REG_TAG_Y 				0x102474UL
-#define REG_TAG 				0x102478UL
-#define REG_VOL_PB 				0x10247CUL
-#define REG_VOL_SOUND 			0x102480UL
-#define REG_SOUND 				0x102484UL
-#define REG_PLAY 				0x102488UL
-#define REG_GPIO_DIR 			0x10248CUL
-#define REG_GPIO 				0x102490UL
-#define REG_INT_FLAGS       	0x102498UL
-#define REG_INT_EN          	0x10249CUL
-#define REG_INT_MASK        	0x1024A0UL
-#define REG_PLAYBACK_START  	0x1024A4UL
-#define REG_PLAYBACK_LENGTH  	0x1024A8UL
-#define REG_PLAYBACK_READPTR 	0x1024ACUL
-#define REG_PLAYBACK_FREQ    	0x1024B0UL
-#define REG_PLAYBACK_FORMAT  	0x1024B4UL
-#define REG_PLAYBACK_LOOP    	0x1024B8UL
-#define REG_PLAYBACK_PLAY   	0x1024BCUL
-#define REG_PWM_HZ          	0x1024C0UL
-#define REG_PWM_DUTY        	0x1024C4UL
-#define REG_MACRO_0         	0x1024C8UL
-#define REG_MACRO_1         	0x1024CCUL
-#define REG_SCREENSHOT_BUSY		0x1024D8UL
-#define REG_CMD_READ         	0x1024E4UL
-#define REG_CMD_WRITE        	0x1024E8UL
-#define REG_CMD_DL           	0x1024ECUL
-#define REG_TOUCH_MODE       	0x1024F0UL
-#define REG_TOUCH_ADC_MODE   	0x1024F4UL
-#define REG_TOUCH_CHARGE     	0x1024F8UL
-#define REG_TOUCH_SETTLE     	0x1024FCUL
-#define REG_TOUCH_OVERSAMPLE 	0x102500UL
-#define REG_TOUCH_RZTHRESH   	0x102504UL
-#define REG_TOUCH_RAW_XY     	0x102508UL
-#define REG_TOUCH_RZ         	0x10250CUL
-#define REG_TOUCH_SCREEN_XY  	0x102510UL
-#define REG_TOUCH_TAG_XY     	0x102514UL
-#define REG_TOUCH_TAG        	0x102518UL
-#define REG_TOUCH_TRANSFORM_A	0x10251CUL
-#define REG_TOUCH_TRANSFORM_B	0x102520UL
-#define REG_TOUCH_TRANSFORM_C	0x102524UL
-#define REG_TOUCH_TRANSFORM_D	0x102528UL
-#define REG_TOUCH_TRANSFORM_E	0x10252CUL
-#define REG_TOUCH_TRANSFORM_F	0x102530UL
-#define REG_SCREENSHOT_READ		0x102554UL
-#define REG_TRIM				0x10256CUL
-#define REG_TOUCH_DIRECT_XY 	0x102574UL
-#define REG_TOUCH_DIRECT_Z1Z2	0x102578UL
-#define REG_TRACKER				0x109000UL
-
-/* FT80x graphics engine specific macros useful for static display list generation */
-#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&1048575UL)<<0))
-#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&1023UL)<<10)|(((height)&1023UL)<<0))
-#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&511UL)<<9)|(((y)&511UL)<<0))
-
-#endif
-
-#endif /* EVE_H_ */
+#endif  /* EVE_GEN > 2 */
+
+/* EVE Generation 4: BT817 / BT818 definitions -----------------*/
+#if EVE_GEN > 3
+
+/* Commands for BT817 / BT818 */
+#define CMD_ANIMFRAMERAM        0xFFFFFF6D
+#define CMD_ANIMSTARTRAM        0xFFFFFF6E
+#define CMD_APILEVEL            0xFFFFFF63
+#define CMD_CALIBRATESUB        0xFFFFFF60
+#define CMD_CALLLIST            0xFFFFFF67
+#define CMD_ENDLIST             0xFFFFFF69 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_ENDLIST) */
+#define CMD_FLASHPROGRAM        0xFFFFFF70
+#define CMD_FONTCACHE           0xFFFFFF6B
+#define CMD_FONTCACHEQUERY      0xFFFFFF6C
+#define CMD_GETIMAGE            0xFFFFFF64
+#define CMD_HSF                 0xFFFFFF62
+#define CMD_LINETIME            0xFFFFFF5E
+#define CMD_NEWLIST             0xFFFFFF68
+#define CMD_PCLKFREQ            0xFFFFFF6A
+#define CMD_RETURN              0xFFFFFF66 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RETURN) */
+#define CMD_RUNANIM             0xFFFFFF6F
+#define CMD_TESTCARD            0xFFFFFF61 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_TESTCARD) */
+#define CMD_WAIT                0xFFFFFF65
+
+
+/* Registers for BT817 / BT818 */
+#define REG_UNDERRUN            0x0030260c
+#define REG_AH_HCYCLE_MAX       0x00302610
+#define REG_PCLK_FREQ           0x00302614
+#define REG_PCLK_2X             0x00302618
+#define REG_ANIM_ACTIVE         0x0030902C
+
+#endif  /*  EVE_GEN > 3 */
+
+#endif  /* EVE_H */
diff --git a/fw/fe310/eos/eve/eve_platform.c b/fw/fe310/eos/eve/eve_platform.c
index 6bc87bb..003f396 100644
--- a/fw/fe310/eos/eve/eve_platform.c
+++ b/fw/fe310/eos/eve/eve_platform.c
@@ -6,6 +6,8 @@
 #include "interrupt.h"
 #include "event.h"
 
+#include "board.h"
+
 #include "eve.h"
 #include "eve_platform.h"
 
@@ -54,8 +56,6 @@ void eve_platform_init(void) {
 
     GPIO_REG(GPIO_LOW_IE)       |=  (1 << EVE_PIN_INTR);
     eos_intr_set(INT_GPIO_BASE + EVE_PIN_INTR, IRQ_PRIORITY_UI, handle_intr);
-
-    eos_spi_set_div(EOS_SPI_DEV_EVE, 4);
 }
 
 void eve_spi_start(void) {
@@ -66,6 +66,14 @@ void eve_spi_stop(void) {
     eos_spi_deselect();
 }
 
+void eve_spi_set_fast(void) {
+    eos_spi_set_div(EOS_SPI_DEV_EVE, SPI_DIV_EVE);
+}
+
+void eve_spi_set_slow(void) {
+    eos_spi_set_div(EOS_SPI_DEV_EVE, SPI_DIV_EVE_SLOW);
+}
+
 #include <stdio.h>
 
 void *eve_malloc(size_t size) {
diff --git a/fw/fe310/eos/eve/eve_platform.h b/fw/fe310/eos/eve/eve_platform.h
index 7975fbc..83c1799 100644
--- a/fw/fe310/eos/eve/eve_platform.h
+++ b/fw/fe310/eos/eve/eve_platform.h
@@ -5,7 +5,6 @@
 #include "timer.h"
 
 #define EVE_ETYPE_INTR      1
-#define EVE_PIN_INTR        0
 
 #define EVE_RTC_FREQ        EOS_TIMER_RTC_FREQ
 
diff --git a/fw/fe310/eos/eve/eve_touch.c b/fw/fe310/eos/eve/eve_touch.c
index e75cf4e..aaa3788 100644
--- a/fw/fe310/eos/eve/eve_touch.c
+++ b/fw/fe310/eos/eve/eve_touch.c
@@ -299,7 +299,48 @@ void eve_handle_time(void) {
     }
 }
 
-void eve_touch_init(void) {
+static void _init(int touch_calibrate, uint32_t *touch_matrix) {
+    /* configure touch */
+    eve_write16(REG_TOUCH_CONFIG, 0xb81);                   /* enable touch low power mode: 0xb81 - default: 0x381 */
+    eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);       /* enable touch */
+    eve_write16(REG_TOUCH_RZTHRESH, EVE_TOUCH_RZTHRESH);    /* eliminate any false touches */
+
+    if (touch_calibrate) {
+        eve_write8(REG_PWM_DUTY, 0x40);
+        eve_cmd_dl(CMD_DLSTART);
+        eve_cmd_dl(CLEAR_COLOR_RGB(0,0,0));
+        eve_cmd_dl(CLEAR(1,1,1));
+        eve_cmd(CMD_TEXT, "hhhhs", EVE_HSIZE/2, EVE_VSIZE/2, 27, EVE_OPT_CENTER, "Please tap on the dot.");
+        eve_cmd(CMD_CALIBRATE, "w", 0);
+        eve_cmd_dl(DISPLAY());
+        eve_cmd_dl(CMD_SWAP);
+        eve_cmd_exec(1);
+        eve_write8(REG_PWM_DUTY, 0);
+
+        touch_matrix[0] = eve_read32(REG_TOUCH_TRANSFORM_A);
+        touch_matrix[1] = eve_read32(REG_TOUCH_TRANSFORM_B);
+        touch_matrix[2] = eve_read32(REG_TOUCH_TRANSFORM_C);
+        touch_matrix[3] = eve_read32(REG_TOUCH_TRANSFORM_D);
+        touch_matrix[4] = eve_read32(REG_TOUCH_TRANSFORM_E);
+        touch_matrix[5] = eve_read32(REG_TOUCH_TRANSFORM_F);
+    } else {
+        eve_write32(REG_TOUCH_TRANSFORM_A, touch_matrix[0]);
+        eve_write32(REG_TOUCH_TRANSFORM_B, touch_matrix[1]);
+        eve_write32(REG_TOUCH_TRANSFORM_C, touch_matrix[2]);
+        eve_write32(REG_TOUCH_TRANSFORM_D, touch_matrix[3]);
+        eve_write32(REG_TOUCH_TRANSFORM_E, touch_matrix[4]);
+        eve_write32(REG_TOUCH_TRANSFORM_F, touch_matrix[5]);
+    }
+
+    eve_write8(REG_CTOUCH_EXTENDED, 0x00);
+
+    /* configure interrupts */
+    eve_write8(REG_INT_MASK, touch_intr_mask);
+    eve_write8(REG_INT_EN, 0x01);
+    while(eve_read8(REG_INT_FLAGS));
+}
+
+void eve_touch_init(int pwr_on, int touch_calibrate, uint32_t *touch_matrix) {
     int i;
 
     eve_vtrack_init();
@@ -309,9 +350,7 @@ void eve_touch_init(void) {
         touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
     }
 
-    eve_write8(REG_INT_MASK, touch_intr_mask);
-    eve_write8(REG_INT_EN, 0x01);
-    while(eve_read8(REG_INT_FLAGS));
+    if (pwr_on) _init(touch_calibrate, touch_matrix);
 }
 
 void eve_touch_set_handler(eve_touch_handler_t handler, void *param) {
diff --git a/fw/fe310/eos/eve/eve_touch.h b/fw/fe310/eos/eve/eve_touch.h
index 1bb77ba..d9e9c9a 100644
--- a/fw/fe310/eos/eve/eve_touch.h
+++ b/fw/fe310/eos/eve/eve_touch.h
@@ -101,7 +101,7 @@ typedef void (*eve_touch_handler_t) (EVETouch *, uint16_t, uint8_t, void *);
 void eve_handle_touch(void);
 void eve_handle_time(void);
 
-void eve_touch_init(void);
+void eve_touch_init(int pwr_on, int touch_calibrate, uint32_t *touch_matrix);
 void eve_touch_set_handler(eve_touch_handler_t handler, void *handler_param);
 EVETouch *eve_touch_get(int i);
 int8_t eve_touch_get_idx(EVETouch *touch);
-- 
cgit v1.2.3