RT-Thread 软件包-LVGL用户手册-LVGL触摸屏驱动的对接与移植①

本文详细介绍了如何在RT-Thread中将LVGL触摸屏驱动与STM32F469的FT6336或FT6206触摸芯片对接并移植,包括Kconfig文件的配置、LVGL输出设备初始化和读取回调函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RT-Thread 软件包-LVGL用户手册-LVGL触摸屏驱动的对接与移植①

在这里插入图片描述

LVGL触摸屏驱动的对接与移植

1 介绍

本章节介绍如何使用RT-Thread的Touch框架来讲触摸屏驱动对接到LVGL输入设备框架上。

目前RT-Thread的Touch框架以及触摸驱动软件包已经很完善,囊括了多种常用的触摸芯片:

touch-pkgs

2 前期准备

这里我以 stm32f469-st-disco BSP为例。该开发板不同批次有两种两种触摸芯片,分别是 FT6336 和 FT6206,这里以 FT6336 为例。首先我们应该查询一下芯片的手册:
在这里插入图片描述

datasheet

这里为什么要叫大家先看一下数据手册呢,显然,目前软件包还没有支持 FT6336 这个触摸芯片,当我们查找数据手册知道,原来他们属于 FT6x36 系列的触摸芯片。那我们可以知道软件包里面是有 FT6236 这个触摸驱动的。所以,我们可以使用这个触摸驱动来移植。

ft6236


详细内容参考:软件包介绍

FT6236
简介
ft6236 软件包提供了使用触摸芯片 ft6236 基本功能,并且本软件包已经对接到了 Touch 框架,通过 Touch 框架,开发者可以快速的将此触摸芯片驱动起来。

支持情况
FT6236 触摸芯片 支持情况
I2C 通讯接口 √
中断的工作模式
轮询的工作模式 √

使用说明
软件包依赖

  • RT-Thread 4.0.0+


 \ | /
- RT -     Thread Operating System
 / | \     4.0.3 build Jul 23 2020
 2006 - 2020 Copyright by rt-thread team
 msh >
  • Touch 组件,在 menuconfig 中开启 Touch 组件的路径如下:
RT-Thread Components  --->
    Device Drivers  --->
        [*] Using Touch device drivers
I2C 驱动:ft6236 设备使用 I2C 进行数据通讯,需要系统 I2C 驱动支持,在 menuconfig 中开启 I2C 驱动的路径如下:
Hardware Drivers Config  --->
    On-chip Peripheral Drivers  --->
        [*] Enable I2C1 BUS (software simulation)  --->

获取软件包
使用 ft6236 软件包需要在 RT-Thread 的包管理中选中它,具体路径如下:

RT-Thread online packages  --->
    peripheral libraries and drivers  --->
        touch drivers  --->
            FT6236 touch driver package.
              Version (latest)  --->
              [ ]   Enable 6236 example (NEW)

配置完成后,使用 pkgs --update 更新软件包。

使用软件包
ft6236 软件包初始化函数如下所示:

int rt_hw_ft6236_init(const char *name, struct rt_touch_config *cfg,  rt_base_t pin)

该函数需要由用户调用,函数主要完成的功能有:

  • 设备配置和初始化(根据传入的配置信息,配置接口设备);
  • 注册相应的传感器设备,完成 ft6236 设备的注册;
  • 设置复位引脚
    初始化示例
#define REST_PIN GET_PIN(D, 3)

int rt_hw_6236_init(void)
{
    struct rt_touch_config config;
    config.dev_name = "i2c1";
    
    rt_hw_ft6236_init("touch", &config, REST_PIN);
    
    return 0;
}
INIT_ENV_EXPORT(rt_hw_ft6236_init);

注意事项
该软件包目前仅提供一个触点。
在初始化示例中,需要根据自己板子上的实际连接情况,修改 I2C 的设备名。


3 正式移植

3.1 编写Kconfig文件
config BSP_USING_TOUCH_FT6X36
    bool "FT6x36"
    select BSP_USING_I2C1
    select PKG_USING_TOUCH_DRIVERS
    select PKG_USING_FT6236

根据原理图选择具体的I2C总线(根据自己BSP的通信方式)
开启软件包的触摸驱动框架
选择一款具体的触摸驱动软件包

config BSP_USING_LVGL
    bool "Enable LVGL for LCD"
    select BSP_USING_LCD_OTM8009A
    select PKG_USING_LVGL
    select BSP_USING_TOUCH_FT6X36
    default n

在LVGL的配置项添加 select BSP_USING_TOUCH_FT6X36

3.2 修改 lv_port_indev.c 文件
3.2.1 Touch的硬件初始化
static int lv_hw_touch_init(void)
{
    struct rt_touch_config cfg;

    cfg.dev_name = BSP_TOUCH_I2C_BUS_NAME;/* 使用的I2C设备名 */
#ifdef BSP_USING_TOUCH_FT6X36
    rt_hw_ft6236_init(TOUCH_DEV_NAME, &cfg, BSP_TOUCH_I2C_RESET_PIN); /* 软件包提供的初始化函数 */
#endif /* BSP_USING_TOUCH_FT6X36 */

    touch_dev = rt_device_find(TOUCH_DEV_NAME);
    if (rt_device_open(touch_dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK)
    {
        LOG_E("Can't open touch device:%s", TOUCH_DEV_NAME);
        return -RT_ERROR;
    }

    return RT_EOK;
}

INIT_COMPONENT_EXPORT(lv_hw_touch_init);

这里就参考软件包的使用方法:

ft-6236-init

3.2.2 LVGL的输出设备初始化
void lv_port_indev_init(void)
{
    static lv_indev_drv_t indev_drv;

    lv_indev_drv_init(&indev_drv); /*Basic initialization*/
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = input_read;

    /*Register the driver in LVGL and save the created input device object*/
    touch_indev = lv_indev_drv_register(&indev_drv);
}
3.2.3 完成LVGL的读取回调函数 input_read
static void input_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data)
{
    struct rt_touch_data *read_data;
    /* 可以将内存分配这个步骤改为全局变量,以提高读取效率 */
    read_data = (struct rt_touch_data *)rt_calloc(1, sizeof(struct rt_touch_data));

    rt_device_read(touch_dev, 0, read_data, 1);

    /* 如果没有触摸事件,直接返回 */
    if (read_data->event == RT_TOUCH_EVENT_NONE)
        return;

    /* 这里需要注意的是:触摸驱动的原点可能和LCD的原点不一致,所以需要我们进行一些处理 */
#ifdef BSP_USING_TOUCH_FT6X36
    data->point.x = read_data->y_coordinate;
    data->point.y = LCD_HEIGHT - read_data->x_coordinate;
#endif /* BSP_USING_TOUCH_FT6X36 */

    if (read_data->event == RT_TOUCH_EVENT_DOWN)
        data->state = LV_INDEV_STATE_PR;
    if (read_data->event == RT_TOUCH_EVENT_MOVE)
        data->state = LV_INDEV_STATE_PR;
    if (read_data->event == RT_TOUCH_EVENT_UP)
        data->state = LV_INDEV_STATE_REL;
}

这个可以参考RT-Thread 文档中心的Touch框架的使用 :

touch-use


维护人:

RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl 中显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形库的个回调函数的机制,将各个事件对应的操作所绑定起来,当滑动滑条时对应的滑条的回调函数就会被触发,那么就会执行滑条回调函数的内容,当滑动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木样方便, RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华为奋斗者精神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值