rtt的io设备框架面向对象学习-电阻屏LCD设备

目录

    • 1.8080通信的电阻屏LCD设备
      • 1.1 构造流程
      • 1.2 使用
        • 2.i2c和spi通信的电阻屏LCD

电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的。

1.8080通信的电阻屏LCD设备

rtt没有实现的设备驱动框架层,那么是在驱动层直接实现的,以stm32f407-atk-explorer为例,在/bsp / stm32 / stm32f407-atk-explorer / board / ports /drv_lcd.c中定义了该设备类:

struct drv_lcd_device
{struct rt_device parent;struct rt_device_graphic_info lcd_info;
};

其中struct rt_device_graphic_info是在/ components / drivers / include / drivers /classes/graphic.h定义的:

struct rt_device_graphic_info
{rt_uint8_t  pixel_format;                           /**< graphic format */rt_uint8_t  bits_per_pixel;                         /**< bits per pixel */rt_uint16_t pitch;                                  /**< bytes per line */rt_uint16_t width;                                  /**< width of graphic device */rt_uint16_t height;                                 /**< height of graphic device */rt_uint8_t *framebuffer;                            /**< frame buffer */rt_uint32_t smem_len;                               /**< allocated frame buffer size */
};

然后实例化了该设备类

static struct drv_lcd_device _lcd;

1.1 构造流程

并实现了其构造函数drv_lcd_hw_init:

int drv_lcd_hw_init(void)
{rt_err_t result = RT_EOK;struct rt_device *device = &_lcd.parent;/* memset _lcd to zero */memset(&_lcd, 0x00, sizeof(_lcd));_lcd.lcd_info.bits_per_pixel = 16;_lcd.lcd_info.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565;device->type = RT_Device_Class_Graphic;
#ifdef RT_USING_DEVICE_OPSdevice->ops = &lcd_ops;
#elsedevice->init = drv_lcd_init;device->control = drv_lcd_control;
#endifdevice->user_data = &fsmc_lcd_ops;/* register lcd device */rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);return result;
}
INIT_DEVICE_EXPORT(drv_lcd_hw_init);

可以看到其重写了父类——设备基类的方法——但是只是重写了init方法和control方法。
其对象图如下
请添加图片描述
从上面代码可以知道它是调用在/ components / drivers / core /device.c中设备基类的构造函数rt_device_register,将电阻屏LCD设备对象放到对象容器里管理。

详细参见io设备管理层。
https://blog.csdn.net/yhb1206/article/details/136440373

1.2 使用

在/bsp / stm32 / stm32f407-atk-explorer / board / ports / touch /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);

void xpt2046_init_hw(void)
{……lcd = rt_device_find("lcd");rt_device_init(lcd);
}

在rtt的io设备框架面向对象学习-touch设备中说过,因为此bsp的LCD是电阻触摸LCD屏,所以在xpt2046_init_hw中初始化触摸设备,最后也初始化了LCD,如上代码。
在xpt2046_entry线程中,读取到触摸坐标点,若开启了lvgl绘图,则通知lvgl绘图,否则直接调用rt_graphix_ops(lcd)->set_pixel在LCD上绘制点的轨迹。

lvgl对接有lcd的绘点接口,暂忽略。

rt_graphix_ops(lcd)->set_pixel是/ components / drivers / include / drivers /classes/graphic.h定义的lcd操作接口:

struct rt_device_graphic_ops
{void (*set_pixel) (const char *pixel, int x, int y);void (*get_pixel) (char *pixel, int x, int y);void (*draw_hline)(const char *pixel, int x1, int x2, int y);void (*draw_vline)(const char *pixel, int x, int y1, int y2);void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
};
#define rt_graphix_ops(device)          ((struct rt_device_graphic_ops *)(device->user_data))

而之前drv_lcd.c中实现了该接口:

struct rt_device_graphic_ops fsmc_lcd_ops ={LCD_Fast_DrawPoint,LCD_ReadPoint,LCD_HLine,LCD_VLine,LCD_BlitLine,
};

并在构造函数drv_lcd_hw_init中赋给了设备基类的user_data 成员

device->user_data = &fsmc_lcd_ops;

这样就能直接操作lcd绘图。

2.i2c和spi通信的电阻屏LCD

至于i2c和spi通信的电阻屏LCD是怎么操作的,通过查找,是没有新的对象的,都是直接对i2c总线和spi设备关联,直接包装发送数据即可,没有上面8080通信口那样子的新的设备框架对象。
spi的LCD屏可以参照官方开发板麻雀一号开发板。
i2c未找到参照物,但是应该是spi一样。

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

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

相关文章

centos7安装kafka、zookeeper

安装jdk 安装jdk8 安装zookeeper 在指定目录执行下载命令 我是在/newdisk/zookeeper目录下 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz --no-check-certificate下载好后并解压 tar -zxvf apache-zookeeper-3.5…

【Maven】Maven 基础教程(四):搭建 Maven 私服 Nexus

《Maven 基础教程》系列&#xff0c;包含以下 4 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作&#xff0c;不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成&#xff0c;codebase中并无相对应的代码。举个例子&#xff0c;目前使用的STM的一款eSE&#xff0c;但是这款eSE的开发STM还没有完…

HarmonyOS—HAP唯一性校验逻辑

HAP是应用安装的基本单位&#xff0c;在DevEco Studio工程目录中&#xff0c;一个HAP对应一个Module。应用打包时&#xff0c;每个Module生成一个.hap文件。 应用如果包含多个Module&#xff0c;在应用市场上架时&#xff0c;会将多个.hap文件打包成一个.app文件&#xff08;称…

matlab 提取分割位于多边形区域边缘内部或边缘上的点

[in,on] = inpolygon(xq,yq,xv,yv) xv 和 yv 为定义的多边形区域的,如xv = [1 4 4 1 1 ];yv = [1 1 4 4 1 ];注意最后一个数字与第一个重复,保证多边形闭合; xq 和 yq 为待查询的点in:在多边形内部和边缘的点序号on:仅在多边形边缘的点序号 提取分割方法: matrix=[xq yq…

大数据技术学习笔记(五)—— MapReduce(1)

目录 1 MapReduce 概述1.1 MapReduce 定义1.2 MapReduce 优缺点1.3 MapReduce 核心思想1.4 MapReduce 进程1.5 Hadoop 序列化类型1.6 MapReduce 编程规范1.7 WordCount 案例实操1.7.1 案例需求1.7.2 环境准备1.7.3 编写程序1.7.4 测试 2 MapReduce 序列化2.1 序列化概述2.2 自定…

浅析volatile关键字

浅析volatile关键字 文章目录 浅析volatile关键字1. volatile关键字的意义2.volatile应用3. volatile常见问题总结 1. volatile关键字的意义 ​ 被 volatile 修饰的变量&#xff0c;在对其进行读写操作时&#xff0c;会引发一些可观测的副作用。而这些可观测的副作用&#xff…

sql单表运用11.3

一、进入数据库操作界面 1、mysql -u root -p 敲回车 &#xff0c;输入密码 &#xff0c;进入数据库操作界面 2、show databases 查看所有的数据&#xff08;如果没有数据库&#xff1a;创建数据库 create database 库名称&#xff09; 3、use 数据库名 使…

软件工程顶会——ICSE '24 论文清单、摘要

1、A Comprehensive Study of Learning-based Android Malware Detectors under Challenging Environments 近年来&#xff0c;学习型Android恶意软件检测器不断增多。这些检测器可以分为三种类型&#xff1a;基于字符串、基于图像和基于图形。它们大多在理想情况下取得了良好的…

为啥要用C艹不用C?

在很多时候&#xff0c;有人会有这样的疑问 ——为什么要用C&#xff1f;C相对于C优势是什么&#xff1f; 最近两年一直在做Linux应用&#xff0c;能明显的感受到C带来到帮助以及快感 之前&#xff0c;我在文章里面提到环形队列 C语言&#xff0c;环形队列 环形队列到底是怎么回…

NLP_文本数据分析_3(代码示例)

目标 了解文本数据分析的作用.掌握常用的几种文本数据分析方法. 1 文件数据分析介绍 文本数据分析的作用: 文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择. 常用的几种文本数据分析方法: 标签数量分布句…

场景问题: VisualVM工具Profiler JDBC不是真实执行的SQL

1. 问题 诡异的问题表象&#xff1a; 前端反馈分页接口的Total字段一直为0 使用Visualvm中的 Profiler 注入到应用后&#xff0c;查看JDBC监控得到了分页接口执行的SQL&#xff0c;复制出来执行是55. 此时还没有注意到 IN 的范围中有一个特别的值 NULL &#x1f928; 2. 排查…

视觉Transformers中的位置嵌入 - 研究与应用指南

视觉 Transformer 中位置嵌入背后的数学和代码简介。 自从 2017 年推出《Attention is All You Need》以来&#xff0c;Transformer 已成为自然语言处理 (NLP) 领域最先进的技术。 2021 年&#xff0c;An Image is Worth 16x16 Words 成功地将 Transformer 应用于计算机视觉任务…

idea中引入新JDK环境

在不同的项目中往往会需要不同的运行环境&#xff0c;那么如何下载一个新的环境并运用到idea中呢&#xff1f; 下面给出的就是oracle官网&#xff0c;以JDK17为例教大家如何下载 Java Archive Downloads - GraalVM for JDK 17https://www.oracle.com/java/technologies/javase…

Python数据可视化库之bashplotlib使用详解

概要 在数据可视化领域,Python拥有许多优秀的库,如Matplotlib、Seaborn等,它们可以创建漂亮而复杂的图形。但是,有时候我们可能需要在终端中绘制简单的图形,这时候Bashplotlib就派上了用场。Bashplotlib是一个Python库,可以在终端中绘制基本的图形,如条形图、散点图等。…

YOLOV9训练集制作+Train+Val记录

一、YOLO数据集格式分布 在YOLO中&#xff0c;数据集的分布如图&#xff0c;在dataset文件夹下有imags&#xff08;图片&#xff09;和labels&#xff08;标签&#xff09;。在images和labels文件夹下又分别存放三个文件夹&#xff0c;分别对应测试集、训练集、验证集&#xff…

使用postman测试若依其他业务接口API—3

请求方式 如上&#xff0c;使用Get请求来获取练习题库中的所有习题数据。 请求地址 在请求路径栏输入请求地址&#xff0c;以下图为例&#xff1a; 参数体与鉴权 在Parms键入所需参数&#xff0c;其中key为键,value为键的值&#xff1a;如下图所示&#xff1a; 认证成功与失…

持续集成(CICD)- gogs仓库的部署和使用

文章目录 一、gogs的介绍二、部署gog仓库三、首次启动gogs四、登录五、创建一个非空仓库六、从仓库拉取代码到本地七、把本地编辑的代码上传到仓库 一、gogs的介绍 Gogs作为一个轻量级、易于部署和使用的自托管Git服务&#xff0c;为小型团队和个人开发者提供了一个简单而强大…

【AIGC】如何提高Prompt准确度

前言 随着人工智能的迅猛进展&#xff0c;AIGC&#xff08;通用人工智能聊天工具&#xff09;已成为多个行业中不可或缺的自然语言处理技术。Prompt作为AIGC系统的一项关键功能&#xff0c;在工具的有效运作中发挥了举足轻重的作用。本篇文章将深入探讨Prompt与AIGC之间的紧密…

python笔记_程序流程控制2

C&#xff0c;循环控制 1&#xff0c;for循环 功能&#xff1a;让代码循环运行 语法&#xff1a; for <变量> in <范围、序列>&#xff1a; <循环操作语句> 例 nums &#xff08;1,2,3,4&#xff09; <class list> for i in nums&#xff1a; print&…