Linux手写FrameBuffer任意引脚驱动spi屏幕

一、硬件设备

        开发板:香橙派 5Plus,cpu:RK3588,带有 40pin 外接引脚。

        屏幕:SPI 协议 0.96 寸 OLED。

二、需求

        主要是想给板子增加一个可视化的监视器,并且主页面可调。

        平时跑个模型或者服务,想查看状态和参数,要么通过 SSH 远程连接,要么开启 Docker 跑面板,但是怎么会有抬头显示来的方便呢?于是捣鼓单片机的心又开始跳动了,准备手写一套完整的驱动和应用。

        硬件 SPI 引脚刚好在风扇的出风口,为了满足强迫症,决定使用软件模拟 SPI,直接手翻引脚。考虑到后期可能会增加新的设备,于是直接将除 VCC 和 GND 以外的脚全部通过应用层传入,可以随意更改。

三、驱动

        0.96的 OLED 分辨率不高,使用字符设备来实现足矣。

1、传统的字符设备注册流程:

并在开头先完成了帧缓存的映射:

        这里我增加了缓冲区大小的自动调整,内核在分配虚拟内存区域(VMA)时,可能会出于性能或管理方便的考虑,将映射大小调整为页面大小的整数倍,在64位系统中一页是 4096 字节。 所以即使只请求了 1024 (分辨率128 * 64 / 8)字节,内核也会分配一个完整的页面(4096 字节)。

        vmalloc_user 函数注意带有 user 后缀,专门为用户空间的映射而设计的。我一开始使用不带后缀的,在内核的映射函数 remap_vmalloc_range 总是报错,不知是不是因为 vmalloc 带有调试信息等额外的元数据,导致用户空间无法映射。

2、file_operations 结构体

        在驱动中,我实现了读、写、ioctl和mmap。读时返回屏幕的硬件信息和帧大小,写时可以直接将数据字节流写入到帧缓冲,用于快速清屏。

        ioctl 函数实现了简单的接口:

可以传入引脚的编号,开启和关闭OLED,刷新帧缓存和清屏。

驱动实现的 mmap 函数:

这里设置了 vma 的权限,见注释。

重点讲一下 ioctl 接口实现的 GPIO 写时初始化:

        (1) 先进行 GPIO 检查,如果已经初始化并且还没有释放引脚,则退出。

        (2) 将 GPIO 引脚结构体复制到内核,保存到内核中的设备结构体;

        (3) 进行 GPIO 的初始化,包括向内核申请引脚,设置方向,并标记已配置:

        (4) 进行 OLED 的初始化,这里可能各不相同,建议找购买渠道询问:

        以上是驱动的大概框架,由于字符驱动本身比较基础,开源资料也非常多,所以只展示了我个人设计的地方,代码具体实现细节我会放在 github 及 gitee。

1125962926/spi-oled-driver: Framebuffer drivers implemented by char-devices that can change pins at willicon-default.png?t=O83Ahttps://github.com/1125962926/spi-oled-driverspi-oled-driver: 手写Linux FrameBuffer 0.96 寸 spi 屏幕驱动,支持从 app 传入任意引脚icon-default.png?t=O83Ahttps://gitee.com/lrf1125962926/spi-oled-driver

四、应用

        目前还在开发中,这部分根据原有的设想,内容会很多,所以会在完成后单独写一篇文章分享。

        有关 0.96寸 OLED 的 UI 界面设计,也欢迎各位小伙伴提供思路和建议,我也在寻找优秀好看的 UI,毕竟 htop 和 btop 的界面用习惯了,top那密密麻麻的一片看着难受。

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

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

相关文章

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…

React Native的现状与未来:从发展到展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

数据结构——链表(概念,类型,java实现、增删、优缺点)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

app版本控制java后端接口版本管理

java api version 版本控制 java接口版本管理 1 自定义 AppVersionHandleMapping 自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法 public class AppVersionHandleMapping extends RequestMappingHandlerMapping {Overrideprotected RequestCondit…

LRU 算法详解与 Java 的两种实现方式

LRU 算法详解与 Java 的两种实现方式 LRU 算法详解与 Java 的两种实现方式一、LRU 算法简介二、LRU 算法原理三、LRU 算法应用场景四、Java 实现 LRU 算法(一)基于 LinkedHashMap 实现(二)基于双向链表和 HashMap 实现五、总结LRU 算法详解与 Java 的两种实现方式 一、LRU…

基于 Python 的财经数据接口库:AKShare

AKShare 是基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。 安装 安装手册见…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容,MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令,你需要找到 mysql 可执行文件的路径。 在 macOS 上,mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此,完整的路径应该是&#xff1…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…

通过外部链接启动 Flutter App(详细介绍及示例)

通过外部链接启动 Flutter App(firebase_dynamic_links 和 app_links) 详细介绍 通过外部链接启动flutter App 的使用及示例 在我们的APP中,经常有点击链接启动并进入APP的需求(如果未安装跳转到应用商店)。Android通…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本,并在Windows桌面中创建与修改代码,与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法: gen_code仓库 注意,创建仓库时不要设置…

MySQL DCL 数据控制

文章目录 1.新建用户2.删除用户3.用户授权4.撤销用户权限5.查看用户权限6.修改用户密码7.权限类型参考文献 1.新建用户 连接到 MySQL 服务器后,管理员或特权用户可以使用 CREATE USER 语句创建新用户。 CREATE USER usernamehost IDENTIFIED BY password;-- 示例 …

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息,现整理如下: 功能描述:获取淘宝搜索页面的信息,提取其中的商品名称和价格 探讨:淘宝的搜索接口 翻页的处理 技术路线:requests…

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…

深度学习 Pytorch 张量的索引、分片、合并以及维度调整

张量作为有序的序列,也是具备数值索引的功能,并且基本索引方法和python原生的列表、numpy中的数组基本一致。 不同的是,pytorch中还定义了一种采用函数来进行索引的方式。 作为pytorch中的基本数据类型,张量既具备了列表、数组的基…

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法,工艺参数优化、工程设计优化!(Matlab完整源码和数据) Transformer-LSTM模型的架构:输入层:多个变量作…

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现,并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架,帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展,越来越多的卖家开始尝试使用云手机来协助他们的业务,这是因为云手机具有许多优势。那么,具体来说,跨境电商使用云手机可以做哪些事情呢? (一)实现多账号登录和管理 跨境电商…

一体机cell服务器更换内存步骤

一体机cell服务器更换内存步骤: #1、确认grdidisk状态 cellcli -e list griddisk attribute name,asmmodestatus,asmdeactivationoutcome #2、offline griddisk cellcli -e alter griddisk all inactive #3、确认全部offline后进行关机操作 shutdown -h now #4、开…

“AI开放式目标检测系统:开启智能识别新时代

嘿,朋友们!今天咱们来聊聊一个超酷炫的技术——AI开放式目标检测系统。这可不是什么高大上、遥不可及的玩意儿,它已经悄悄地走进了我们的生活,改变着我们对世界的认知和互动方式呢。 先来说说,什么是AI开放式目标检测系…

【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结

问题背景 项目架构为前后端分离的微服务架构: 前端部署在 8000 端口API 网关部署在 9000 端口后端服务包括: api-backend (9001端口)api-interface (9002端口) 初始状态: 前端已配置 HTTPS(端口 8000)后端服务未配…