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

news2024/9/21 14:48:59

目录

        • 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处理模块,否则就在屏幕上显示触摸点痕迹。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity 场景烘焙中植物叶片(单面网络)出现的白面

Unity版本 2021.3.3 平台 Windows 在场景烘焙中烘焙植物的模型的时候发现植物的叶面一面是合理的,背面是全白的,在材质球上勾选了双面烘焙,情况如下 这个问题可能是由于植物叶片的单面网格导致的。在场景烘焙中,单面网格只会在一…

nginx:rewrite重写指令及防盗链

目录 一、ngx_http_rewrite_module模块指令 1、if指令 1.1 if指令基本语法 1.2 if指令操作 1.2.1 案例一 1.2.2 案例二 2、return命令 3、set命令 4、break指令 5、rewrite指令 5.1 rewrite指令基本语法 5.1.1 regex正则表达式 5.1.2 flag可选标记 5.2 rewrite指…

【MySQL面试复习】发现了某个SQL语句执行很慢,如何进行分析?

系列文章目录 在MySQL中,如何定位慢查询? 系列文章目录发现了某个SQL语句执行很慢,如何进行分析? 发现了某个SQL语句执行很慢,如何进行分析? 一般SQL语句执行过慢的话需要考虑是否是聚合查询和多表查询&a…

第六节:Vben Admin权限-后端控制方式

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、角色权限(后端…

店匠科技颁布 Shoplazza Awards:品牌出海迎历史性机遇,赋能品牌腾飞

在全球化的今天,中国品牌在全球市场的地位日益显著,品牌意识的提升推动了企业出海战略的全新转型。以全球电商市场发展为例,根据 ecommerceBD 数据,2023 年全球零售电子商务销售额预计 6.3 万亿美元,到 2026 年&#x…

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测(完整源码和数据&a…

AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境应用

原文链接:AI大预言模型——ChatGPT在地学、GIS、气象、农业、生态、环境应用 一开启大模型 1 开启大模型 1)大模型的发展历程与最新功能 2)大模型的强大功能与应用场景 3)国内外经典大模型(ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diff…

蓝桥杯 信号覆盖

遍历每一个坐标轴上的点&#xff0c;带入圆的方程&#xff0c;看是否在圆内或圆上 #include<bits/stdc.h> using namespace std; int main() {int w,h,n,r,i,j,k,s,ans0;cin>>w>>h>>n>>r;int x[n1],y[n1];for(i0;i<n;i){cin>>x[i]>&…

Spring全面精简总结

Spring两大核心功能&#xff1a;IOC控制反转、AOP面向切面的编程 一、IOC控制反转 1.1、控制反转和依赖注入的概念&#xff1a; 控制反转(loC&#xff0c;Inversion of Control)&#xff0c;是一个概念&#xff0c;是一种思想。指将传统上由程序代码直接操控的对象调用权…

2326. 王者之剑(网络流,最小割,最大权独立集,最小点权覆盖)

活动 - AcWing 给出一个 nm 网格&#xff0c;每个格子上有一个价值 vi,j 的宝石。 Amber 可以自己决定起点&#xff0c;开始时刻为第 0 秒。 以下操作&#xff0c;在每秒内按顺序执行。 若第 i 秒开始时&#xff0c;Amber 在 (x,y)&#xff0c;则 Amber 可以拿走 (x,y) 上的…

spring.factories的常用配置项

概述 spring.factories 实现是依赖 spring-core 包里的 SpringFactoriesLoader 类&#xff0c;这个类实现了检索 META-INF/spring.factories 文件&#xff0c;并获取指定接口的配置的功能。 Spring Factories机制提供了一种解耦容器注入的方式&#xff0c;帮助外部包&am…

qsort函数 结构体比较(strcmp函数(比较字符串的大小))

strcmp函数应用于qsort函数&#xff0c;排序创建函数指针时比较字符串大小。 这里我创建了一个简单的学生结构体&#xff0c;这个结构体只包含名字跟年龄两个信息。 在创建函数指针cmp_stu_age后&#xff0c;进行年龄大小比较&#xff0c;强制类型转换成stu*。 int cmp_stu_ag…

报错问题解决django.db.utils.OperationalError: (1049, “Unknown database ‘ mxshop‘“)

开发环境&#xff1a;ubuntu22.04 pycharm 功能&#xff1a;django连接使用mysql数据库&#xff0c;各项配置看似正常 报错&#xff1a; django.db.utils.OperationalError: (1049, "Unknown database mxshop") 分析检查原因&#xff1a; Setting的配置文件内&…

【JavaEE】_HttpServletResponse类

目录 1. 核心方法 2. 关于setStatus(400)与sendError 2.1 setStatus(400) 2.2 sendError 3. setHeader方法 4. 构造重定向响应 4.1 使用setHeader和setStatus实现重定向 4.2 使用sendRedirect实现重定向 本专栏已有文章介绍HttpServlet和HttpServletRequest类&#…

使用Python语言实现一个基于动态数组的序列队列

一、动态数组的实现 首先&#xff0c;我们需要创建一个DynamicArray类&#xff0c;该类将管理我们的动态数组。 动态数组能够动态地调整其大小&#xff0c;以容纳更多的元素。 目录 一、动态数组的实现 代码示例&#xff1a; 二、序列队列的实现 接下来&#xff0c;我…

【rust】10 project、crate、mod、pub、use、项目目录层级组织、概念和实战

文章目录 一、项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用…

Mathtype安装时word启动显示“文件未找到:MathPage.WLL”

背景 由于老板布置的临时工作&#xff0c;需要安装Mathtype&#xff0c;但尝试了3个不同的版本后&#xff08;每次都卸载干净了&#xff09;&#xff0c;均未能成功安装&#xff0c;出现的报错3个版本各不相同&#xff1a; ①解压安装过程中失败&#xff08;这个版本不再尝试…

数据可视化原理-腾讯-热力图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

MySQL、高级SQL操作

学习数据库的目的 岗位需求、大数据时代、被迫需求&#xff0c;存数据 数据库是所有软件体系中最核心的存在 数据库 DB DB dataBase 数据仓库&#xff0c;软件&#xff0c;安装在window、linux、mac上&#xff0c;可以存储大量数据&#xff0c;500w 作用&#xff1a;存储数据…

docker的数据卷和docker的自定义镜像

docker的数据卷和docker的自定义镜像 1.docker的数据卷1.1创建 docker volume create 数据卷名称1.2 查看数据卷docker volume ls1.3 删除一个volume 2.将宿主机的目录与容器的目录进行挂载&#xff0c;实现数据共享2.1数据卷相互共享 3.自定义镜像3.1编辑Dockerfiile文件 vim …