嵌入式项目:韦东山驱动开发第六篇 项目总结——显示系统(framebuffer编程)

各位好久不见了!!! 之前那个项目更新了三篇帖子就断更了...... 实在是抱歉

主要就是我转 嵌入式Linux驱动开发方向了!!!!!

研究生阶段嘛,人在江湖身不由己,导有一个RK3588的项目需求,我成了负责人,就转方向到嵌入式了...... ,学习的过程中觉得这个方向,还可以个人觉得,是有行业壁垒的,有些东西是需要时间去沉淀的,中年危机没有软件开发那么大,再者就是机器人未来肯定会火,就像汽车一样,所以all in了这个方向, 不知道明年秋招结果怎么样,反正就是加油吧。

不过你要是现在研一,大三,你问我走什么方向,去java、java、java 至少坑位多!!!

好了回归正题吧:跟着韦老师做了他这个应用开发的项目,在这里总结一些,我在做的过程中遇到的问题吧,会发几篇帖子,供大家参考,我使用的开发板就是 正点原子的RK3588

项目源码:https://gitee.com/Mu798/project/tree/master/%E7%94%B5%E5%AD%90%E4%BA%A7%E5%93%81%E9%87%8F%E4%BA%A7%E5%B7%A5%E5%85%B7

今天就针对显示系统部分总结一下吧:

具体软件架构我就不说了,韦老师课上已经讲的很清楚了,我这里讲一下遇到坑吧

这一部分主要就是framebuffer编程嘛。

对应用的mipi屏幕就是买开发板对应送的这个

首先针对:正点原子RK3588这一开发板 你要成功实验framebuffer编程,必须做以下部分工作:

(1)关闭开机动画Logcat

直接修改设备树里面的文件就行 (做到第六期的贴贴 五期的驱动应该是学完了哈 基本的设备树编译 烧写 应该是没啥坑点的 照着做就行)

因为我的开发板上只连接了这个mipi屏幕 在DSI0 这个上面插这的

在内核目录里面找到这个设备树文件,因为我这个烧录的buildroot系统

然后把status设置一下就行 如果连接的有HDMI 就去找 &route_hdmi0或者1 这个节点 去给他disabled就行了 然后编译烧录进内核 开机动画就关了

(2)关闭Weston 桌面:

开发板:进入目录:/etc/init.d 关闭这两个文件的 可执行 权限

关闭 Qt / Weston 桌面: 这个命令 /etc/init.d/S50systemui stop 是关闭Qt显示桌面

但要让系统开机不再自动启动 Qt/Weston,还需要再做一步:

chmod -x /etc/init.d/S49weston

如果你有 Qt 启动脚本(比如 /etc/init.d/S50systemui),

也可以顺便禁止它开机启动:

chmod -x /etc/init.d/S50systemui

做完上面这两步,断电重启一下开发板,你的屏幕就是黑的了。致辞所有的准备工作完成了!!!

(3)framebuffer编程

这部分内容没啥坑,在我做的过程中都很顺利,主要问题就是开始遇到程序代码运行之后,屏幕不显示的问题,上面两步做完, 就没啥问题了。

下面就简单介绍一下 代码思想吧:

主要就是 open 和 ioctl这两函数, 应为LInux下一切皆文件嘛 , 所以屏幕这个设备注册进去,也是一个文件去打开就行,用ioctl函数获取参数后,var这个结构里面就是屏幕相关的参数了。

复制代码
struct fb_bitfield {
    __u32 offset;     // 起始位偏移
    __u32 length;     // 位宽
    __u32 msb_right;  // 位序:1 表示MSB在右(极少见)
};

struct fb_var_screeninfo {
    __u32 xres;           // 可见分辨率:水平像素
    __u32 yres;           // 可见分辨率:垂直像素
    __u32 xres_virtual;   // 虚拟分辨率:水平像素(用于panning/双缓冲)
    __u32 yres_virtual;   // 虚拟分辨率:垂直像素
    __u32 xoffset;        // 可见区域相对虚拟缓冲的X偏移
    __u32 yoffset;        // 可见区域相对虚拟缓冲的Y偏移

    __u32 bits_per_pixel; // 每像素位数(如 16/24/32)
    __u32 grayscale;      // 灰度/颜色空间标志(0=彩色,1=灰度等)

    struct fb_bitfield red;    // 红色分量的位域描述
    struct fb_bitfield green;  // 绿色分量的位域描述
    struct fb_bitfield blue;   // 蓝色分量的位域描述
    struct fb_bitfield transp; // 透明度(alpha)位域描述

    __u32 nonstd;         // 非标准像素格式标志(一般为0)
    __u32 activate;       // 何时生效(如 FB_ACTIVATE_NOW 等)

    __u32 height;         // 物理高度(毫米,未知可为0)
    __u32 width;          // 物理宽度(毫米,未知可为0)

    __u32 accel_flags;    // 加速相关标志(已较少使用)

    // 时序参数(单位见注释)
    __u32 pixclock;       // 像素时钟周期(皮秒,ps)
    __u32 left_margin;    // 行同步前肩(像素)
    __u32 right_margin;   // 行同步后肩(像素)
    __u32 upper_margin;   // 场同步前肩(像素/行)
    __u32 lower_margin;   // 场同步后肩(像素/行)
    __u32 hsync_len;      // 行同步脉宽(像素)
    __u32 vsync_len;      // 场同步脉宽(行)

    __u32 sync;           // 同步极性/方式标志(如 FB_SYNC_HOR_HIGH_ACT 等)
    __u32 vmode;          // 扫描方式(如 FB_VMODE_NONINTERLACED/INTERLACED/DOUBLE 等)
    __u32 rotate;         // 旋转角度(0/90/180/270,依实现)
    __u32 colorspace;     // 颜色空间(如 sRGB 等,通常为0)

    __u32 reserved[4];    // 预留
};

然后后面就是,这个屏幕是属于硬件的,物理地址是不能直接访问的,得用mmap映射到虚拟地址才能进行访问。

走到这里基本没啥坑了,相信各位的试验已经做成功了!

那我们今天的文章就先到这里了 ,后面一次更新各个部分,可能会遇到的坑。

相关推荐
孙鹏宇.16 小时前
C++类型转换
c++
超级架构师17 小时前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
·present·17 小时前
CSAPP(lecture 10)
c语言·c++
YLCHUP17 小时前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
xiaolang_8616_wjl17 小时前
c++游戏_宝可梦大世界(源代码)
开发语言·c++·游戏
余额瞒着我当琳17 小时前
C++异常,异常的概念,异常抛出与捕获,RAII 和智能指针的设计思路,C++标准库一些指针的使用
java·开发语言·c++·算法
東隅已逝,桑榆非晚17 小时前
map和set的使用
数据结构·c++·笔记·学习
硅基手札18 小时前
CAN 技术系列 04 · CAN 帧格式
驱动开发·嵌入式开发·通信协议·can总线
骑着蜗牛撵大象32718 小时前
大模型 SDK 编译就崩?用 CMakeLists 把 httplib、JSON 与 OpenSSL 装配成可复用的 ChatServer
android·java·c++·http·json·cmake·大模型sdk
邪修king18 小时前
Re:Linux系统篇(三十八):进程间通信ChapterSystem V 信号量深度解析|同步互斥、内核源码、C 指针多态、实战代码
java·linux·c语言