From b19602bcaab3627b9736862d015ee90ce62cf548 Mon Sep 17 00:00:00 2001 From: solar_li <64183082+solar-li@users.noreply.github.com> Date: Thu, 30 Jun 2022 10:27:16 +0800 Subject: Docking lvgl for stm32f469-st-disco bsp using ft6336 touch chip (#6121) * Add touch V2 version * Added touch driver ft6336 for stm32f469 bsp --- bsp/stm32/stm32f469-st-disco/board/Kconfig | 73 ++++--- .../board/ports/touch/SConscript | 14 +- .../board/ports/touch/drv_touch.c | 6 +- .../board/ports/touch/drv_touch.h | 2 +- .../board/ports/touch/drv_touch_ft.c | 215 --------------------- .../board/ports/touch/drv_touch_ft6206.c | 215 +++++++++++++++++++++ .../board/ports/touch/drv_touch_ft6x36.c | 86 +++++++++ 7 files changed, 359 insertions(+), 252 deletions(-) delete mode 100644 bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft.c create mode 100644 bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6206.c create mode 100644 bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6x36.c diff --git a/bsp/stm32/stm32f469-st-disco/board/Kconfig b/bsp/stm32/stm32f469-st-disco/board/Kconfig index 8f433171a8..8f05844f71 100644 --- a/bsp/stm32/stm32f469-st-disco/board/Kconfig +++ b/bsp/stm32/stm32f469-st-disco/board/Kconfig @@ -8,28 +8,11 @@ config SOC_STM32F469NI default y menu "Onboard Peripheral Drivers" - - config BSP_USING_SDRAM - bool "Enable SDRAM" - select BSP_USING_FMC - default n - - config BSP_USING_LCD_MIPI - bool - default n - - config BSP_USING_LCD_OTM8009A - bool "Enable LCD OTM8009A" - select BSP_USING_SDRAM - select BSP_USING_LTDC - select BSP_USING_LCD_MIPI - default n - config BSP_USING_LVGL bool "Enable LVGL for LCD" select BSP_USING_LCD_OTM8009A - select BSP_USING_TOUCH select PKG_USING_LVGL + select BSP_USING_TOUCH default n if BSP_USING_LVGL @@ -39,6 +22,11 @@ menu "Onboard Peripheral Drivers" default n endif + config BSP_USING_SDRAM + bool "Enable SDRAM" + select BSP_USING_FMC + default n + config BSP_USING_QSPI_FLASH bool "Enable QSPI FLASH (N25Q128A qspi1)" select BSP_USING_QSPI @@ -63,25 +51,50 @@ menu "Onboard Peripheral Drivers" select RT_USING_DFS_ELMFAT select RT_USING_PIN default n - if BSP_USING_SDCARD + config SDIO_MAX_FREQ int "sdio max freq" range 0 24000000 + depends on BSP_USING_SDCARD default 24000000 - endif config BSP_USING_TOUCH - bool "Enable TOUCH" - select BSP_USING_I2C1 + bool "Enable touch screen" + + choice + prompt "Touch IC type" + depends on BSP_USING_TOUCH + default BSP_CHOICE_TOUCH_FT6X36 + + config BSP_USING_TOUCH_FT6206 + bool "FT6206" + select BSP_USING_I2C1 + if BSP_USING_TOUCH_FT6206 + config BSP_TOUCH_INT_PIN + int # "Touch IC interrupt pin" + default 149 + config BSP_TOUCH_I2C_NAME + string # "I2C Bus Name" + default "i2c1" + endif + + config BSP_USING_TOUCH_FT6X36 + bool "FT6x36" + select BSP_USING_I2C1 + select PKG_USING_TOUCH_DRIVERS + select PKG_USING_FT6236 + endchoice + + config BSP_USING_LCD_MIPI + bool + default n + + config BSP_USING_LCD_OTM8009A + bool "Enable LCD OTM8009A" + select BSP_USING_SDRAM + select BSP_USING_LTDC + select BSP_USING_LCD_MIPI default n - if BSP_USING_TOUCH - config BSP_TOUCH_INT_PIN - int "Touch interrupt pin" - default 149 - config BSP_I2C_NAME - string "I2C Bus Name" - default "i2c1" - endif endmenu menu "On-chip Peripheral Drivers" diff --git a/bsp/stm32/stm32f469-st-disco/board/ports/touch/SConscript b/bsp/stm32/stm32f469-st-disco/board/ports/touch/SConscript index 618e45d87a..2fba1fb030 100644 --- a/bsp/stm32/stm32f469-st-disco/board/ports/touch/SConscript +++ b/bsp/stm32/stm32f469-st-disco/board/ports/touch/SConscript @@ -1,9 +1,17 @@ from building import * cwd = GetCurrentDir() -src = Glob('*.c') -CPPPATH = [cwd, str(Dir('#'))] +src = [] -group = DefineGroup('Drivers', src, depend = ['BSP_USING_TOUCH'], CPPPATH = CPPPATH) +if GetDepend(['BSP_USING_TOUCH_FT6206']): + src += Glob('drv_touch.c') + src += Glob('drv_touch_ft6206.c') + +if GetDepend(['BSP_USING_TOUCH_FT6X36']): + src += Glob('drv_touch_ft6x36.c') + +CPPPATH = [cwd] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) Return('group') diff --git a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.c b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.c index d6c29e059f..4fafd795b5 100644 --- a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.c +++ b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.c @@ -10,7 +10,7 @@ #include -#ifdef BSP_USING_TOUCH +#ifdef BSP_USING_TOUCH_FT6206 #include "drv_touch.h" #include #ifdef PKG_USING_GUIENGINE @@ -154,7 +154,7 @@ static int rt_touch_thread_init(void) rt_list_t *l; touch_drv_t current_driver; rt_thread_t tid = RT_NULL; - i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(BSP_I2C_NAME); + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(BSP_TOUCH_I2C_NAME); RT_ASSERT(i2c_bus); current_driver = RT_NULL; if (rt_device_open((rt_device_t)i2c_bus, RT_DEVICE_OFLAG_RDWR) != RT_EOK) @@ -204,4 +204,4 @@ static int touc_bg_init(void) } INIT_COMPONENT_EXPORT(touc_bg_init); -#endif /* BSP_USING_TOUCH */ +#endif /* BSP_USING_TOUCH_FT6206 */ diff --git a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.h b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.h index 21bea39f83..8041c471c1 100644 --- a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.h +++ b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft.c b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft.c deleted file mode 100644 index bd2db859ba..0000000000 --- a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017-08-08 Yang the first version - * 2019-04-23 WillianChan porting to ft6206 - */ - -#include -#include -#include -#include "drv_touch.h" - -#include -#include - -#ifdef BSP_USING_TOUCH - -#define DBG_ENABLE -#define DBG_SECTION_NAME "TOUCH.ft" -#define DBG_LEVEL TOUCH_DBG_LEVEL -#define DBG_COLOR -#include - -static struct rt_i2c_bus_device *ft_i2c_bus; -static struct touch_drivers ft_driver; - -static int ft_read(struct rt_i2c_bus_device *i2c_bus, rt_uint8_t addr, rt_uint8_t *buffer, rt_size_t length) -{ - int ret = -1; - int retries = 0; - - struct rt_i2c_msg msgs[] = - { - { - .addr = ft_driver.address, - .flags = RT_I2C_WR, - .len = 1, - .buf = &addr, - }, - { - .addr = ft_driver.address, - .flags = RT_I2C_RD, - .len = length, - .buf = buffer, - }, - }; - - while (retries < IIC_RETRY_NUM) - { - ret = rt_i2c_transfer(i2c_bus, msgs, 2); - if (ret == 2)break; - retries++; - } - - if (retries >= IIC_RETRY_NUM) - { - LOG_E("%s i2c read error: %d", __func__, ret); - return -1; - } - - return ret; -} - -static void ft_write(touch_drv_t driver, struct rt_i2c_bus_device *i2c_bus, rt_uint8_t addr, rt_uint8_t *buffer, rt_size_t length) -{ - rt_uint8_t *send_buffer = rt_malloc(length + 1); - - RT_ASSERT(send_buffer); - - send_buffer[0] = addr; - memcpy(send_buffer + 1, buffer, length); - - struct rt_i2c_msg msgs[] = - { - { - .addr = ft_driver.address, - .flags = RT_I2C_WR, - .len = length + 1, - .buf = send_buffer, - } - }; - - length = rt_i2c_transfer(i2c_bus, msgs, 1); - rt_free(send_buffer); - send_buffer = RT_NULL; -} - -static void ft_isr_enable(rt_bool_t enable) -{ - rt_pin_irq_enable(BSP_TOUCH_INT_PIN, enable); -} - -static void ft_touch_isr(void *parameter) -{ - ft_isr_enable(RT_FALSE); - rt_sem_release(ft_driver.isr_sem); -} - -static rt_err_t ft_read_point(touch_msg_t msg) -{ - int ret = -1; - uint8_t point_num = 0; - static uint8_t s_tp_down = 0; - uint8_t point[6]; - ret = ft_read(ft_i2c_bus, 0x02, &point_num, 1); - if (ret < 0) - { - return RT_ERROR; - } - - if (point_num == 0) - { - if (s_tp_down) - { - s_tp_down = 0; - msg->event = TOUCH_EVENT_UP; - return RT_EOK; - } - msg->event = TOUCH_EVENT_NONE; - return RT_ERROR; - } - - ret = ft_read(ft_i2c_bus, 0x03, point, 6); - if (ret < 0) - { - return RT_ERROR; - } - - msg->y = (point[0]&0x0F) << 8 | point[1]; - msg->x = (point[2]&0x0F) << 8 | point[3]; - - if (s_tp_down) - { - msg->event = TOUCH_EVENT_MOVE; - return RT_EOK; - } - msg->event = TOUCH_EVENT_DOWN; - s_tp_down = 1; - - return RT_EOK; -} - -static void ft_init(struct rt_i2c_bus_device *i2c_bus) -{ - if (ft_i2c_bus == RT_NULL) - { - ft_i2c_bus = i2c_bus; - } - ft_driver.isr_sem = rt_sem_create("ft", 0, RT_IPC_FLAG_FIFO); - RT_ASSERT(ft_driver.isr_sem); - - rt_pin_mode(BSP_TOUCH_INT_PIN, PIN_MODE_INPUT_PULLUP); - rt_pin_attach_irq(BSP_TOUCH_INT_PIN, PIN_IRQ_MODE_FALLING, ft_touch_isr, RT_NULL); - - rt_thread_mdelay(200); -} - -static void ft_deinit(void) -{ - if (ft_driver.isr_sem) - { - rt_sem_delete(ft_driver.isr_sem); - ft_driver.isr_sem = RT_NULL; - } -} - -struct touch_ops ft_ops = -{ - ft_isr_enable, - ft_read_point, - ft_init, - ft_deinit, -}; - -static rt_bool_t ft_probe(struct rt_i2c_bus_device *i2c_bus) -{ - int err = 0; - uint8_t cid = 0xFF; - - ft_i2c_bus = i2c_bus; - /* FT6206 Chip identification register address is 0xA8 */ - err = ft_read(ft_i2c_bus, 0xA8, (uint8_t *)&cid, 1); - if (err < 0) - { - LOG_E("%s failed: %d", __func__, err); - return RT_FALSE; - } - LOG_I("touch CID:0x%02X", cid); - /* FT6206 ID Value is 0x11 */ - if(cid == 0x11) - { - return RT_TRUE; - } - return RT_FALSE; -} - -int ft_driver_register(void) -{ - /* TouchScreen FT6206 Slave I2C address is 0x54 - * 0x54 << 1 = 0x2A - */ - ft_driver.address = 0x2A; - ft_driver.probe = ft_probe; - ft_driver.ops = &ft_ops; - ft_driver.user_data = RT_NULL; - rt_touch_drivers_register(&ft_driver); - return 0; -} -INIT_DEVICE_EXPORT(ft_driver_register); - -#endif diff --git a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6206.c b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6206.c new file mode 100644 index 0000000000..aa76f709e2 --- /dev/null +++ b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6206.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017-08-08 Yang the first version + * 2019-04-23 WillianChan porting to ft6206 + */ + +#include +#include +#include +#include "drv_touch.h" + +#include +#include + +#ifdef BSP_USING_TOUCH_FT6206 + +#define DBG_ENABLE +#define DBG_SECTION_NAME "TOUCH.ft" +#define DBG_LEVEL TOUCH_DBG_LEVEL +#define DBG_COLOR +#include + +static struct rt_i2c_bus_device *ft_i2c_bus; +static struct touch_drivers ft_driver; + +static int ft_read(struct rt_i2c_bus_device *i2c_bus, rt_uint8_t addr, rt_uint8_t *buffer, rt_size_t length) +{ + int ret = -1; + int retries = 0; + + struct rt_i2c_msg msgs[] = + { + { + .addr = ft_driver.address, + .flags = RT_I2C_WR, + .len = 1, + .buf = &addr, + }, + { + .addr = ft_driver.address, + .flags = RT_I2C_RD, + .len = length, + .buf = buffer, + }, + }; + + while (retries < IIC_RETRY_NUM) + { + ret = rt_i2c_transfer(i2c_bus, msgs, 2); + if (ret == 2)break; + retries++; + } + + if (retries >= IIC_RETRY_NUM) + { + LOG_E("%s i2c read error: %d", __func__, ret); + return -1; + } + + return ret; +} + +static void ft_write(touch_drv_t driver, struct rt_i2c_bus_device *i2c_bus, rt_uint8_t addr, rt_uint8_t *buffer, rt_size_t length) +{ + rt_uint8_t *send_buffer = rt_malloc(length + 1); + + RT_ASSERT(send_buffer); + + send_buffer[0] = addr; + memcpy(send_buffer + 1, buffer, length); + + struct rt_i2c_msg msgs[] = + { + { + .addr = ft_driver.address, + .flags = RT_I2C_WR, + .len = length + 1, + .buf = send_buffer, + } + }; + + length = rt_i2c_transfer(i2c_bus, msgs, 1); + rt_free(send_buffer); + send_buffer = RT_NULL; +} + +static void ft_isr_enable(rt_bool_t enable) +{ + rt_pin_irq_enable(BSP_TOUCH_INT_PIN, enable); +} + +static void ft_touch_isr(void *parameter) +{ + ft_isr_enable(RT_FALSE); + rt_sem_release(ft_driver.isr_sem); +} + +static rt_err_t ft_read_point(touch_msg_t msg) +{ + int ret = -1; + uint8_t point_num = 0; + static uint8_t s_tp_down = 0; + uint8_t point[6]; + ret = ft_read(ft_i2c_bus, 0x02, &point_num, 1); + if (ret < 0) + { + return RT_ERROR; + } + + if (point_num == 0) + { + if (s_tp_down) + { + s_tp_down = 0; + msg->event = TOUCH_EVENT_UP; + return RT_EOK; + } + msg->event = TOUCH_EVENT_NONE; + return RT_ERROR; + } + + ret = ft_read(ft_i2c_bus, 0x03, point, 6); + if (ret < 0) + { + return RT_ERROR; + } + + msg->y = (point[0]&0x0F) << 8 | point[1]; + msg->x = (point[2]&0x0F) << 8 | point[3]; + + if (s_tp_down) + { + msg->event = TOUCH_EVENT_MOVE; + return RT_EOK; + } + msg->event = TOUCH_EVENT_DOWN; + s_tp_down = 1; + + return RT_EOK; +} + +static void ft_init(struct rt_i2c_bus_device *i2c_bus) +{ + if (ft_i2c_bus == RT_NULL) + { + ft_i2c_bus = i2c_bus; + } + ft_driver.isr_sem = rt_sem_create("ft", 0, RT_IPC_FLAG_FIFO); + RT_ASSERT(ft_driver.isr_sem); + + rt_pin_mode(BSP_TOUCH_INT_PIN, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(BSP_TOUCH_INT_PIN, PIN_IRQ_MODE_FALLING, ft_touch_isr, RT_NULL); + + rt_thread_mdelay(200); +} + +static void ft_deinit(void) +{ + if (ft_driver.isr_sem) + { + rt_sem_delete(ft_driver.isr_sem); + ft_driver.isr_sem = RT_NULL; + } +} + +struct touch_ops ft_ops = +{ + ft_isr_enable, + ft_read_point, + ft_init, + ft_deinit, +}; + +static rt_bool_t ft_probe(struct rt_i2c_bus_device *i2c_bus) +{ + int err = 0; + uint8_t cid = 0xFF; + + ft_i2c_bus = i2c_bus; + /* FT6206 Chip identification register address is 0xA8 */ + err = ft_read(ft_i2c_bus, 0xA8, (uint8_t *)&cid, 1); + if (err < 0) + { + LOG_E("%s failed: %d", __func__, err); + return RT_FALSE; + } + LOG_I("touch CID:0x%02X", cid); + /* FT6206 ID Value is 0x11 */ + if(cid == 0x11) + { + return RT_TRUE; + } + return RT_FALSE; +} + +int ft_driver_register(void) +{ + /* TouchScreen FT6206 Slave I2C address is 0x54 + * 0x54 << 1 = 0x2A + */ + ft_driver.address = 0x2A; + ft_driver.probe = ft_probe; + ft_driver.ops = &ft_ops; + ft_driver.user_data = RT_NULL; + rt_touch_drivers_register(&ft_driver); + return 0; +} +INIT_DEVICE_EXPORT(ft_driver_register); + +#endif /* BSP_USING_TOUCH_FT6206 */ diff --git a/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6x36.c b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6x36.c new file mode 100644 index 0000000000..9ee7097ba5 --- /dev/null +++ b/bsp/stm32/stm32f469-st-disco/board/ports/touch/drv_touch_ft6x36.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-06-29 solar the first version + */ + +#include +#include +#include "touch.h" +#include "lcd_port.h" +#include "drv_common.h" + +#define DBG_TAG "ft6236" +#define DBG_LVL DBG_LOG +#include + +#ifdef BSP_USING_TOUCH_FT6X36 + +#include "ft6236.h" + +#define BSP_TOUCH_I2C_BUS_NAME "i2c1" +#define BSP_TOUCH_I2C_RESET_PIN 119 /* PH.7 */ + +#ifdef PKG_USING_LVGL +#include +extern void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); +#endif /* PKG_USING_LVGL */ + +rt_thread_t ft6236_thread; +rt_device_t touch; + +void ft6236_thread_entry(void *parameter) +{ + struct rt_touch_data *read_data; + + read_data = (struct rt_touch_data *)rt_calloc(1, sizeof(struct rt_touch_data)); + + while (1) + { + rt_device_read(touch, 0, read_data, 1); +#ifdef PKG_USING_LVGL + /* Since the origin of the LCD screen and the origin of the touch screen are + * different, the parameters passed in here need to be simply converted. */ + if (read_data->event == RT_TOUCH_EVENT_DOWN) + lv_port_indev_input(read_data->y_coordinate, read_data->x_coordinate, LV_INDEV_STATE_PR); + + if (read_data->event == RT_TOUCH_EVENT_MOVE) + lv_port_indev_input(read_data->y_coordinate, read_data->x_coordinate, LV_INDEV_STATE_PR); + + if (read_data->event == RT_TOUCH_EVENT_UP) + lv_port_indev_input(read_data->y_coordinate, read_data->x_coordinate, LV_INDEV_STATE_REL); +#endif /* PKG_USING_LVGL */ + if (read_data->event != RT_TOUCH_EVENT_NONE) + LOG_I("LCD point x: %03d y: %03d", read_data->y_coordinate, LCD_HEIGHT - read_data->x_coordinate); + rt_thread_delay(10); + } +} + +int ft6236_for_lvgl(void) +{ + struct rt_touch_config cfg; + + cfg.dev_name = BSP_TOUCH_I2C_BUS_NAME; + rt_hw_ft6236_init("touch", &cfg, BSP_TOUCH_I2C_RESET_PIN); + + touch = rt_device_find("touch"); + rt_device_open(touch, RT_DEVICE_FLAG_RDONLY); + + ft6236_thread = rt_thread_create("touch", ft6236_thread_entry, RT_NULL, 1024, 10, 20); + if (ft6236_thread == RT_NULL) + { + LOG_D("create ft6236 thread err"); + + return -RT_ENOMEM; + } + rt_thread_startup(ft6236_thread); + + return RT_EOK; +} +INIT_ENV_EXPORT(ft6236_for_lvgl); + +#endif /* BSP_USING_TOUCH_FT6X36 */ -- cgit v1.3.1