This is an automated email from the ASF dual-hosted git repository.
jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
The following commit(s) were added to refs/heads/master by this push:
new 6aa7b266f lvgl: Add driver for ft6x36 touch screen
6aa7b266f is described below
commit 6aa7b266f1ab3577d8a753c3b358b7a663c59326
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Sun Sep 29 23:01:37 2024 +0200
lvgl: Add driver for ft6x36 touch screen
This adds basic driver for touch screen controller FT6x36
Signed-off-by: Jerzy Kasenberg <[email protected]>
---
hw/drivers/display/lvgl/indev/ft6x36/pkg.yml | 35 ++++
hw/drivers/display/lvgl/indev/ft6x36/src/ft6x36.c | 223 ++++++++++++++++++++++
hw/drivers/display/lvgl/indev/ft6x36/syscfg.yml | 46 +++++
hw/drivers/display/lvgl/pkg.yml | 2 +
hw/drivers/display/lvgl/syscfg.yml | 3 +
5 files changed, 309 insertions(+)
diff --git a/hw/drivers/display/lvgl/indev/ft6x36/pkg.yml
b/hw/drivers/display/lvgl/indev/ft6x36/pkg.yml
new file mode 100644
index 000000000..526f5bd7a
--- /dev/null
+++ b/hw/drivers/display/lvgl/indev/ft6x36/pkg.yml
@@ -0,0 +1,35 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: hw/drivers/display/lvgl/indev/ft6x36
+pkg.description: LVGL touch screen driver for FT6x36
+pkg.author: "Apache Mynewt <[email protected]>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+ - touchscreen
+ - lvgl
+
+pkg.deps:
+ - "@apache-mynewt-core/hw/bus/drivers/i2c_common"
+
+pkg.include_dirs:
+ - "@lvgl/src"
+
+pkg.init:
+ ft6x36_os_dev_create: 400
+ ft6x36_register_lv_indev: 1100
diff --git a/hw/drivers/display/lvgl/indev/ft6x36/src/ft6x36.c
b/hw/drivers/display/lvgl/indev/ft6x36/src/ft6x36.c
new file mode 100644
index 000000000..038ece3df
--- /dev/null
+++ b/hw/drivers/display/lvgl/indev/ft6x36/src/ft6x36.c
@@ -0,0 +1,223 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <stddef.h>
+#include <os/os_time.h>
+#include <hal/hal_gpio.h>
+#include <bus/drivers/i2c_common.h>
+#include <bsp/bsp.h>
+
+#include <hal/lv_hal_indev.h>
+#include <core/lv_disp.h>
+#include <modlog/modlog.h>
+
+#define FT6X36_ADDR 0x38
+
+#define FT6X36_REG_DEVICE_MODE 0x00
+#define FT6X36_REG_GESTURE_ID 0x01
+#define FT6X36_REG_NUM_TOUCHES 0x02
+#define FT6X36_REG_P1_XH 0x03
+#define FT6X36_REG_P1_XL 0x04
+#define FT6X36_REG_P1_YH 0x05
+#define FT6X36_REG_P1_YL 0x06
+#define FT6X36_REG_P1_WEIGHT 0x07
+#define FT6X36_REG_P1_MISC 0x08
+#define FT6X36_REG_P2_XH 0x09
+#define FT6X36_REG_P2_XL 0x0A
+#define FT6X36_REG_P2_YH 0x0B
+#define FT6X36_REG_P2_YL 0x0C
+#define FT6X36_REG_P2_WEIGHT 0x0D
+#define FT6X36_REG_P2_MISC 0x0E
+#define FT6X36_REG_THRESHHOLD 0x80
+#define FT6X36_REG_FILTER_COEF 0x85
+#define FT6X36_REG_CTRL 0x86
+#define FT6X36_REG_TIME_ENTER_MONITOR 0x87
+#define FT6X36_REG_TOUCHRATE_ACTIVE 0x88
+#define FT6X36_REG_TOUCHRATE_MONITOR 0x89
+#define FT6X36_REG_RADIAN_VALUE 0x91
+#define FT6X36_REG_OFFSET_LEFT_RIGHT 0x92
+#define FT6X36_REG_OFFSET_UP_DOWN 0x93
+#define FT6X36_REG_DISTANCE_LEFT_RIGHT 0x94
+#define FT6X36_REG_DISTANCE_UP_DOWN 0x95
+#define FT6X36_REG_DISTANCE_ZOOM 0x96
+#define FT6X36_REG_LIB_VERSION_H 0xA1
+#define FT6X36_REG_LIB_VERSION_L 0xA2
+#define FT6X36_REG_CHIPID 0xA3
+#define FT6X36_REG_INTERRUPT_MODE 0xA4
+#define FT6X36_REG_POWER_MODE 0xA5
+#define FT6X36_REG_FIRMWARE_VERSION 0xA6
+#define FT6X36_REG_PANEL_ID 0xA8
+#define FT6X36_REG_STATE 0xBC
+
+#define FT6X36_PMODE_ACTIVE 0x00
+#define FT6X36_PMODE_MONITOR 0x01
+#define FT6X36_PMODE_STANDBY 0x02
+#define FT6X36_PMODE_HIBERNATE 0x03
+
+#define FT6X36_VENDID 0x11
+#define FT6206_CHIPID 0x06
+#define FT6236_CHIPID 0x36
+#define FT6336_CHIPID 0x64
+
+#define FT6X36_DEFAULT_THRESHOLD 22
+
+static struct bus_i2c_node touch;
+static struct bus_i2c_node_cfg touch_i2c_cfg = {
+ .node_cfg.bus_name = MYNEWT_VAL(FT6X36_I2C_DEV_NAME),
+ .addr = FT6X36_ADDR,
+ .freq = MYNEWT_VAL(FT6X36_I2C_FREQ),
+};
+
+struct touch_screen_data {
+ int last_x;
+ int last_y;
+};
+
+struct os_dev *touch_dev;
+static lv_indev_drv_t ft6x36drv;
+static lv_indev_t *ft6x36dev;
+static struct touch_screen_data touch_screen_data;
+static bool ft6x36_notify;
+
+static int
+ft6x36_read_registers(struct os_dev *dev, uint8_t reg, uint8_t *buf, size_t
buf_size)
+{
+ return bus_node_simple_write_read_transact(dev, ®, 1, buf, buf_size);
+}
+
+static int
+ft6x36_read_register(struct os_dev *dev, uint8_t reg, uint8_t *reg_val)
+{
+ return bus_node_simple_write_read_transact(dev, ®, 1, reg_val, 1);
+}
+
+static int
+ft6x36_write_register(struct os_dev *dev, uint8_t reg, uint8_t reg_val)
+{
+ uint8_t buf[2] = { reg, reg_val };
+
+ return bus_node_simple_write(dev, buf, 2);
+}
+
+static void
+ft6x36_int_isr(void *arg)
+{
+ ft6x36_notify = true;
+}
+
+/**
+ * Get the current position and state of the touchpad
+ * @param data store the read data here
+ */
+static void
+ft6x36read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data)
+{
+ struct os_dev *dev = indev_drv->user_data;
+ uint8_t buf[5];
+ int16_t x;
+ int16_t y;
+ int16_t raw_x;
+ int16_t raw_y;
+ bool pressed;
+
+ if (MYNEWT_VAL(FT6X36_INT_PIN) < 0 || ft6x36_notify) {
+ ft6x36_notify = false;
+ ft6x36_read_registers(dev, FT6X36_REG_NUM_TOUCHES, buf, sizeof(buf));
+ raw_x = ((buf[1] << 8) | buf[2]);
+ raw_y = ((buf[3] << 8) | buf[4]);
+ pressed = buf[0] != 0;
+ if (pressed) {
+ x = raw_x & 0xFFF;
+ y = raw_y & 0xFFF;
+
+ if (x != touch_screen_data.last_x || y !=
touch_screen_data.last_y) {
+ FT6X36_LOG_DEBUG("Touch x=%d y=%d\n", x, y);
+ }
+
+ touch_screen_data.last_x = x;
+ touch_screen_data.last_y = y;
+ data->state = LV_INDEV_STATE_PRESSED;
+ } else {
+ x = touch_screen_data.last_x;
+ y = touch_screen_data.last_y;
+ data->state = LV_INDEV_STATE_RELEASED;
+ }
+ data->point.x = x;
+ data->point.y = y;
+ }
+}
+
+/**
+ * Initialize the FT6X36
+ */
+void
+ft6x36_register_lv_indev(void)
+{
+ uint8_t panel_id;
+ uint8_t chip_id;
+ int ret;
+
+ if (MYNEWT_VAL(FT6X36_RESET_PIN) >= 0) {
+ hal_gpio_init_out(MYNEWT_VAL(FT6X36_RESET_PIN), 1);
+ }
+ do {
+ ret = ft6x36_read_register(touch_dev, FT6X36_REG_PANEL_ID, &panel_id);
+ if (ret || panel_id != FT6X36_VENDID) {
+ FT6X36_LOG_ERROR("Touchscreen not detected.\n");
+ break;
+ }
+ ret = ft6x36_read_register(touch_dev, FT6X36_REG_CHIPID, &chip_id);
+ if (ret || chip_id != FT6336_CHIPID) {
+ FT6X36_LOG_ERROR("Touchscreen not detected.\n");
+ break;
+ }
+ if (MYNEWT_VAL(FT6X36_INT_PIN) >= 0) {
+ hal_gpio_irq_init(MYNEWT_VAL(FT6X36_INT_PIN),
+ ft6x36_int_isr, NULL, HAL_GPIO_TRIG_FALLING,
HAL_GPIO_PULL_NONE);
+ }
+ ft6x36_write_register(touch_dev, FT6X36_REG_DEVICE_MODE, 0x00);
+ ft6x36_write_register(touch_dev, FT6X36_REG_THRESHHOLD,
MYNEWT_VAL(FT6X36_THRESHOLD));
+ ft6x36_write_register(touch_dev, FT6X36_REG_TOUCHRATE_ACTIVE, 0x0E);
+
+ /* Register a keypad input device */
+ lv_indev_drv_init(&ft6x36drv);
+ ft6x36drv.type = LV_INDEV_TYPE_POINTER;
+ ft6x36drv.read_cb = ft6x36read;
+ ft6x36drv.user_data = touch_dev;
+ ft6x36dev = lv_indev_drv_register(&ft6x36drv);
+ FT6X36_LOG_INFO("Touchscreen registered\n");
+ } while (0);
+}
+
+void
+ft6x36_os_dev_create(void)
+{
+ struct bus_node_callbacks cbs = {0};
+ int rc;
+
+ if (MYNEWT_VAL(FT6X36_RESET_PIN) >= 0) {
+ hal_gpio_init_out(MYNEWT_VAL(FT6X36_RESET_PIN), 1);
+ }
+
+ bus_node_set_callbacks((struct os_dev *)&touch, &cbs);
+
+ rc = bus_i2c_node_create("touch", &touch, &touch_i2c_cfg, NULL);
+ assert(rc == 0);
+ touch_dev = os_dev_open("touch", 0, NULL);
+}
diff --git a/hw/drivers/display/lvgl/indev/ft6x36/syscfg.yml
b/hw/drivers/display/lvgl/indev/ft6x36/syscfg.yml
new file mode 100644
index 000000000..53e544aea
--- /dev/null
+++ b/hw/drivers/display/lvgl/indev/ft6x36/syscfg.yml
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+syscfg.defs:
+ FT6X36_I2C_DEV_NAME:
+ description: SPI device name that LCD is connected to.
+ value: '"i2c0"'
+ FT6X36_I2C_FREQ:
+ description: I2C device frequency for touch screen
+ value: 400
+ FT6X36_INT_PIN:
+ description: FT6X36 interrupt pin.
+ value: -1
+ FT6X36_RESET_PIN:
+ description: FT6X36 reset pin.
+ value: -1
+ FT6X36_THRESHOLD:
+ description: FT6X36 threshold value.
+ value: 10
+
+ FT6X36_LOG_MODULE:
+ description: 'Numeric module ID to use for FT6X36 log messages.'
+ value: 36
+ FT6X36_LOG_LVL:
+ description: 'Minimum level for the FT6X36 log.'
+ value: 1
+
+syscfg.logs:
+ FT6X36_LOG:
+ module: MYNEWT_VAL(FT6X36_LOG_MODULE)
+ level: MYNEWT_VAL(FT6X36_LOG_LVL)
diff --git a/hw/drivers/display/lvgl/pkg.yml b/hw/drivers/display/lvgl/pkg.yml
index e9ef05425..9e37327b2 100644
--- a/hw/drivers/display/lvgl/pkg.yml
+++ b/hw/drivers/display/lvgl/pkg.yml
@@ -75,6 +75,8 @@ pkg.deps.LVGL_XPT2046:
- "@apache-mynewt-core/hw/drivers/display/lvgl/indev/xpt2046"
pkg.deps.LVGL_STMPE610:
- "@apache-mynewt-core/hw/drivers/display/lvgl/indev/stmpe610"
+pkg.deps.LVGL_FT6X36:
+ - "@apache-mynewt-core/hw/drivers/display/lvgl/indev/ft6x36"
pkg.deps.LVGL_ADC_TOUCH:
- "@apache-mynewt-core/hw/drivers/display/lvgl/indev/adc_touch"
pkg.deps.LVGL_TRACKBALL:
diff --git a/hw/drivers/display/lvgl/syscfg.yml
b/hw/drivers/display/lvgl/syscfg.yml
index b6188161e..7acf04ffd 100644
--- a/hw/drivers/display/lvgl/syscfg.yml
+++ b/hw/drivers/display/lvgl/syscfg.yml
@@ -43,6 +43,9 @@ syscfg.defs:
LVGL_STMPE610:
description: Enable STMPE610 touchscreen driver.
value:
+ LVGL_FT6X36:
+ description: Enable FT6X36 touchscreen driver.
+ value:
LVGL_CST816S:
description: Enable CST816S touchscreen driver.
value: