123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- /*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- * Copyright 2022 NXP
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-10-18 Meco Man The first version
- * 2022-05-17 Ting Liu Support touchpad
- */
- #define LOG_TAG "LVGL.port.indev"
- #include <drv_log.h>
- #include "lvgl.h"
- #include "board.h"
- #include "fsl_video_common.h"
- #include "fsl_lpi2c.h"
- #include "fsl_gpio.h"
- #ifdef DEMO_PANEL_RK043FN66HS
- #include "fsl_gt911.h"
- #else
- #include "fsl_ft5406_rt.h"
- #endif
- #if LV_USE_GPU_NXP_PXP
- #include "src/gpu/lv_gpu_nxp_pxp.h"
- #include "src/gpu/lv_gpu_nxp_pxp_osa.h"
- #endif
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- /* @Brief Board touch panel configuration */
- #define BOARD_TOUCH_I2C_BASEADDR LPI2C1
- #define BOARD_TOUCH_RST_GPIO GPIO1
- #define BOARD_TOUCH_RST_PIN 2
- #define BOARD_TOUCH_INT_GPIO GPIO1
- #define BOARD_TOUCH_INT_PIN 11
- /* Macros for the touch touch controller. */
- #define TOUCH_I2C LPI2C1
- /* Select USB1 PLL (480 MHz) as master lpi2c clock source */
- #define TOUCH_LPI2C_CLOCK_SOURCE_SELECT (0U)
- /* Clock divider for master lpi2c clock source */
- #define TOUCH_LPI2C_CLOCK_SOURCE_DIVIDER (5U)
- #define TOUCH_I2C_CLOCK_FREQ ((CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 8) / (TOUCH_LPI2C_CLOCK_SOURCE_DIVIDER + 1U))
- #define TOUCH_I2C_BAUDRATE 100000U
- /*******************************************************************************
- * Prototypes
- ******************************************************************************/
- static void DEMO_InitTouch(void);
- static void DEMO_ReadTouch(lv_indev_drv_t *drv, lv_indev_data_t *data);
- #ifdef DEMO_PANEL_RK043FN66HS
- static void BOARD_PullTouchResetPin(bool pullUp);
- static void BOARD_ConfigTouchIntPin(gt911_int_pin_mode_t mode);
- #endif
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- #ifdef DEMO_PANEL_RK043FN66HS
- static gt911_handle_t s_touchHandle;
- static const gt911_config_t s_touchConfig = {
- .I2C_SendFunc = BOARD_Touch_I2C_Send,
- .I2C_ReceiveFunc = BOARD_Touch_I2C_Receive,
- .pullResetPinFunc = BOARD_PullTouchResetPin,
- .intPinFunc = BOARD_ConfigTouchIntPin,
- .timeDelayMsFunc = VIDEO_DelayMs,
- .touchPointNum = 1,
- .i2cAddrMode = kGT911_I2cAddrMode0,
- .intTrigMode = kGT911_IntRisingEdge,
- };
- static int s_touchResolutionX;
- static int s_touchResolutionY;
- #else
- static ft5406_rt_handle_t touchHandle;
- #endif
- void lv_port_indev_init(void)
- {
- static lv_indev_drv_t indev_drv;
- /*------------------
- * Touchpad
- * -----------------*/
- /*Initialize your touchpad */
- DEMO_InitTouch();
- /*Register a touchpad input device*/
- lv_indev_drv_init(&indev_drv);
- indev_drv.type = LV_INDEV_TYPE_POINTER;
- indev_drv.read_cb = DEMO_ReadTouch;
- lv_indev_drv_register(&indev_drv);
- }
- #ifdef DEMO_PANEL_RK043FN66HS
- static void BOARD_PullTouchResetPin(bool pullUp)
- {
- if (pullUp)
- {
- GPIO_PinWrite(BOARD_TOUCH_RST_GPIO, BOARD_TOUCH_RST_PIN, 1);
- }
- else
- {
- GPIO_PinWrite(BOARD_TOUCH_RST_GPIO, BOARD_TOUCH_RST_PIN, 0);
- }
- }
- static void BOARD_ConfigTouchIntPin(gt911_int_pin_mode_t mode)
- {
- if (mode == kGT911_IntPinInput)
- {
- BOARD_TOUCH_INT_GPIO->GDIR &= ~(1UL << BOARD_TOUCH_INT_PIN);
- }
- else
- {
- if (mode == kGT911_IntPinPullDown)
- {
- GPIO_PinWrite(BOARD_TOUCH_INT_GPIO, BOARD_TOUCH_INT_PIN, 0);
- }
- else
- {
- GPIO_PinWrite(BOARD_TOUCH_INT_GPIO, BOARD_TOUCH_INT_PIN, 1);
- }
- BOARD_TOUCH_INT_GPIO->GDIR |= (1UL << BOARD_TOUCH_INT_PIN);
- }
- }
- /*Initialize your touchpad*/
- static void DEMO_InitTouch(void)
- {
- status_t status;
- const gpio_pin_config_t resetPinConfig = {
- .direction = kGPIO_DigitalOutput, .outputLogic = 0, .interruptMode = kGPIO_NoIntmode};
- GPIO_PinInit(BOARD_TOUCH_INT_GPIO, BOARD_TOUCH_INT_PIN, &resetPinConfig);
- GPIO_PinInit(BOARD_TOUCH_RST_GPIO, BOARD_TOUCH_RST_PIN, &resetPinConfig);
- /*Clock setting for LPI2C*/
- CLOCK_SetMux(kCLOCK_Lpi2cMux, TOUCH_LPI2C_CLOCK_SOURCE_SELECT);
- CLOCK_SetDiv(kCLOCK_Lpi2cDiv, TOUCH_LPI2C_CLOCK_SOURCE_DIVIDER);
- BOARD_LPI2C_Init(TOUCH_I2C, TOUCH_I2C_CLOCK_FREQ);
- status = GT911_Init(&s_touchHandle, &s_touchConfig);
- if (kStatus_Success != status)
- {
- //PRINTF("Touch IC initialization failed\r\n");
- assert(false);
- }
- GT911_GetResolution(&s_touchHandle, &s_touchResolutionX, &s_touchResolutionY);
- }
- /* Will be called by the library to read the touchpad */
- static void DEMO_ReadTouch(lv_indev_drv_t *drv, lv_indev_data_t *data)
- {
- static int touch_x = 0;
- static int touch_y = 0;
- if (kStatus_Success == GT911_GetSingleTouch(&s_touchHandle, &touch_x, &touch_y))
- {
- data->state = LV_INDEV_STATE_PR;
- }
- else
- {
- data->state = LV_INDEV_STATE_REL;
- }
- /*Set the last pressed coordinates*/
- data->point.x = touch_x * LCD_WIDTH / s_touchResolutionX;
- data->point.y = touch_y * LCD_HEIGHT / s_touchResolutionY;
- }
- #else
- /*Initialize your touchpad*/
- static void DEMO_InitTouch(void)
- {
- status_t status;
- lpi2c_master_config_t masterConfig = {0};
- /*Clock setting for LPI2C*/
- CLOCK_SetMux(kCLOCK_Lpi2cMux, TOUCH_LPI2C_CLOCK_SOURCE_SELECT);
- CLOCK_SetDiv(kCLOCK_Lpi2cDiv, TOUCH_LPI2C_CLOCK_SOURCE_DIVIDER);
- /*
- * masterConfig.debugEnable = false;
- * masterConfig.ignoreAck = false;
- * masterConfig.pinConfig = kLPI2C_2PinOpenDrain;
- * masterConfig.baudRate_Hz = 100000U;
- * masterConfig.busIdleTimeout_ns = 0;
- * masterConfig.pinLowTimeout_ns = 0;
- * masterConfig.sdaGlitchFilterWidth_ns = 0;
- * masterConfig.sclGlitchFilterWidth_ns = 0;
- */
- LPI2C_MasterGetDefaultConfig(&masterConfig);
- /* Change the default baudrate configuration */
- masterConfig.baudRate_Hz = TOUCH_I2C_BAUDRATE;
- /* Initialize the LPI2C master peripheral */
- LPI2C_MasterInit(TOUCH_I2C, &masterConfig, TOUCH_I2C_CLOCK_FREQ);
- /* Initialize touch panel controller */
- status = FT5406_RT_Init(&touchHandle, TOUCH_I2C);
- if (status != kStatus_Success)
- {
- //PRINTF("Touch panel init failed\n");
- assert(0);
- }
- }
- /* Will be called by the library to read the touchpad */
- static void DEMO_ReadTouch(lv_indev_drv_t *drv, lv_indev_data_t *data)
- {
- touch_event_t touch_event;
- static int touch_x = 0;
- static int touch_y = 0;
- data->state = LV_INDEV_STATE_REL;
- if (kStatus_Success == FT5406_RT_GetSingleTouch(&touchHandle, &touch_event, &touch_x, &touch_y))
- {
- if ((touch_event == kTouch_Down) || (touch_event == kTouch_Contact))
- {
- data->state = LV_INDEV_STATE_PR;
- }
- }
- /*Set the last pressed coordinates*/
- data->point.x = touch_y;
- data->point.y = touch_x;
- }
- #endif
|