lvgl_esp32_drivers/lvgl_tft/FT81x.c

323 lines
11 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include "driver/gpio.h"
#include "FT81x.h"
#include "EVE.h"
#include "EVE_commands.h"
/* some pre-definded colors */
#define RED 0xff0000UL
#define ORANGE 0xffa500UL
#define GREEN 0x00ff00UL
#define BLUE 0x0000ffUL
#define BLUE_1 0x5dade2L
#define YELLOW 0xffff00UL
#define PINK 0xff00ffUL
#define PURPLE 0x800080UL
#define WHITE 0xffffffUL
#define BLACK 0x000000UL
/* memory-map defines */
#define SCREEN_BITMAP_ADDR 0x00000000 // full screen buffer (0x00000000 - 0x000BBE40)
uint8_t tft_active = 0;
void touch_calibrate(void)
{
/* send pre-recorded touch calibration values, depending on the display the code is compiled for */
#if defined (EVE_CFAF240400C1_030SC)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000ed11);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00001139);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff76809);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000000);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010690);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffadf2e);
#endif
#if defined (EVE_CFAF320240F_035T)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00005614);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0000009e);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff43422);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0xffffbda4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00f8f2ef);
#endif
#if defined (EVE_CFAF480128A0_039TC)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00010485);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0000017f);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffb0bd3);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000073);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000e293);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00069904);
#endif
#if defined (EVE_CFAF800480E0_050SC)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000107f9);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffff8c);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff451ae);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000000d2);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000feac);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffcfaaf);
#endif
#if defined (EVE_PAF90)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00000159);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0001019c);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff93625);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00010157);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00000000);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0000c101);
#endif
#if defined (EVE_RiTFT43)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000062cd);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xfffffe45);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff45e0a);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000001a3);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00005b33);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFFbb870);
#endif
#if defined (EVE_EVE2_38)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00007bed);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000001b0);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff60aa5);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000095);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0xffffdcda);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00829c08);
#endif
#if defined (EVE_EVE2_35G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000109E4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000007A6);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFEC1EBA);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000072C);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0001096A);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFF469CF);
#endif
#if defined (EVE_EVE2_43G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000a1ff);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000680);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xffe54cc2);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xffffff53);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000912c);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffe628d);
#endif
#if defined (EVE_EVE2_50G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000109E4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000007A6);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFEC1EBA);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000072C);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0001096A);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFF469CF);
#endif
#if defined (EVE_EVE2_70G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000105BC);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xFFFFFA8A);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0x00004670);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xFFFFFF75);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010074);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFFF14C8);
#endif
#if defined (EVE_NHD_35)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000f78b);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000427);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffcedf8);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xfffffba4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000f756);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0009279e);
#endif
#if defined (EVE_RVT70)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000074df);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000000e6);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffd5474);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000001af);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00007e79);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xffe9a63c);
#endif
#if defined (EVE_FT811CB_HY50HD)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 66353);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 712);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 4293876677);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 4294966157);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 67516);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 418276);
#endif
#if defined (EVE_ADAM101)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000101E3);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000114);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFF5EEBA);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xFFFFFF5E);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010226);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0000C783);
#endif
/* activate this if you are using a module for the first time or if you need to re-calibrate it */
/* write down the numbers on the screen and either place them in one of the pre-defined blocks above or make a new block */
// Note: requires FT81x_FULL to be defined
#if 0
/* calibrate touch and displays values to screen */
EVE_cmd_dl(CMD_DLSTART);
EVE_cmd_dl(DL_CLEAR_RGB | BLACK);
EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
EVE_cmd_text((EVE_HSIZE/2), 50, 26, EVE_OPT_CENTER, "Please tap on the dot.");
EVE_cmd_calibrate();
EVE_cmd_dl(DL_DISPLAY);
EVE_cmd_dl(CMD_SWAP);
EVE_cmd_execute();
uint32_t touch_a, touch_b, touch_c, touch_d, touch_e, touch_f;
touch_a = EVE_memRead32(REG_TOUCH_TRANSFORM_A);
touch_b = EVE_memRead32(REG_TOUCH_TRANSFORM_B);
touch_c = EVE_memRead32(REG_TOUCH_TRANSFORM_C);
touch_d = EVE_memRead32(REG_TOUCH_TRANSFORM_D);
touch_e = EVE_memRead32(REG_TOUCH_TRANSFORM_E);
touch_f = EVE_memRead32(REG_TOUCH_TRANSFORM_F);
EVE_cmd_dl(CMD_DLSTART);
EVE_cmd_dl(DL_CLEAR_RGB | BLACK);
EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
EVE_cmd_dl(TAG(0));
EVE_cmd_text(5, 15, 26, 0, "TOUCH_TRANSFORM_A:");
EVE_cmd_text(5, 30, 26, 0, "TOUCH_TRANSFORM_B:");
EVE_cmd_text(5, 45, 26, 0, "TOUCH_TRANSFORM_C:");
EVE_cmd_text(5, 60, 26, 0, "TOUCH_TRANSFORM_D:");
EVE_cmd_text(5, 75, 26, 0, "TOUCH_TRANSFORM_E:");
EVE_cmd_text(5, 90, 26, 0, "TOUCH_TRANSFORM_F:");
#if defined (FT81X_ENABLE)
EVE_cmd_setbase(16L); /* FT81x only */
EVE_cmd_number(310, 15, 26, EVE_OPT_RIGHTX|8, touch_a);
EVE_cmd_number(310, 30, 26, EVE_OPT_RIGHTX|8, touch_b);
EVE_cmd_number(310, 45, 26, EVE_OPT_RIGHTX|8, touch_c);
EVE_cmd_number(310, 60, 26, EVE_OPT_RIGHTX|8, touch_d);
EVE_cmd_number(310, 75, 26, EVE_OPT_RIGHTX|8, touch_e);
EVE_cmd_number(310, 90, 26, EVE_OPT_RIGHTX|8, touch_f);
#else
EVE_cmd_number(310, 15, 26, EVE_OPT_RIGHTX, touch_a);
EVE_cmd_number(310, 30, 26, EVE_OPT_RIGHTX, touch_b);
EVE_cmd_number(310, 45, 26, EVE_OPT_RIGHTX, touch_c);
EVE_cmd_number(310, 60, 26, EVE_OPT_RIGHTX, touch_d);
EVE_cmd_number(310, 75, 26, EVE_OPT_RIGHTX, touch_e);
EVE_cmd_number(310, 90, 26, EVE_OPT_RIGHTX, touch_f);
#endif
EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */
EVE_cmd_dl(CMD_SWAP); /* make this list active */
EVE_cmd_execute();
while(1);
#endif
}
// set up a display list for a fullscreen writable bitmap
void TFT_bitmap_display(void)
{
if(tft_active != 0)
{
EVE_start_cmd_burst(); /* start writing to the cmd-fifo as one stream of bytes, only sending the address once */
EVE_cmd_dl(CMD_DLSTART); /* start the display list */
EVE_cmd_dl(DL_CLEAR_RGB | BLACK); /* set the default clear color to black */
EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); /* clear the screen - this and the previous prevent artifacts between lists, Attributes are the color, stencil and tag buffers */
EVE_cmd_dl(TAG(0));
// fullscreen bitmap for memory-mapped direct access
EVE_cmd_dl(TAG(20));
EVE_cmd_setbitmap(SCREEN_BITMAP_ADDR, EVE_RGB565, EVE_HSIZE, EVE_VSIZE);
EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
EVE_cmd_dl(VERTEX2F(0, 0));
EVE_cmd_dl(DL_END);
EVE_cmd_dl(TAG(0));
EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */
EVE_cmd_dl(CMD_SWAP); /* make this list active */
EVE_end_cmd_burst(); /* stop writing to the cmd-fifo */
EVE_cmd_start(); /* order the command co-processor to start processing its FIFO queue but do not wait for completion */
}
}
void FT81x_init(void)
{
gpio_pad_select_gpio(EVE_PDN);
gpio_set_level(EVE_CS, 1);
gpio_set_direction(EVE_PDN, GPIO_MODE_OUTPUT);
spi_acquire();
if(EVE_init())
{
tft_active = 1;
EVE_memWrite8(REG_PWM_DUTY, 0x30); /* setup backlight, range is from 0 = off to 0x80 = max */
touch_calibrate();
EVE_cmd_memset(SCREEN_BITMAP_ADDR, BLACK, SCREEN_BUFFER_SIZE); // clear screen buffer
EVE_cmd_execute();
TFT_bitmap_display(); // set DL for fullscreen bitmap display
}
spi_release();
}
// write fullscreen bitmap directly
void TFT_WriteScreen(uint8_t* Bitmap)
{
EVE_memWrite_buffer(SCREEN_BITMAP_ADDR, Bitmap, SCREEN_BUFFER_SIZE, false);
}
// write bitmap directly, line-by-line
void TFT_WriteBitmap(uint8_t* Bitmap, uint16_t X, uint16_t Y, uint16_t Width, uint16_t Height)
{
// calc base address
uint32_t addr = SCREEN_BITMAP_ADDR + (Y * BYTES_PER_LINE) + (X * BYTES_PER_PIXEL);
// can we do a fast full width block transfer?
if(X == 0 && Width == EVE_HSIZE)
{
EVE_memWrite_buffer(addr, Bitmap, (Height * BYTES_PER_LINE), true);
}
else
{
// line by line mode
uint32_t bpl = Width * BYTES_PER_PIXEL;
for (uint16_t i = 0; i < Height; i++)
{
EVE_memWrite_buffer(addr, Bitmap + (i * bpl), bpl, (i == Height - 1));
addr += BYTES_PER_LINE;
}
}
}
// LittlevGL flush callback
void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{
TFT_WriteBitmap((uint8_t*)color_map, area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area));
}