Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "comm.cpp"
- #ifndef ft800
- #define ft800
- #define LCD_WQVGA
- #define FT800_PD_N GPIO_PIN_3
- #define FT800_CS_N GPIO_PIN_4
- #define FT_DL_SIZE (8*1024) //8KB Display List buffer size
- #define FT_CMD_FIFO_SIZE (4*1024) //4KB coprocessor Fifo size
- #define FT_CMD_SIZE (4) //4 byte per coprocessor command of EVE
- #define FT800_VERSION "1.9.0"
- // FT800 Chip Commands - use with cmdWrite
- #define FT800_ACTIVE 0x00 // Initializes FT800
- #define FT800_STANDBY 0x41 // Place FT800 in Standby (clk running)
- #define FT800_SLEEP 0x42 // Place FT800 in Sleep (clk off)
- #define FT800_PWRDOWN 0x50 // Place FT800 in Power Down (core off)
- #define FT800_CLKEXT 0x44 // Select external clock source
- #define FT800_CLK48M 0x62 // Select 48MHz PLL
- #define FT800_CLK36M 0x61 // Select 36MHz PLL
- #define FT800_CORERST 0x68 // Reset core - all registers default
- // FT800 Memory Commands - use with ft800memWritexx and ft800memReadxx
- #define MEM_WRITE 0x80 // FT800 Host Memory Write
- #define MEM_READ 0x00 // FT800 Host Memory Read
- // Refer to the FT800 Datasheet
- // FT800 Memory Map Addresses
- #define RAM_CMD 0x108000UL
- #define RAM_DL 0x100000UL
- #define RAM_G 0x000000UL
- #define RAM_PAL 0x102000UL
- #define RAM_REG 0x102400UL
- // FT800 Register Addresses
- #define REG_CLOCK 0x102408UL
- #define REG_CMD_DL 0x1024ecUL
- #define REG_CMD_READ 0x1024e4UL
- #define REG_CMD_WRITE 0x1024e8UL
- #define REG_CPURESET 0x10241cUL
- #define REG_CSPREAD 0x102464UL
- #define REG_DITHER 0x10245cUL
- #define REG_DLSWAP 0x102450UL
- #define REG_FRAMES 0x102404UL
- #define REG_FREQUENCY 0x10240cUL
- #define REG_GPIO 0x102490UL
- #define REG_GPIO_DIR 0x10248cUL
- #define REG_HCYCLE 0x102428UL
- #define REG_HOFFSET 0x10242cUL
- #define REG_HSIZE 0x102430UL
- #define REG_HSYNC0 0x102434UL
- #define REG_HSYNC1 0x102438UL
- #define REG_ID 0x102400UL
- #define REG_INT_EN 0x10249cUL
- #define REG_INT_FLAGS 0x102498UL
- #define REG_INT_MASK 0x1024a0UL
- #define REG_MACRO_0 0x1024c8UL
- #define REG_MACRO_1 0x1024ccUL
- #define REG_OUTBITS 0x102458UL
- #define REG_PCLK 0x10246cUL
- #define REG_PCLK_POL 0x102468UL
- #define REG_PLAY 0x102488UL
- #define REG_PLAYBACK_FORMAT 0x1024b4UL
- #define REG_PLAYBACK_FREQ 0x1024b0UL
- #define REG_PLAYBACK_LENGTH 0x1024a8UL
- #define REG_PLAYBACK_LOOP 0x1024b8UL
- #define REG_PLAYBACK_PLAY 0x1024bcUL
- #define REG_PLAYBACK_READPTR 0x1024acUL
- #define REG_PLAYBACK_START 0x1024a4UL
- #define REG_PWM_DUTY 0x1024c4UL
- #define REG_PWM_HZ 0x1024c0UL
- #define REG_RENDERMODE 0x102410UL
- #define REG_ROTATE 0x102454UL
- #define REG_SNAPSHOT 0x102418UL
- #define REG_SNAPY 0x102414UL
- #define REG_SOUND 0x102484UL
- #define REG_SWIZZLE 0x102460UL
- #define REG_TAG 0x102478UL
- #define REG_TAG_X 0x102470UL
- #define REG_TAG_Y 0x102474UL
- #define REG_TAP_CRC 0x102420UL
- #define REG_TAP_MASK 0x102424UL
- #define REG_TOUCH_ADC_MODE 0x1024f4UL
- #define REG_TOUCH_CHARGE 0x1024f8UL
- #define REG_TOUCH_DIRECT_XY 0x102574UL
- #define REG_TOUCH_DIRECT_Z1Z2 0x102578UL
- #define REG_TOUCH_MODE 0x1024f0UL
- #define REG_TOUCH_OVERSAMPLE 0x102500UL
- #define REG_TOUCH_RAW_XY 0x102508UL
- #define REG_TOUCH_RZ 0x10250cUL
- #define REG_TOUCH_RZTHRESH 0x102504UL
- #define REG_TOUCH_SCREEN_XY 0x102510UL
- #define REG_TOUCH_SETTLE 0x1024fcUL
- #define REG_TOUCH_TAG 0x102518UL
- #define REG_TOUCH_TAG_XY 0x102514UL
- #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_TRACKER 0x109000UL
- #define REG_VCYCLE 0x10243cUL
- #define REG_VOFFSET 0x102440UL
- #define REG_VOL_PB 0x10247cUL
- #define REG_VOL_SOUND 0x102480UL
- #define REG_VSIZE 0x102444UL
- #define REG_VSYNC0 0x102448UL
- #define REG_VSYNC1 0x10244cUL
- // Graphics Engine Commands
- // Refer to the FT800 Programmers Guide
- #define CMDBUF_SIZE 4096UL
- #define CMD_APPEND 0xffffff1eUL
- #define CMD_BGCOLOR 0xffffff09UL
- #define CMD_BUTTON 0xffffff0dUL
- #define CMD_CALIBRATE 0xffffff15UL
- #define CMD_CLOCK 0xffffff14UL
- #define CMD_COLDSTART 0xffffff32UL
- #define CMD_DIAL 0xffffff2dUL
- #define CMD_DLSTART 0xffffff00UL
- #define CMD_FGCOLOR 0xffffff0aUL
- #define CMD_GAUGE 0xffffff13UL
- #define CMD_GETMATRIX 0xffffff33UL
- #define CMD_GETPTR 0xffffff23UL
- #define CMD_GRADCOLOR 0xffffff34UL
- #define CMD_GRADIENT 0xffffff0bUL
- #define CMD_INFLATE 0xffffff22UL
- #define CMD_INTERRUPT 0xffffff02UL
- #define CMD_KEYS 0xffffff0eUL
- #define CMD_LOADIDENTITY 0xffffff26UL
- #define CMD_LOADIMAGE 0xffffff24UL
- #define CMD_LOGO 0xffffff31UL
- #define CMD_MEMCPY 0xffffff1dUL
- #define CMD_MEMCRC 0xffffff18UL
- #define CMD_MEMSET 0xffffff1bUL
- #define CMD_MEMWRITE 0xffffff1aUL
- #define CMD_MEMZERO 0xffffff1cUL
- #define CMD_NUMBER 0xffffff2eUL
- #define CMD_PROGRESS 0xffffff0fUL
- #define CMD_REGREAD 0xffffff19UL
- #define CMD_ROTATE 0xffffff29UL
- #define CMD_SCALE 0xffffff28UL
- #define CMD_SCREENSAVER 0xffffff2fUL
- #define CMD_SCROLLBAR 0xffffff11UL
- #define CMD_SETFONT 0xffffff2bUL
- #define CMD_SETMATRIX 0xffffff2aUL
- #define CMD_SKETCH 0xffffff30UL
- #define CMD_SLIDER 0xffffff10UL
- #define CMD_SNAPSHOT 0xffffff1fUL
- #define CMD_SPINNER 0xffffff16UL
- #define CMD_STOP 0xffffff17UL
- #define CMD_SWAP 0xffffff01UL
- #define CMD_TEXT 0xffffff0cUL
- #define CMD_TOGGLE 0xffffff12UL
- #define CMD_TRACK 0xffffff2cUL
- #define CMD_TRANSLATE 0xffffff27UL
- // Display list commands to be embedded in Graphics Processor
- #define DL_ALPHA_FUNC 0x09000000UL // requires OR'd arguments
- #define DL_BITMAP_HANDLE 0x05000000UL // requires OR'd arguments
- #define DL_BITMAP_LAYOUT 0x07000000UL // requires OR'd arguments
- #define DL_BITMAP_SIZE 0x08000000UL // requires OR'd arguments
- #define DL_BITMAP_SOURCE 0x01000000UL // requires OR'd arguments
- #define DL_BITMAP_TFORM_A 0x15000000UL // requires OR'd arguments
- #define DL_BITMAP_TFORM_B 0x16000000UL // requires OR'd arguments
- #define DL_BITMAP_TFORM_C 0x17000000UL // requires OR'd arguments
- #define DL_BITMAP_TFORM_D 0x18000000UL // requires OR'd arguments
- #define DL_BITMAP_TFORM_E 0x19000000UL // requires OR'd arguments
- #define DL_BITMAP_TFORM_F 0x1A000000UL // requires OR'd arguments
- #define DL_BLEND_FUNC 0x0B000000UL // requires OR'd arguments
- #define DL_BEGIN 0x1F000000UL // requires OR'd arguments
- #define DL_CALL 0x1D000000UL // requires OR'd arguments
- #define DL_CLEAR 0x26000000UL // requires OR'd arguments
- #define DL_CELL 0x06000000UL // requires OR'd arguments
- #define DL_CLEAR_RGB 0x02000000UL // requires OR'd arguments
- #define DL_CLEAR_STENCIL 0x11000000UL // requires OR'd arguments
- #define DL_CLEAR_TAG 0x12000000UL // requires OR'd arguments
- #define DL_COLOR_A 0x0F000000UL // requires OR'd arguments
- #define DL_COLOR_MASK 0x20000000UL // requires OR'd arguments
- #define DL_COLOR_RGB 0x04000000UL // requires OR'd arguments
- #define DL_DISPLAY 0x00000000UL
- #define DL_END 0x21000000UL
- #define DL_JUMP 0x1E000000UL // requires OR'd arguments
- #define DL_LINE_WIDTH 0x0E000000UL // requires OR'd arguments
- #define DL_MACRO 0x25000000UL // requires OR'd arguments
- #define DL_POINT_SIZE 0x0D000000UL // requires OR'd arguments
- #define DL_RESTORE_CONTEXT 0x23000000UL
- #define DL_RETURN 0x24000000UL
- #define DL_SAVE_CONTEXT 0x22000000UL
- #define DL_SCISSOR_SIZE 0x1C000000UL // requires OR'd arguments
- #define DL_SCISSOR_XY 0x1B000000UL // requires OR'd arguments
- #define DL_STENCIL_FUNC 0x0A000000UL // requires OR'd arguments
- #define DL_STENCIL_MASK 0x13000000UL // requires OR'd arguments
- #define DL_STENCIL_OP 0x0C000000UL // requires OR'd arguments
- #define DL_TAG 0x03000000UL // requires OR'd arguments
- #define DL_TAG_MASK 0x14000000UL // requires OR'd arguments
- #define DL_VERTEX2F 0x40000000UL // requires OR'd arguments
- #define DL_VERTEX2II 0x02000000UL // requires OR'd arguments
- // Command and register value options
- #define CLR_COL 0x4
- #define CLR_STN 0x2
- #define CLR_TAG 0x1
- #define DECR 4UL
- #define DECR_WRAP 7UL
- #define DLSWAP_DONE 0UL
- #define DLSWAP_FRAME 2UL
- #define DLSWAP_LINE 1UL
- #define DST_ALPHA 3UL
- #define EDGE_STRIP_A 7UL
- #define EDGE_STRIP_B 8UL
- #define EDGE_STRIP_L 6UL
- #define EDGE_STRIP_R 5UL
- #define EQUAL 5UL
- #define GEQUAL 4UL
- #define GREATER 3UL
- #define INCR 3UL
- #define INCR_WRAP 6UL
- #define INT_CMDEMPTY 32UL
- #define INT_CMDFLAG 64UL
- #define INT_CONVCOMPLETE 128UL
- #define INT_PLAYBACK 16UL
- #define INT_SOUND 8UL
- #define INT_SWAP 1UL
- #define INT_TAG 4UL
- #define INT_TOUCH 2UL
- #define INVERT 5UL
- #define KEEP 1UL
- #define L1 1UL
- #define L4 2UL
- #define L8 3UL
- #define LEQUAL 2UL
- #define LESS 1UL
- #define LINEAR_SAMPLES 0UL
- #define LINES 3UL
- #define LINE_STRIP 4UL
- #define NEAREST 0UL
- #define NEVER 0UL
- #define NOTEQUAL 6UL
- #define ONE 1UL
- #define ONE_MINUS_DST_ALPHA 5UL
- #define ONE_MINUS_SRC_ALPHA 4UL
- #define OPT_CENTER 1536UL // 0x6000
- #define OPT_CENTERX 512UL // 0x0200
- #define OPT_CENTERY 1024UL // 0x0400
- #define OPT_FLAT 256UL // 0x0100
- #define OPT_MONO 1UL
- #define OPT_NOBACK 4096UL // 0x1000
- #define OPT_NODL 2UL
- #define OPT_NOHANDS 49152UL // 0xC168
- #define OPT_NOHM 16384UL // 0x4000
- #define OPT_NOPOINTER 16384UL // 0x4000
- #define OPT_NOSECS 32768UL // 0x8000
- #define OPT_NOTICKS 8192UL // 0x2000
- #define OPT_RIGHTX 2048UL // 0x0800
- #define OPT_SIGNED 256UL // 0x0100
- #define PALETTED 8UL
- #define PLAYCOLOR 0x00a0a080
- #define FTPOINTS 2UL // "POINTS" is a reserved word
- #define RECTS 9UL
- #define REPEAT 1UL
- #define REPLACE 2UL
- #define RGB332 4UL
- #define RGB565 7UL
- #define SRC_ALPHA 2UL
- #define TEXT8X8 9UL
- #define TEXTVGA 10UL
- #define TOUCHMODE_CONTINUOUS 3UL
- #define TOUCHMODE_FRAME 2UL
- #define TOUCHMODE_OFF 0UL
- #define TOUCHMODE_ONESHOT 1UL
- #define ULAW_SAMPLES 1UL
- #define ZERO 0UL
- typedef struct button {
- int address;
- char id;
- int X, Y, W, H;
- } button;
- class ft800
- {
- public:
- unsigned int ft800irqPin; // Interrupt from FT800 to Arduino - not used here
- unsigned int ft800pwrPin;// PD_N from Arduino to FT800 - effectively FT800 reset
- unsigned int ft800csPin;// SPI chip select - defined separately since it's manipulated with GPIO calls
- // AN_312 LCD display parameters
- unsigned int lcdWidth; // Active width of LCD display
- unsigned int lcdHeight; // Active height of LCD display
- unsigned int lcdHcycle; // Total number of clocks per line
- unsigned int lcdHoffset; // Start of active line
- unsigned int lcdHsync0; // Start of horizontal sync pulse
- unsigned int lcdHsync1; // End of horizontal sync pulse
- unsigned int lcdVcycle; // Total number of lines per screen
- unsigned int lcdVoffset; // Start of active screen
- unsigned int lcdVsync0; // Start of vertical sync pulse
- unsigned int lcdVsync1; // End of vertical sync pulse
- unsigned char lcdPclk; // Pixel Clock
- unsigned char lcdSwizzle; // Define RGB output pins
- unsigned char lcdPclkpol; // Define active edge of PCLK
- unsigned long color; // Variable for chanign colors
- unsigned char ft800Gpio; // Used for FT800 GPIO register
- button buttons[20];
- int buttonPointer;
- button* lastButton;
- //ft800();
- unsigned int incCMDOffset(unsigned int, unsigned char);
- int X(double);
- int Y(double);
- void ft800_clear();
- void ft800_button_clear();
- char ft800_checkTouch();
- char ft800_currentTouch();
- void ft800_font(int, int, int);
- void ft800_dualCommand(int, int, int);
- void ft800_rectangle(int*, uint16_t, uint16_t, uint16_t, uint16_t);
- void ft800_rectangle_fill(int*, uint16_t, uint16_t, uint16_t, uint16_t);
- // TEXT TOOLS
- void ft800_text(int*, int, int, char*, int);
- void ft800_text_center(int*, int, int, char*, int);
- //TEXT TOOLS END
- void ft800_keypad(int*, int, int, int, int);
- void ft800_button(int*, int, int, int, int, char*,int);
- ///////////////////////////////////// END BUTTONS //////////////////////////////
- void ft800_prepareCanvas(int*);
- void ft800_finishCanvas(int*);
- void ft800_refresh(int);
- void ft800_init();
- };
- unsigned int ft800::incCMDOffset(unsigned int currentOffset, unsigned char commandSize)
- {
- unsigned int newOffset; // Used to hold new offset
- newOffset = currentOffset + commandSize; // Calculate new offset
- if (newOffset > 4095) { // If new offset past boundary...
- newOffset = (newOffset - 4096); // ... roll over pointer
- }
- return newOffset; // Return new offset
- };
- int ft800::X(double fl)
- {
- return fl*480;
- };
- int ft800::Y(double fl)
- {
- return fl*272;
- };
- void ft800::ft800_clear()
- {
- for (int a = 0; a < 4096; a += 4) {
- comm::ft800memWrite32(RAM_CMD + a, 0);
- }
- };
- void ft800::ft800_button_clear()
- {
- lastButton = 0;
- buttonPointer = 0;
- };
- char ft800::ft800_checkTouch()
- {
- unsigned int X, Y;
- unsigned int u = comm::ft800memRead32(REG_TOUCH_SCREEN_XY);
- Y = u & 0xFFFF;
- X = u >> 16;
- if (lastButton != 0) {
- comm::ft800memWrite16(RAM_CMD + lastButton->address + 14, 0);
- }
- if (X == 0x8000) {
- if (lastButton != 0) {
- char c = lastButton->id;
- lastButton = 0;
- return c;
- }
- }
- for (int i = 0; i < buttonPointer; i++) {
- if (buttons[i].X < X && (buttons[i].X + buttons[i].W) > X
- && buttons[i].Y < Y && (buttons[i].Y + buttons[i].H) > Y) {
- comm::ft800memWrite16(RAM_CMD + buttons[i].address + 14, OPT_FLAT);
- lastButton = &buttons[i];
- return 0;
- }
- }
- lastButton = 0;
- return 0;
- };
- char ft800::ft800_currentTouch()
- {
- if (lastButton == 0)
- return 0;
- return lastButton->id;
- };
- void ft800::ft800_font(int cmdOffset, int font, int type)
- {
- switch (type) {
- case CMD_BUTTON:
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 12, font);
- break;
- case CMD_TEXT:
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 8, font);
- break;
- }
- };
- void ft800::ft800_dualCommand(int *address, int first, int second)
- {
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, first); // End the point
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 4, second); // End the point
- cmdOffset = incCMDOffset(cmdOffset, 8);
- (*address) = cmdOffset;
- };
- void ft800::ft800_rectangle(int* address, uint16_t X, uint16_t Y, uint16_t W,
- uint16_t H)
- {
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_BEGIN | LINE_STRIP));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 4,
- (DL_VERTEX2F | (X * 16 << 15) | Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 8,
- (DL_VERTEX2F | (X * 16 + W * 16 << 15) | Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 12,
- (DL_VERTEX2F | (X * 16 + W * 16 << 15) | H * 16 + Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 16,
- (DL_VERTEX2F | (X * 16 << 15) | H * 16 + Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 20,
- (DL_VERTEX2F | (X * 16 << 15) | Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 24, (DL_END));
- (*address) = cmdOffset + 28;
- };
- void ft800::ft800_rectangle_fill(int* address, uint16_t X, uint16_t Y, uint16_t W,
- uint16_t H)
- {
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_BEGIN | RECTS));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 4,
- (DL_VERTEX2F | (X * 16 << 15) | Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 8,
- (DL_VERTEX2F | (X * 16 + W * 16 << 15) | H * 16 + Y * 16UL));
- comm::ft800memWrite32(RAM_CMD + cmdOffset + 12, (DL_END));
- (*address) = cmdOffset + 16;
- };
- void ft800::ft800_text(int* address, int X, int Y, char* str, int maxsize)
- {
- int size = strlen(str);
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_TEXT));
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 4, X);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 6, Y);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 8, 31);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 10, 0);
- maxsize = ft800_text_change(cmdOffset, str, CMD_TEXT, maxsize);
- (*address) = incCMDOffset(cmdOffset, 12 + maxsize);
- };
- void ft800::ft800_text_center(int* address, int X, int Y, char* str, int maxsize)
- {
- int cmdOffset = (*address);
- ft800_text(address, X, Y, str, maxsize);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 10, OPT_CENTER);
- };
- int ft800::ft800_text_change(int cmdOffset, char* str, int type, int maxsize)
- {
- maxsize *= 4;
- int size = strlen(str);
- int flag = 0;
- if (maxsize == 0) {
- flag = 1;
- };
- maxsize = (maxsize > size ? maxsize : (size / 4 + 1) * 4);
- int i;
- for (i = 0; i < maxsize; i++) {
- switch (type) {
- case CMD_BUTTON:
- ft800memWrite8(RAM_CMD + cmdOffset + 16 + i,
- (i < size ? str[i] : ' '));
- break;
- case CMD_TEXT:
- ft800memWrite8(RAM_CMD + cmdOffset + 12 + i,
- (i < size ? str[i] : ' '));
- break;
- }
- }
- switch (type) {
- case CMD_BUTTON:
- if (flag)
- ft800memWrite8(RAM_CMD + cmdOffset + 16 + size, 0);
- else
- ft800memWrite8(RAM_CMD + cmdOffset + 16 + i - 1, 0);
- break;
- case CMD_TEXT:
- if (flag)
- ft800memWrite8(RAM_CMD + cmdOffset + 12 + size, 0);
- else
- ft800memWrite8(RAM_CMD + cmdOffset + 12 + i - 1, 0);
- break;
- }
- return i;
- };
- void ft800::ft800_keypad(int* address, int X, int Y, int W, int H)
- {
- ft800_button(address, X, Y, W / 3, H / 4, "1", 0);
- ft800_button(address, X + W / 3, Y, W / 3, H / 4, "2", 0);
- ft800_button(address, X + W * 2 / 3, Y, W / 3, H / 4, "3", 0);
- ft800_button(address, X, Y + H / 4, W / 3, H / 4, "4", 0);
- ft800_button(address, X + W / 3, Y + H / 4, W / 3, H / 4, "5", 0);
- ft800_button(address, X + W * 2 / 3, Y + H / 4, W / 3, H / 4, "6", 0);
- ft800_button(address, X, Y + H * 2 / 4, W / 3, H / 4, "7", 0);
- ft800_button(address, X + W / 3, Y + H * 2 / 4, W / 3, H / 4, "8", 0);
- ft800_button(address, X + W * 2 / 3, Y + H * 2 / 4, W / 3, H / 4, "9", 0);
- ft800_button(address, X, Y + H * 3 / 4, W / 3, H / 4, "X", 0);
- ft800_button(address, X + W / 3, Y + H * 3 / 4, W / 3, H / 4, "0", 0);
- ft800_button(address, X + W * 2 / 3, Y + H * 3 / 4, W / 3, H / 4, "K", 0);
- };
- void ft800::ft800_button(int* address, int X, int Y, int W, int H, char* str,
- int maxsize)
- {
- int size = strlen(str);
- int padde = (size / 4 + 1) * 4;
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_BUTTON));
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 4, X);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 6, Y);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 8, W);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 10, H);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 12, 31);
- comm::ft800memWrite16(RAM_CMD + cmdOffset + 14, 0);
- maxsize = ft800_text_change(cmdOffset, str, CMD_BUTTON, maxsize);
- (*address) = incCMDOffset(cmdOffset, 16 + maxsize);
- button b;
- b.X = X;
- b.Y = Y;
- b.W = W;
- b.H = H;
- b.id = str[0];
- b.address = cmdOffset;
- buttons[buttonPointer++] = b;
- };
- void ft800::ft800_prepareCanvas(int* address)
- {
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));// Start the display list
- cmdOffset = incCMDOffset(cmdOffset, 4);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_CLEAR_RGB | 0x00ffffff));
- // Set the default clear color to black
- cmdOffset = incCMDOffset(cmdOffset, 4); // Update the command pointer
- comm::ft800memWrite32(RAM_CMD + cmdOffset,
- (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
- cmdOffset = incCMDOffset(cmdOffset, 4); // Update the command pointer
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_COLOR_RGB | 0));
- // Set the color of the following item(s) - toggle red/white from above
- cmdOffset = incCMDOffset(cmdOffset, 4); // Update the command pointer
- //272
- (*address) = cmdOffset;
- };
- void ft800::ft800_finishCanvas(int* address)
- {
- int cmdOffset = (*address);
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (DL_DISPLAY)); // Instruct the graphics processor to show the list
- cmdOffset = incCMDOffset(cmdOffset, 4); // Update the command pointer
- comm::ft800memWrite32(RAM_CMD + cmdOffset, (CMD_SWAP)); // Make this list active
- cmdOffset = incCMDOffset(cmdOffset, 4); // Update the command pointer
- (*address) = cmdOffset;
- };
- void ft800::ft800_refresh(int address)
- {
- comm::ft800memWrite16(REG_CMD_READ, 0);
- comm::ft800memWrite16(REG_CMD_WRITE, 0);
- comm::ft800memWrite16(REG_CMD_WRITE, (address));
- };
- void ft800::ft800_init()
- {
- DigitalOut dout(SPI_CS);
- HAL_GPIO_WritePin(GPIOB, FT800_PD_N, GPIO_PIN_SET); // Initial state of PD_N - high
- dout=1;
- HAL_Delay(20); // Wait 20ms
- HAL_GPIO_WritePin(GPIOB, FT800_PD_N, GPIO_PIN_RESET); // Reset FT800
- HAL_Delay(20); // Wait 20ms
- HAL_GPIO_WritePin(GPIOB, FT800_PD_N, GPIO_PIN_SET); // FT800 is awake
- HAL_Delay(20); // Wait 20ms - required
- comm::ft800cmdWrite(FT800_ACTIVE); // Start FT800
- HAL_Delay(5); // Give some time to process
- comm::ft800cmdWrite(FT800_CLKEXT); // Set FT800 for external clock
- HAL_Delay(5); // Give some time to process
- comm::ft800cmdWrite(FT800_CLK48M); // Set FT800 for 48MHz PLL
- HAL_Delay(100);
- int z = 10;
- while (z-- > 0) {
- dout=0;
- HAL_Delay(100);
- dout=1;
- HAL_Delay(100);
- }
- while (comm::ft800memRead8(REG_ID) != 0x7C) { // Read ID register - is it 0x7C?
- }
- #ifdef LCD_QVGA // QVGA display parameters
- this->lcdWidth = 320; // Active width of LCD display
- this->lcdHeight = 240;// Active height of LCD display
- this->lcdHcycle = 408;// Total number of clocks per line
- this->lcdHoffset = 70;// Start of active line
- this->lcdHsync0 = 0; // Start of horizontal sync pulse
- this->lcdHsync1 = 10; // End of horizontal sync pulse
- this->lcdVcycle = 263;// Total number of lines per screen
- this->lcdVoffset = 13;// Start of active screen
- this->lcdVsync0 = 0; // Start of vertical sync pulse
- this->lcdVsync1 = 2; // End of vertical sync pulse
- this->lcdPclk = 8; // Pixel Clock
- this->lcdSwizzle = 2; // Define RGB output pins
- this->lcdPclkpol = 0; // Define active edge of PCLK
- #endif
- #ifdef LCD_WQVGA // WQVGA display parameters
- this->lcdWidth = 480; // Active width of LCD display
- this->lcdHeight = 272; // Active height of LCD display
- this->lcdHcycle = 548; // Total number of clocks per line
- this->lcdHoffset = 43; // Start of active line
- this->lcdHsync0 = 0; // Start of horizontal sync pulse
- this->lcdHsync1 = 41; // End of horizontal sync pulse
- this->lcdVcycle = 292; // Total number of lines per screen
- this->lcdVoffset = 12; // Start of active screen
- this->lcdVsync0 = 0; // Start of vertical sync pulse
- this->lcdVsync1 = 10; // End of vertical sync pulse
- this->lcdPclk = 5; // Pixel Clock
- this->lcdSwizzle = 0; // Define RGB output pins
- this->lcdPclkpol = 1; // Define active edge of PCLK
- #endif
- comm::ft800memWrite8(REG_PCLK, ZERO); // Set PCLK to zero - don't clock the LCD until later
- comm::ft800memWrite8(REG_PWM_DUTY, ZERO); // Turn off backlight
- // End of Wake-up FT800
- // Initialize Display
- comm::ft800memWrite16(REG_HSIZE, lcdWidth); // active display width
- comm::ft800memWrite16(REG_HCYCLE, lcdHcycle); // total number of clocks per line, incl front/back porch
- comm::ft800memWrite16(REG_HOFFSET, lcdHoffset); // start of active line
- comm::ft800memWrite16(REG_HSYNC0, lcdHsync0); // start of horizontal sync pulse
- comm::ft800memWrite16(REG_HSYNC1, lcdHsync1); // end of horizontal sync pulse
- comm::ft800memWrite16(REG_VSIZE, lcdHeight); // active display height
- comm::ft800memWrite16(REG_VCYCLE, lcdVcycle); // total number of lines per screen, incl pre/post
- comm::ft800memWrite16(REG_VOFFSET, lcdVoffset); // start of active screen
- comm::ft800memWrite16(REG_VSYNC0, lcdVsync0); // start of vertical sync pulse
- comm::ft800memWrite16(REG_VSYNC1, lcdVsync1); // end of vertical sync pulse
- comm::ft800memWrite8(REG_SWIZZLE, lcdSwizzle);// FT800 output to LCD - pin order
- comm::ft800memWrite8(REG_PCLK_POL, lcdPclkpol);// LCD data is clocked in on this PCLK edge
- //ft800memWrite8(REG_TOUCH_MODE, ZERO); // Disable touch
- //ft800memWrite16(REG_TOUCH_RZTHRESH, ZERO); // Eliminate any false touches
- comm::ft800memWrite8(REG_VOL_PB, ZERO); // turn recorded audio volume down
- comm::ft800memWrite8(REG_VOL_SOUND, ZERO); // turn synthesizer volume down
- comm::ft800memWrite16(REG_SOUND, 0x6000); // set synthesizer to mute
- int ramDisplayList = RAM_DL; // start of Display List
- comm::ft800memWrite32(ramDisplayList, DL_CLEAR_RGB); // Clear Color RGB 00000010 RRRRRRRR GGGGGGGG BBBBBBBB (R/G/B = Colour values) default zero / black
- ramDisplayList += 4; // point to next location
- comm::ft800memWrite32(ramDisplayList, (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG));
- // Clear 00100110 -------- -------- -----CST (C/S/T define which parameters to clear)
- ramDisplayList += 4; // point to next location
- comm::ft800memWrite32(ramDisplayList, DL_DISPLAY);// DISPLAY command 00000000 00000000 00000000 00000000 (end of display list)
- comm::ft800memWrite32(REG_DLSWAP, DLSWAP_FRAME);// 00000000 00000000 00000000 000000SS (SS bits define when render occurs)
- // Nothing is being displayed yet... the pixel clock is still 0x00
- ramDisplayList = RAM_DL; // Reset Display List pointer for next list
- ft800Gpio = comm::ft800memRead8(REG_GPIO);// Read the FT800 GPIO register for a read/modify/write operation
- ft800Gpio = ft800Gpio | 0x80;// set bit 7 of FT800 GPIO register (DISP) - others are inputs
- comm::ft800memWrite8(REG_GPIO, ft800Gpio);// Enable the DISP signal to the LCD panel
- comm::ft800memWrite8(REG_PCLK, lcdPclk);// Now start clocking data to the LCD panel
- for (int duty = 0; duty <= 128; duty++) {
- comm::ft800memWrite8(REG_PWM_DUTY, duty); // Turn on backlight - ramp up slowly to full brighness
- HAL_Delay(10);
- }
- };
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement