MCUXpresso_LPC55S69/boards/lpcxpresso55s69/emwin_examples/emwin_gui_demo/cm33_core0/emwin_support.c

273 lines
6.9 KiB
C

/*
* Copyright (c) 2016, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "GUI.h"
#include "WM.h"
#include "GUIDRV_FlexColor.h"
#include "emwin_support.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "fsl_spi.h"
#include "fsl_spi_cmsis.h"
#include "fsl_ili9341.h"
#include "fsl_i2c_cmsis.h"
#include "fsl_ft6x06.h"
#ifndef GUI_MEMORY_ADDR
static uint32_t s_gui_memory[(GUI_NUMBYTES + 3) / 4]; /* needs to be word aligned */
#define GUI_MEMORY_ADDR ((uint32_t)s_gui_memory)
#endif
/*******************************************************************************
* Implementation of PortAPI for emWin LCD driver
******************************************************************************/
static volatile uint32_t spi_event;
static volatile bool spi_event_received;
static void SPI_MasterSignalEvent(uint32_t event)
{
spi_event = event;
spi_event_received = true;
}
static uint32_t SPI_WaitEvent(void)
{
uint32_t event;
while (!spi_event_received)
;
event = spi_event;
spi_event_received = false;
return event;
}
static void APP_pfWrite8_A0(U8 Data)
{
GPIO_PortClear(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
BOARD_LCD_SPI.Send(&Data, 1);
SPI_WaitEvent();
}
static void APP_pfWrite8_A1(U8 Data)
{
GPIO_PortSet(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
BOARD_LCD_SPI.Send(&Data, 1);
SPI_WaitEvent();
}
static void APP_pfWriteM8_A1(U8 *pData, int NumItems)
{
GPIO_PortSet(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
BOARD_LCD_SPI.Send(pData, NumItems);
SPI_WaitEvent();
}
static U8 APP_pfRead8_A1(void)
{
uint8_t Data;
#if defined(BOARD_LCD_READABLE) && (BOARD_LCD_READABLE == 0)
PRINTF("Warning: LCD does not support read operation, the image may get distorted.\r\n");
assert(0);
#endif
GPIO_PortSet(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
BOARD_LCD_SPI.Receive(&Data, 1);
SPI_WaitEvent();
return Data;
}
static void APP_pfReadM8_A1(U8 *pData, int NumItems)
{
#if defined(BOARD_LCD_READABLE) && (BOARD_LCD_READABLE == 0)
PRINTF("Warning: LCD does not support read operation, the image may get distorted.\r\n");
assert(0);
#endif
GPIO_PortSet(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
BOARD_LCD_SPI.Receive(pData, NumItems);
SPI_WaitEvent();
}
static void BOARD_LCD_InterfaceInit(void)
{
/* Define the init structure for the data/command output pin */
gpio_pin_config_t dc_config = {
kGPIO_DigitalOutput,
1,
};
/* Init data/command GPIO output . */
GPIO_PortInit(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT);
GPIO_PinInit(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, BOARD_LCD_DC_GPIO_PIN, &dc_config);
/* SPI master init */
BOARD_LCD_SPI.Initialize(SPI_MasterSignalEvent);
BOARD_LCD_SPI.PowerControl(ARM_POWER_FULL);
BOARD_LCD_SPI.Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL1_CPHA1 | ARM_SPI_DATA_BITS(8), BOARD_LCD_SPI_BAUDRATE);
#ifdef BOARD_LCD_SPI_IRQ
NVIC_SetPriority(BOARD_LCD_SPI_IRQ, 1U);
#endif
}
void BOARD_LCD_InterfaceDeinit(void)
{
BOARD_LCD_SPI.PowerControl(ARM_POWER_OFF);
BOARD_LCD_SPI.Uninitialize();
}
/*******************************************************************************
* Implementation of communication with the touch controller
******************************************************************************/
static ft6x06_handle_t touch_handle;
static void I2C_MasterSignalEvent(uint32_t event)
{
/* Notify touch driver about status of the IO operation */
FT6X06_EventHandler(&touch_handle, event);
}
static void BOARD_Touch_InterfaceInit(void)
{
NVIC_SetPriority(BOARD_TOUCH_I2C_IRQ, 0);
/*Init I2C */
BOARD_TOUCH_I2C.Initialize(I2C_MasterSignalEvent);
BOARD_TOUCH_I2C.PowerControl(ARM_POWER_FULL);
BOARD_TOUCH_I2C.Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD);
}
void BOARD_Touch_InterfaceDeinit(void)
{
BOARD_TOUCH_I2C.PowerControl(ARM_POWER_OFF);
BOARD_TOUCH_I2C.Uninitialize();
}
int BOARD_Touch_Poll(void)
{
touch_event_t touch_event;
int touch_x;
int touch_y;
GUI_PID_STATE pid_state;
if (kStatus_Success != FT6X06_GetSingleTouch(&touch_handle, &touch_event, &touch_x, &touch_y))
{
return 0;
}
else if (touch_event != kTouch_Reserved)
{
pid_state.x = LCD_WIDTH - touch_y;
pid_state.y = touch_x;
pid_state.Pressed = ((touch_event == kTouch_Down) || (touch_event == kTouch_Contact));
pid_state.Layer = 0;
GUI_TOUCH_StoreStateEx(&pid_state);
return 1;
}
return 0;
}
/*******************************************************************************
* Application implemented functions required by emWin library
******************************************************************************/
void LCD_X_Config(void)
{
GUI_DEVICE *pDevice;
GUI_PORT_API PortAPI;
CONFIG_FLEXCOLOR Config = {0, 0, GUI_SWAP_XY, 0, 1};
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
GUIDRV_FlexColor_Config(pDevice, &Config);
LCD_SetSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
LCD_SetVSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
PortAPI.pfWrite8_A0 = APP_pfWrite8_A0;
PortAPI.pfWrite8_A1 = APP_pfWrite8_A1;
PortAPI.pfWriteM8_A1 = APP_pfWriteM8_A1;
PortAPI.pfRead8_A1 = APP_pfRead8_A1;
PortAPI.pfReadM8_A1 = APP_pfReadM8_A1;
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B8);
BOARD_Touch_InterfaceInit();
FT6X06_Init(&touch_handle, &BOARD_TOUCH_I2C);
}
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void *pData)
{
int result = 0;
switch (Cmd)
{
case LCD_X_INITCONTROLLER:
BOARD_LCD_InterfaceInit();
GUI_X_Delay(50); /* settle down delay after reset */
FT9341_Init(APP_pfWrite8_A1, APP_pfWrite8_A0);
break;
default:
result = -1;
break;
}
return result;
}
void GUI_X_Config(void)
{
/* Assign work memory area to emWin */
GUI_ALLOC_AssignMemory((void *)GUI_MEMORY_ADDR, GUI_NUMBYTES);
/* Select default font */
GUI_SetDefaultFont(GUI_FONT_6X8);
}
void GUI_X_Init(void)
{
}
/* Dummy RTOS stub required by emWin */
void GUI_X_InitOS(void)
{
}
/* Dummy RTOS stub required by emWin */
void GUI_X_Lock(void)
{
}
/* Dummy RTOS stub required by emWin */
void GUI_X_Unlock(void)
{
}
/* Dummy RTOS stub required by emWin */
U32 GUI_X_GetTaskId(void)
{
return 0;
}
void GUI_X_ExecIdle(void)
{
}
GUI_TIMER_TIME GUI_X_GetTime(void)
{
return 0;
}
void GUI_X_Delay(int Period)
{
volatile int per;
volatile int i;
for (per = Period; per > 0; per--)
{
for (i = 15000; i > 0; i--)
;
}
}