libdrm-modetest原理及图显系统验证方法
时间:2021-08-19 15:42:59
手机看文章
扫描二维码
随时随地手机看文章
[导读]关注、星标嵌入式云IOT技术圈,精彩及时送达来源 | Linux与SoClinux平台普遍采用的DRM软件架构中,不仅包含了内核空间驱动层的代码,而且提供应用层的支撑库libdrm。libdrm基于DRI协议通过ioctl与2D图显驱动进行交互,配置图显处理器以及HDMI、MI...
关注、星标嵌入式云IOT技术圈,精彩及时送达
来源 | Linux与SoC
linux平台普遍采用的DRM软件架构中,不仅包含了内核空间驱动层的代码,而且提供应用层的支撑库libdrm。libdrm基于DRI协议通过ioctl与2D图显驱动进行交互,配置图显处理器以及HDMI、MIPI、LVDS等编解码单元。from rockchip验证SoC的图显处理器及其他编解码模块时,可以基于libdrm modetest所提供的功能来丰富我们的verify条目。如单帧、多帧、旋转、缩放、裁剪等等。
modetest功能及流程
1
解析命令行参数
通过库函数getopt()处理modetest的命令行参数(图片可放大查看)。
支持的命令行参数主要包括三类:
1) 查询类2) 测试类3) 通用选项与解析命令函参数有关的三个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设备
打开DRM设备的流程如下:
modetest只能打开static const char * const modules[]内定义的DRM驱动,默认支持的DRM驱动包括:
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};
当我们自己的图显驱动需要使用modetest进行验证的时候,需要在这里增加驱动名字。DRM驱动的名字定义在kernel driver的drm_driver数据结构中。 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};
在打开设备的过程中,若通过-M参数指定了DRM驱动名,那么打开特定驱动;若未指定DRM驱动名,那么遍历modules[]中指定的DRM驱动。另外,若没有指定-D参数(没有指定设备名),默认按照DRM驱动名打开DRM设备。这里面的-D参数是/dev/drixxx编号。例如-D 0,指定打开0号DRM设备。若指定了-D参数,那么首先按照-D指定设备编号来打开DRM设备。获取设备资源
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(