【Orangepi Zero2 全志H616】驱动OLED屏应用-IIC协议、设备的映射(mmap)

2023-11-07 18:12

本文主要是介绍【Orangepi Zero2 全志H616】驱动OLED屏应用-IIC协议、设备的映射(mmap),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、OLED屏幕
二、Orangepi的IIC接口
三、wiringPi库示例代码
四、Source insight 初步分析wiringP源码OLED_DEMO
五、设备的映射
六、mmap函数
七、简单OLED屏幕开发及实现

一、OLED屏幕

在这里插入图片描述

二、Orangepi的IIC接口

1) 由 26pin 的原理图可知, Orange Pi Zero 2 可用的 i2c 为 i2c3

在这里插入图片描述
在这里插入图片描述

sudo vim /boot/orangepiEnv.txtoverlays=i2c3

在这里插入图片描述

ls /dev/i2c-*

在这里插入图片描述

2. 启动 linux 系统后, 先确认下 /dev下存在 i2c-3 的设备节点

从命令运行结果能观察到系统支持I2C-3和I2C-5的驱动,而H616的外设我们看到只有一个IIC接口,用的是IIC-3
Linux一切皆文件,每个硬件设备“对应”一个文件,由驱动程序提供映射

cd /dev

在这里插入图片描述

3. 开始测试 i2c, 首先安装 i2c-tools

sudo apt-get install i2c-tools

在这里插入图片描述

4. 列出连接到I2C总线的设备的地址

sudo i2cdetect -y 3

在这里插入图片描述

三、wiringPi库示例代码

在这里插入图片描述

cp wiringOP/examples/oled_demo.c orangeOP/
cd orangeOP/
./build.sh oled_demo.c
sudo ./a.out /dev/i2c-3

在这里插入图片描述

/** Copyright (c) 2015, Vladimir Komendantskiy* MIT License** SSD1306 demo of block and font drawing.*///
// fixed for OrangePiZero by HypHop
//#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>#include "oled.h"
#include "font.h"int oled_demo(struct display_info *disp) {int i;char buf[100];//putstrto(disp, 0, 0, "Spnd spd  2468 rpm");//	oled_putstrto(disp, 0, 9+1, "Spnd cur  0.46 A");oled_putstrto(disp, 0, 9+1, "Welcome       to");disp->font = font1;//	oled_putstrto(disp, 0, 18+2, "Spnd tmp    53 C");oled_putstrto(disp, 0, 18+2, "----OrangePi----");disp->font = font2;//	oled_putstrto(disp, 0, 27+3, "DrvX tmp    64 C");oled_putstrto(disp, 0, 27+3, "This is 0.96OLED");oled_putstrto(disp, 0, 36+4, "");oled_putstrto(disp, 0, 45+5, "");disp->font = font1;//	oled_putstrto(disp, 0, 54, "Total cur  2.36 A");oled_putstrto(disp, 0, 54, "*****************");oled_send_buffer(disp);disp->font = font3;for (i=0; i<100; i++) {sprintf(buf, "Spnd spd  %d rpm", i);oled_putstrto(disp, 0, 0, buf);oled_putstrto(disp, 135-i, 36+4, "===");oled_putstrto(disp, 100, 0+i/2, ".");oled_send_buffer(disp);}//oled_putpixel(disp, 60, 45);//oled_putstr(disp, 1, "hello");return 0;
}void show_error(int err, int add) {//const gchar* errmsg;//errmsg = g_strerror(errno);printf("\nERROR: %i, %i\n\n", err, add);//printf("\nERROR\n");
}void show_usage(char *progname) {printf("\nUsage:\n%s <I2C bus device node >\n", progname);
}int main(int argc, char **argv) {int e;char filename[32];struct display_info disp;if (argc < 2) {show_usage(argv[0]);return -1;}memset(&disp, 0, sizeof(disp));sprintf(filename, "%s", argv[1]);disp.address = OLED_I2C_ADDR;disp.font = font2;e = oled_open(&disp, filename);if (e < 0) {show_error(1, e);} else {e = oled_init(&disp);if (e < 0) {show_error(2, e);} else {printf("---------start--------\n");if (oled_demo(&disp) < 0)show_error(3, 777);printf("----------end---------\n");}}return 0;
}-- VISUAL --                                                                              100       100,2         Bot

四、Source insight 初步分析wiringP源码OLED_DEMO

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

访问前要先开打设备驱动

在这里插入图片描述
在这里插入图片描述

# 五、设备的映射

mmap 可以用于映射设备文件,这是一种与文件映射相似的操作,但不是映射文件的内容,而是映射设备的内存地址范围。这使得你可以在用户空间直接访问设备的内存,而无需通过标准的读写操作进行通信。

设备映射通常用于以下场景:

  1. 直接内存访问(DMA)设备:一些硬件设备(如图形卡、网络适配器)允许通过DMA将数据传输到设备的内存。mmap 可用于映射这些设备内存,以便应用程序可以直接读写设备内存,而不必通过内核交互。

  2. 共享内存:设备映射允许多个进程或线程在用户空间共享设备内存。这对于高性能计算、数据传输和共享大量数据的应用程序非常有用。

  3. 加速硬件:一些硬件设备,如GPU,可以通过 mmap 实现与应用程序的高性能通信,以加速计算和数据处理。

以下是一个示例,演示如何使用 mmap 映射设备文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>int main() {int fd = open("/dev/my_device", O_RDWR); // 打开设备文件,这里示意性地使用了"/dev/my_device"if (fd == -1) {perror("open");return 1;}size_t length = 4096; // 映射的长度,根据设备的需求设置void *map = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (map == MAP_FAILED) {perror("mmap");return 1;}// 使用指针 map 来访问设备内存// ...close(fd); // 关闭设备文件munmap(map, length); // 取消映射return 0;
}

在这个示例中,我们打开了一个设备文件(/dev/my_device 是一个示例设备文件路径),将设备内存映射到用户空间,然后可以使用 map 指针来访问设备内存。请注意,这个示例是简化的,实际应用中需要根据设备的特性和需求来使用 mmap
在这里插入图片描述

六、mmap函数

mmap 是一个UNIX和类UNIX操作系统上的系统调用,用于在进程的地址空间中映射文件或设备。这个系统调用通常用于实现内存映射文件和共享内存的操作。

mmap 的原型如下:

#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

参数说明:

  • addr:指定映射区域的起始地址,通常设置为 NULL,让操作系统自动选择。
  • length:指定映射的长度,以字节为单位。
  • prot:指定映射区域的保护权限,如 PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)等。
  • flags:指定映射区域的标志,如 MAP_SHARED(共享映射)、MAP_PRIVATE(私有映射)等。
  • fd:指定要映射的文件的文件描述符。如果不是映射文件,可以设置为 -1
  • offset:指定文件中的偏移,通常设置为 0

mmap 函数允许你将文件或设备的内容映射到进程的地址空间中,使得进程可以通过内存操作来访问文件的内容,而不必直接读写文件。这有助于提高访问速度和简化文件操作。

示例用法:

#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}off_t file_size = lseek(fd, 0, SEEK_END);void *map = mmap(NULL, file_size, PROT_READ, MAP_SHARED, fd, 0);if (map == MAP_FAILED) {perror("mmap");return 1;}// 现在可以通过指针 map 访问文件的内容printf("File content: %s\n", (char *)map);close(fd);munmap(map, file_size);return 0;
}

上述示例打开一个名为 “example.txt” 的文件,将其内容映射到内存中,然后通过指针 map 访问文件的内容。最后,使用 munmap 函数取消映射并关闭文件描述符。这是 mmap 的一个简单示例,它可用于更复杂的应用,如共享内存、内存映射数据库等。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、简单OLED屏幕开发及实现

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>#include "oled.h"
#include "font.h"int oled_show(struct display_info *disp)
{ int i; char buf[100];oled_putstrto(disp, 0, 9+1, "Welcome to"); disp->font = font1; oled_putstrto(disp, 0, 18+2, " ---OrangePi--- "); disp->font = font2; oled_putstrto(disp, 0, 27+3, "DALI NIANGAO"); disp->font = font3; oled_send_buffer(disp); return 0; 
}void show_error(int err, int add) 
{ printf("\nERROR: %i, %i\n\n", err, add); 
}void show_usage(char *progname) 
{ printf("\nUsage:\n%s <I2C bus device node >\n", progname); 
}int main(int argc, char **argv) 
{ int e; char filename[32]; struct display_info disp; if (argc < 2) { show_usage(argv[0]); return -1; }memset(&disp, 0, sizeof(disp)); sprintf(filename, "%s", argv[1]); disp.address = OLED_I2C_ADDR; disp.font = font2; e = oled_open(&disp, filename); e = oled_init(&disp); oled_show(&disp); return 0; 
}
vim my_oled_demo.c
./build.sh my_oled_demo.c
sudo ./a.out /dev/i2c-3

在这里插入图片描述

这篇关于【Orangepi Zero2 全志H616】驱动OLED屏应用-IIC协议、设备的映射(mmap)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚

PyTorch模型_trace实战:深入理解与应用

pytorch使用trace模型 1、使用trace生成torchscript模型2、使用trace的模型预测 1、使用trace生成torchscript模型 def save_trace(model, input, save_path):traced_script_model = torch.jit.trace(model, input)<

哺乳细胞重组表达人鼠嵌合抗体:制备与应用

重组抗体是一类具有广泛应用价值的蛋白质,在药物研发和生物医学研究中发挥着重要作用。本文将介绍重组抗体的表达方式,重点关注嵌合抗体制备和哺乳细胞重组表达人鼠嵌合抗体的技术原理和应用。 重组抗体表达的原理和方法 重组抗体表达是通过将人或动物源的免疫球蛋白基因导入表达宿主细胞,并使其表达出特异性抗体蛋白质。常用的表达系统包括细菌、哺乳细胞和真核微生物等。 嵌合抗体制备的步骤和优势 选择适当的抗原

温湿度采集及OLED显示

目录 软件I2C和硬件I2C每隔2秒钟采集一次温湿度数据,显示到OLED上,同时通过串口发送到上位机的“串口助手”软件 软件I2C和硬件I2C "I2C"代表Inter-Integrated Circuit,是一种用于在数字电路之间进行通信的串行通信协议。软件I2C和硬件I2C是两种实现这种协议的方式。 软件I2C是通过软件来模拟I2C通信协议的实现方式。在这种情况下,微控制