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

server/2025/1/21 7:13:56/

一、硬件设备

        开发板:香橙派 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.ppmy.cn/server/160111.html

相关文章

使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比

“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址:https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题,限制了深度学习在…

源码编译http

1.下载源码包上传到linux中 2.编译源码包安装apache软件 安装软件:yum install gcc gcc-c make -y 解压:tar xf httpd-2.4.62.tar.bz2 -C /usr/local/src/ 指定组和用户:groupadd -r -g 48 apache useradd -r -u 48 -g 48 -c "Apache …

基于Ubuntu22.04安装SVN服务器

基于Ubuntu22.04安装SVN服务器 1.安装SVN服务器2.修改SVN服务器版本库目录3.调整SVN配置4.重启SVN服务5.安装TortoiseSVN 1.安装SVN服务器 确认uubuntu是否已经安装了SVN命令,如果没安装,使用对应的命令进行安装 svn //查看命令是否存在 s…

element-ui textarea备注 textarea 多行输入框

发现用这个组件,为了给用户更好的体验,要加下属性 1. 通过设置 autosize 属性可以使得文本域的高度能够根据文本内容自动进行调整,并且 autosize 还可以设定为一个对象,指定最小行数和最大行数。:autosize"{ minRows: 3, ma…

Pandas 数据分析(二)【股票数据】

股票数据分析 写在前面题目背景021 加载股票数据到CSV文件022 查看基本信息和数据统计023 更改索引列为普通数据列024 给数据添加月份和年份025 计算每年的平均收盘价026 找到收盘价最低的数据行027 筛选出部分数据列028 设置日期列为索引列029 删除不需要的数据列030 对数据列…

如何使用 JSONP 实现跨域请求?

以下是使用 JSONP 实现跨域请求的步骤&#xff1a; 实现步骤&#xff1a; 1. 客户端设置 在客户端&#xff0c;你需要创建一个 <script> 标签&#xff0c;并将其 src 属性设置为跨域请求的 URL&#xff0c;并添加一个 callback 参数。这个 callback 参数将包含一个函数…

STM32补充——FLASH

目录 1.内部FLASH构成&#xff08;F1&#xff09; 2.FLASH读写过程&#xff08;F1&#xff09; 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器&#xff08;写入 & 擦除相关&#xff09; 3.FLASH相关HAL库函数简介&#xff08;F1/F4/F7/H7&#xff09; 4.编程实战 …

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…