libdrm-modetest原理及圖顯系統(tǒng)驗證方法
時間:2021-08-19 15:42:59
手機看文章
掃描二維碼
隨時隨地手機看文章
[導(dǎo)讀]關(guān)注、星標(biāo)嵌入式云IOT技術(shù)圈,精彩及時送達(dá)來源?|??Linux與SoClinux平臺普遍采用的DRM軟件架構(gòu)中,不僅包含了內(nèi)核空間驅(qū)動層的代碼,而且提供應(yīng)用層的支撐庫libdrm。libdrm基于DRI協(xié)議通過ioctl與2D圖顯驅(qū)動進行交互,配置圖顯處理器以及HDMI、MI...
關(guān)注、星標(biāo)嵌入式云IOT技術(shù)圈,精彩及時送達(dá)
來源?|??Linux與SoC
linux平臺普遍采用的DRM軟件架構(gòu)中,不僅包含了內(nèi)核空間驅(qū)動層的代碼,而且提供應(yīng)用層的支撐庫libdrm。libdrm基于DRI協(xié)議通過ioctl與2D圖顯驅(qū)動進行交互,配置圖顯處理器以及HDMI、MIPI、LVDS等編解碼單元。from rockchip驗證SoC的圖顯處理器及其他編解碼模塊時,可以基于libdrm modetest所提供的功能來豐富我們的verify條目。如單幀、多幀、旋轉(zhuǎn)、縮放、裁剪等等。
modetest功能及流程
1
解析命令行參數(shù)
通過庫函數(shù)getopt()處理modetest的命令行參數(shù)(圖片可放大查看)。
支持的命令行參數(shù)主要包括三類:
1) 查詢類2) 測試類3) 通用選項與解析命令函參數(shù)有關(guān)的三個API:
1static?int?parse_connector(struct?pipe_arg?*pipe,?const?char?*arg)
2static?int?parse_plane(struct?plane_arg?*plane,?const?char?*p)
3static?int?parse_property(struct?property_arg?*p,?const?char?*arg)
4static?void?parse_fill_patterns(char?*arg)
打開DRM設(shè)備
打開DRM設(shè)備的流程如下:
modetest只能打開static const char * const modules[]內(nèi)定義的DRM驅(qū)動,默認(rèn)支持的DRM驅(qū)動包括:
1static?const?char?*?const?modules[]?=?{
2????"i915",
3????"amdgpu",
4????"radeon",
5????"nouveau",
6????"vmwgfx",
7????"omapdrm",
8????"exynos",
9????"tilcdc",
10????"msm",
11????"sti",
12????"tegra",
13????"imx-drm",
14????"rockchip",
15????"atmel-hlcdc",
16????"fsl-dcu-drm",
17????"vc4",
18????"virtio_gpu",
19????"mediatek",
20????"meson",
21????"pl111",
22????"stm",
23????"sun4i-drm",
24????"armada-drm",
25};
當(dāng)我們自己的圖顯驅(qū)動需要使用modetest進行驗證的時候,需要在這里增加驅(qū)動名字。DRM驅(qū)動的名字定義在kernel driver的drm_driver數(shù)據(jù)結(jié)構(gòu)中。 1struct?drm_driver?{
2...
3????/**?@major:?driver?major?number?*/
4????int?major;
5????/**?@minor:?driver?minor?number?*/
6????int?minor;
7????/**?@patchlevel:?driver?patch?level?*/
8????int?patchlevel;
9????/**?@name:?driver?name?*/
10????char?*name;
11????/**?@desc:?driver?description?*/
12????char?*desc;
13????/**?@date:?driver?date?*/
14????char?*date;
15...
16};
在打開設(shè)備的過程中,若通過-M參數(shù)指定了DRM驅(qū)動名,那么打開特定驅(qū)動;若未指定DRM驅(qū)動名,那么遍歷modules[]中指定的DRM驅(qū)動。另外,若沒有指定-D參數(shù)(沒有指定設(shè)備名),默認(rèn)按照DRM驅(qū)動名打開DRM設(shè)備。這里面的-D參數(shù)是/dev/drixxx編號。例如-D 0,指定打開0號DRM設(shè)備。若指定了-D參數(shù),那么首先按照-D指定設(shè)備編號來打開DRM設(shè)備。獲取設(shè)備資源
1static?struct?resources?*get_resources(struct?device?*dev)
2{
3…
4????drmModeGetCrtc();
5????drmModeGetEncoder();
6????drmModeGetConnector?();
7????drmModeGetFB();
8????drmModeGetPlane();
9…
10????drmModeObjectGetProperties(,,CRTC);
11drmModeObjectGetProperties(,,CONNECTOR);
12…
13}
14
15dump_resource(