RK3399探索之旅 / Display子系统 / 从modetest 到 DRM driver
码农天地 -https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/5023832058...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
https://xueqiu.com/3545333697...
modetest 是由 libdrm 提供的测试程序,可以查询显示设备的特性,进行基本的显示测试,以及设置显示的模式。
我们可以借助该工具来学习 Linux DRM 应用编程,另外为了深入分析 Rockchip DRM driver,有必要先了解一下这个工具的使用方法和内部实现。
本文目录:
1. 一、准备工作
3. 二、modetest 使用示例
4. 1. 查看帮助信息
5. 2. 查看组件的信息
6. 3. 在 HDMI 上显示
7. 4. 在 eDP 上显示
9. 三、编写最简单的 DRM 应用
11. 四、DRM 应用如何呼叫到 Rockchip DRM driver?
13. 五、相关参考
一、准备工作在 NanoPC T4 + Linux-4.4 上:
接好 eDP 屏以及 HDMI 显示器;退出所有占用 /dev/dri/card0 的程序;编译 modetest
1. $ git clone https://gitlab.freedesktop.org/mesa/drm
2. $ apt-get install meson
3. $ meson builddir/
4. $ ninja -C builddir/ install
二、modetest 使用示例查看帮助信息
1. $ modetest -h
2. usage: modetest [-acDdefMPpsCvrw]
4. Query options:
6. -c list connectors
7. -e list encoders
8. -f list framebuffers
9. -p list CRTCs and planes (pipes)
11. Test options:
12. ...
13. Generic options:
15. -d drop master after mode set
16. -M module use the given driver
17. -D device use the given device
19. Default is to dump all info.
查看组件的信息
1. $ modetest -M rockchip
2. Encoders:
3. id crtc type possible crtcs possible clones
4. 76 54 TMDS 0x00000001 0x00000000
5. 78 0 TMDS 0x00000003 0x00000000
6. 80 65 TMDS 0x00000002 0x00000000
8. Connectors:
9. ...
参数说明:
-M
:用于指定访问 rockchip DRM driver关键内容:
Encoders / Connectors / CRTCs / Planes 的 id,modetest 通过 id 来用于引用这些组件。Connectors 的 modes/props:prop: 任何你想设置的参数,都可以做成 property,是 DRM 驱动中最灵活、最方便的 Mode setting 机制;modes: 显示模式,mode 里包含分辨率/刷新率等显示相关的信息;CRTCs 的 props;Planes 的 formats/props;各组件的 id:
1. $ modetest -M rockchip | cut -f1 | grep -E ^[0-9A-Z]|id
3. Encoders:
4. id
5. 90, edp encoder
6. 92, hdmi encoder
7. 100, dp encoder
8. Connectors:
9. id
10. 91, edp connector
11. 93, hdmi connector
12. 101, dp connector
13. CRTCs:
14. id
15. 64, vop crtc
16. 83, vop crtc
17. Planes:
18. id
19. 58
20. 61
21. 65
22. 68
23. 80
24. 84
25. Frame buffers:
26. id
在 HDMI 上显示
1. $ modetest -M rockchip -s 93@64:1920x1080
2. $ modetest -M rockchip -s 93@64:#1 // 相同的效果
参数说明:
-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>]
:用于在指定的 pipeline 上以某个 mode 显示某个 pattern 的画面。93
:HDMI connector id64
:某个 VOP 的 crtc id1920x1080
:显示 mode;HDMI connector 下其他可选的 mode:
1. #0 1920x1080 60.00
2. #1 1920x1080 59.94
3. #2 1920x1080i 30.00
4. #3 1920x1080i 29.97
5. ...
6. #24 640x480 60.00
7. #25 640x480 59.94
8. #26 720x400 70.08
显示效果:
点击查看大图
在 eDP 上显示$ modetest -M rockchip -s 91@83:1920x1080
参数说明:
91
:eDP connector id83
:另外一个 VOP 的 crtc id1920x1080
:显示 mode;显示效果:
点击查看大图
三、编写最简单的 DRM 应用主程序:
1. int main(int argc, char **argv)
2. {
3. int fd;
4. drmModeConnector *conn;
5. drmModeRes *res;
6. uint32_t conn_id;
7. uint32_t crtc_id;
9. // 1. 打开设备
10. fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
12. // 2. 获得 crtc 和 connector 的 id
13. res = drmModeGetResources(fd);
14. crtc_id = res->crtcs[0];
15. conn_id = res->connectors[0];
17. // 3. 获得 connector
18. conn = drmModeGetConnector(fd, conn_id);
19. buf.width = conn->modes[0].hdisplay;
20. buf.height = conn->modes[0].vdisplay;
22. // 4. 创建 framebuffer
23. modeset_create_fb(fd, &buf);
25. // 5. Sets a CRTC configuration,这之后就会开始在 crtc0 + connector0 pipeline 上进行以 mode0 输出显示
26. drmModeSetCrtc(fd, crtc_id, buf.fb_id, 0, 0, &conn_id, 1, &conn->modes[0]);
28. getchar();
30. // 6. cleanup
31. ...
33. return 0;
34. }
modeset_create_fb():
该函数用于分配 framebuffer,目前不需要太关心,大致就是 3 个步骤:
Allocating memory;Preparing a mapping;Mapping memory;运行效果:
程序运行后,eDP 屏显示全屏白色,等待用户输入按键;当用户按下任意按键后,程序退出,显示黑屏。
四、DRM 应用如何呼叫到 Rockchip DRM driver?drmModeSetCrtc() 到 CRTC driver:
点击查看大图
每一个 DRM CRTC Driver(例如 Rockchip VOP driver) 里都会定义一个 struct drm_crtc_funcs 结构体,其中的 .set_config 都指向 drm_atomic_helper_set_config(),接下来就是 DRM core 开始工作了。
五、相关参考《RK3399 探索之旅 / Display 子系统 / 基础概念》小龙兄的博客:https://blog.csdn.net/hexiaol...nvidia 的文档:https://docs.nvidia.com/drive...Linux man 手册:man 7 drm思考技术,也思考人生要学习技术,更要学习如何生活。
你和我各有一个苹果,如果我们交换苹果的话,我们还是只有一个苹果。但当你和我各有一个想法,我们交换想法的话,我们就都有两个想法了。
对 嵌入式系统 (Linux、RTOS、OpenWrt、Android) 和 开源软件 感兴趣,关注公众号:嵌入式Hacker。
觉得文章对你有价值,不妨点个 在看和赞。