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

主要就是我转 嵌入式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映射到虚拟地址才能进行访问。

走到这里基本没啥坑了,相信各位的试验已经做成功了!
那我们今天的文章就先到这里了 ,后面一次更新各个部分,可能会遇到的坑。