嵌入式项目:韦东山驱动开发第六篇 项目总结——显示系统(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映射到虚拟地址才能进行访问。

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

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

相关推荐
柳鲲鹏2 小时前
RGB转换为NV12,查表式算法
linux·c语言·算法
mit6.8242 小时前
[HDiffPatch] 补丁算法 | `patch_decompress_with_cache` | `getStreamClip` | RLE游程编码
c++·算法
杨筱毅2 小时前
【穿越Effective C++】条款13:以对象管理资源——RAII原则的基石
开发语言·c++·effective c++
煤球王子3 小时前
学而时习之:C++中的引用
c++
L_09073 小时前
【Algorithm】Day-11
c++·算法·leetcode
薛慕昭4 小时前
C语言核心技术深度解析:从内存管理到算法实现
c语言·开发语言·算法
DeeplyMind4 小时前
第10章:中断处理-6:Implementing a Handler
linux·驱动开发
近津薪荼4 小时前
每日一练 1(双指针)(单调性)
c++·算法
qq_479875434 小时前
C++ ODR
java·开发语言·c++