rtt的io设备框架面向对象学习-touch设备

2024-03-01 11:36

本文主要是介绍rtt的io设备框架面向对象学习-touch设备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

        • 1.触摸设备基类
        • 2.触摸设备基类的子类
        • 3.初始化/构造流程
          • 3.1设备驱动层
          • 3.2 设备驱动框架层
          • 3.3 设备io管理层
        • 4.总结
        • 5.使用
            • 5.1实例

1.触摸设备基类

此层处于设备驱动框架层。此层的类是抽象类

在/ components / drivers / include / drivers /touch.h定义了如下touch设备基类
struct rt_touch_device
{
struct rt_device parent;
struct rt_touch_info info;
struct rt_touch_config config;
const struct rt_touch_ops *ops;
rt_err_t (*irq_handle)(rt_touch_t touch);
};

触摸设备基类是继承自设备基类,再增加私有属性和方法而成。

触摸设备基类中抽象出的共性操作方法定义如下
struct rt_touch_ops
{
rt_size_t (*touch_readpoint)(struct rt_touch_device *touch, void *buf, rt_size_t touch_num);
rt_err_t (*touch_control)(struct rt_touch_device *touch, int cmd, void *arg);
};
抽象出了读取坐标点方法和控制方法。

该类的构造函数:rt_hw_touch_register。

2.触摸设备基类的子类

此层是设备驱动层,此类是实现类,由各个bsp实现。例如
/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch /drv_touch_xpt.h定义的xpt2046触摸设备类。
其他芯片厂家如此这般一样。

3.初始化/构造流程

以stm32为例,从设备驱动层、设备驱动框架层到io设备管理层从下到上的构造/初始化流程如下

3.1设备驱动层

此层是驱动层,是bsp所在,也是可以实例化的实现类所在。

/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch / drv_touch_xpt.h中

定义了stm32的xpt2046触摸设备类
struct rt_xpt2046
{
struct rt_touch_device parent;
struct rt_spi_device *spi;
rt_uint16_t min_raw_x;
rt_uint16_t min_raw_y;
rt_uint16_t max_raw_x;
rt_uint16_t max_raw_y;
};

xpt2046触摸设备类的组成:
继承自触摸设备基类,
又关联了spi设备类,因为它这个开发板的触摸设备是spi通信的,所以要关联下,
然后又记录下触摸屏输出得最小最大xy值,用以计算并限制输出范围。

其构造函数: xpt2046_hw_init。

/ bsp / stm32 / stm32f407-atk-explorer / board / ports / touch / drv_touch_xpt.c中

实现了其构造函数 xpt2046_hw_init。

在其构造函数中实例化了xpt2046触摸设备类:
rt_xpt2046_t dev_obj = rt_malloc(sizeof(struct rt_xpt2046));

然后初始化其私有属性和父类(触摸设备基类)部分属性,然后重写父类(触摸设备基类)的方法:
dev_obj->parent.ops = &xpt2046_ops;

重写的方法定义如下:
static struct rt_touch_ops xpt2046_ops =
{
.touch_readpoint = xpt2046_touch_readpoint,
.touch_control = xpt2046_touch_control,
};
然后调用父类(触摸设备基类)的构造函数rt_hw_touch_register继续后续的初始化。

3.2 设备驱动框架层

/ components / drivers / touch / touch.c中实现了设备驱动框架层接口rt_hw_touch_register——也是触摸设备基类的构造函数——开启触摸设备基类的构造/初始化流程。

该层重写了触摸设备基类的父类——设备基类——的方法:
#ifdef RT_USING_DEVICE_OPS
device->ops = &rt_touch_ops;
#else
device->init = RT_NULL;
device->open = rt_touch_open;
device->close = rt_touch_close;
device->read = rt_touch_read;
device->write = RT_NULL;
device->control = rt_touch_control;
#endif

并最终调用触摸设备基类的父类——设备基类——的构造函数rt_device_register进行设备基类的初始化。

3.3 设备io管理层

在/ components / drivers / core 下的device.c中实现了设备基类的构造函数rt_device_register,它是io设备管理层的入口。
它将xpt2046触摸设备对象放到对象容器里管理。

4.总结

整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值——它这个结构体是包含一个个的结构体——模拟的是面向对象的继承机制。跟套娃似的,层层进行初始化。这样的好处是什么?每层有每层的初始化(构造)函数,就模拟了面向对象的构造函数——按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。
这样的好处是可扩展,如搭积木似的,也是对内封闭,对外开放,扩展性好,模拟的是面向对象的继承多态机制。

其实每个类的注册函数模拟的是面向对象的构造函数。

5.使用

文档

5.1实例

以上面xpt2046触摸设备为例,在**/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch /**下面3个相关文件:
drv_touch_xpt.c
drv_touch_xpt.h
drv_xpt2046_init.c

其中drv_touch_xpt.c和drv_touch_xpt.h实现了定义xpt2046触摸设备类及其实例化,并实现了该类的构造函数xpt2046_hw_init,前面第3节讲过。而drv_xpt2046_init.c是使用xpt2046触摸设备的。

该类对象是讲的触摸LCD屏上的触摸设备对象xpt2046,先澄清下这个。

drv_xpt2046_init.c中的使用如下:
static int touch_xpt2046_init(void)
{
xpt2046_init_hw();
rt_thread_t tid = rt_thread_create(“xpt2046”, xpt2046_entry, RT_NULL, 1024, 8, 20);
RT_ASSERT(tid != RT_NULL);
rt_thread_startup(tid);
return RT_EOK;
}
INIT_COMPONENT_EXPORT(touch_xpt2046_init);

可以看到它采用的rtt的自动初始化机制,在main_entry线程里自动调用。

xpt2046_init_hw();主要是获取第3节讲的xpt2046设备对象指针,然后又拿到硬件原理图链接的spi设备对象(相关的软件spi总线和spi设备早自动初始化了),然后查找lcd设备,启动lcd,然后触摸屏矫正。

而xpt2046_entry这个线程呢,就是检查触摸的线程,如果开启了LVGL就告诉lvgl处理模块,否则就在屏幕上显示触摸点痕迹。

这篇关于rtt的io设备框架面向对象学习-touch设备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762321

相关文章

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l