欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

联博统计接口:linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)

admin2020-05-2334

这里整理几个在学习Linux DRM/KMS中用到的几个工具,modetest、kmscude、igt-gpu-tools。 简介: modetest 是由libdrm提供的测试程序,可以查询显示装备的支持状态,举行基本的显示测试,以及设置显示的模式。   kmscube 是由mesa3d提供和维护,这是一个基于 KMS/GBM/EGL/OPENGL ES2.0 测试用例。 kmscube is a little demonstration program for how to drive bare metal graphics without a compositor like X11, wayland or similar, using DRM/KMS (kernel mode setting), GBM (graphics buffer manager) and EGL for rendering content using OpenGL or OpenGL ES.   igt-gpu-tools 是一个测试DRM drivers的测试工具集 IGT GPU Tools is a collection of tools for development and testing of the DRM drivers.     测试环境和编译环境: 如未稀奇注明,所有的程序编译和测试均是在如下环境中举行的: 硬件环境:raspberry Pi 3 Model B 仍将环境:Linux alarm 5.6.13-1-ARCH #1 SMP Sat May 16 21:58:40 MDT 2020 aarch64 GNU/Linux   modetest   代码编译: libdrm的下载链接:https://dri.freedesktop.org/libdrm/libdrm-2.4.100.tar.bz2 解压代码后,进入目录执行:   # ./configure # Make -j4 编译完成后会在目录libdrm-2.4.100/tests/modetest下天生 modetest 执行文件。     modetest示例 modetest的运行需要root权限。   首先这里给出一组显示示例,下令参数如下:   ./modetest -M vc4 -D 0 -a -s 32@140:1920x1080  -P 173@140:1920x1080 -Ftiles   下令执行的console输出:     程序运行效果如下,通过HDM毗邻的显示器整屏的显示了渐变的斜条纹:   若是你运气不错,那么你能看到与我相同的显示效果,然则若是(likely())运气差了点,没关系,接下来会详细先容modetest这些参数的由来。     首先通过--help参数可以查看modetest支持的所有选项,如下:   ./modetest --help usage: /home/alarm/workspace/linux/libdrm-2.4.100/tests/modetest/.libs/lt-modetest [-acDdefMPpsCvw]     Query options:         -c    list connectors     -e    list encoders     -f    list framebuffers     -p    list CRTCs and planes (pipes)     Test options:         -P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]    set a plane     -s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>]    set a mode     -C    test hw cursor     -v    test vsynced page flipping     -w <obj_id>:<prop_name>:<value>    set property     -a     use atomic API     -F pattern1,pattern2    specify fill patterns     Generic options:         -d    drop master after mode set     -M module    use the given driver     -D device    use the given device         Default is to dump all info.   可以看到参数一共分为3类。 Query options:提供查询操作,用于枚举出connectorsencodersframebuffersCRTCs and planes,未指定参数时默认输出所有信息。 Test options:设定显示测试的参数。 Generic options: 指定打开装备节点,DRM/KMS对用户层来说是一个尺度的linux字符装备,其装备节点路径为/dev/dri/cardX/dev/dri/renderX(之所有有两个装备节点这,涉及到DRM-Master 和 client相关的内容,这里可以简朴的以为它们代表用一个装备   现在我们来看看若何实现一个这样的需求:通过HDMI毗邻的显示器输出一副分辨率为1920X1080pattern图像。 这个需求很明确,通过HDMI输出分辨率为1920X1080的图像,Linux DRM/KMS 内核中和显示组件如下图所示:   我们要做的就是找出一组connectorsencodersframebuffersCRTCs planes的一个组合,使其能完成我们的需求,步骤如下:   1. 找出与HDMI 相毗邻的connector 2在找到connectors后,要找出可与connector匹配的encoder 3. 找到connectorencoder可用的CRTC 4. CRTC设置合适plane 5. plane建立framebuffers,指定framebuffer巨细,并填充pattern图像,framebuffer是唯一有用户层建立的内核工具,其余4个工具均是在DRM driver加载时注册的。   这里所谓的“找到”,就是获取各个组件在内核中的id号,即handle值。 handle有点像文件描述符,是一个32bits的整数,某个linux DRM/KMS内核工具通过handle导出,并在接收到用户的handle后找到该内核工具   首先来找出与HDMI相关的connector,前面提到modetest具有查询功效,而参数-c  list connectors能枚举出以是的connector,查询效果如下:   sudo ./modetest -M vc4 -c Connectors: id    encoder    status        name        size (mm)    modes    encoders 32    31    connected    HDMI-A-1           550x310        39    31 modes:     name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)   1920x1080 60 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: preferred, driver ... props:     20 CRTC_ID:         flags: object         value: 140 ... 47    0    unknown    composite-1        0x0        1    46 ...   输出了两组connector的详细(原始log较长,这里只截取要害部门),从log中的要害字可知,id=32connector是与HDMI相毗邻的,而该connector是与id=31encoder相连的,而且通过后面的props列表可以当前毗邻的CRTC_ID=140. modes列表这列出了connector支持的所有参数设置,即:   CRCT(ID=140) --> ENCODER(ID=31) --> CONNECTED(ID=32) --> HDMI 让我们来回首一下之前的测试下令:   ./modetest -M vc4 -D 0 -a -s 32@140:1920x1080  -P 173@140:1920x1080 -Ftiles   对照一下modetest的参数项: -s  <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>] connector_id = 32crtc_id =140mode = 1920x1080encoderconnector通常是一一对应的,在内核中这两者一样平常也是一同注册的,并通过函数drm_connector_attach_encoder()关联在一起。 mode我们选择了  1920x1080。 以是 connector_id、crtc_id、mode就是这样来的。   列出 encoder ./modetest -M vc4 -e Encoders: id        crtc        type        possible crtcs        possible clones         31        140        TMDS        0x00000004        0x00000000 46        0          TVDAC        0x00000004        0x00000000 52        0           Virtual        0x00000002        0x00000000     接下里我们剖析-P这个参数的设定,前面已经知道connector_id=32是与crtc_id=140组合的,接下来我们需要为crtc_id=140匹配一个可用的plane id 枚举CRCTPLANE的下令如下(这里省略了许多内容,由于raspberry Pi 3vc4 driver支持3CRCT,每个CRTC又支持10plane,以是输出内容较多):   ./modetest -M vc4 -D 0 -p CRTCs: id        fb        pos        size 58        0        (0,0)        (0x0) 99        0        (0,0)        (0x0) 140        178        (0,0)        (1920x1080) 1920x1080 60 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: preferred, driver Planes: id        crtc        fb        CRTC x,y        x,y        gamma size         possible crtcs 173        0           0        0,0             0,0        0                    0x00000004   这里我选择了planes_id=173,选择的依据是possible crtcs = 0x00000004,即bit2=1,示意该plane可用于第3crcts 若何明白这里的第3个呢?前面说了CRCT都是通过id来标识的,第3个与crtc=140是关联不上的。 简朴的明白是凭据上述下令输出的CRCT信息顺序编号,好比第3crctid=140 深层次的原因是kernel中,每乐成注册乐成一个CRCT后,会把它加入到mode_config->crtc_list中,加入的同时它会获得一个index,而这个index基本上就是按CRCT注册的先后顺序来分配的了(crtc->index = config->num_crtc++)。 最后回到我们下面这个下令:   ./modetest -M vc4 -D 0 -a -s 32@140:1920x1080  -P 173@140:1920x1080 -Ftiles   -P选项的下令花样:-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>] plane_id=173, crct_id=140 <w>x<h>=1920x1080设置分辨率。 设置后我们的毗邻状态如下:   PLANE(ID=173, W=1920, H=1080)       |     \ | / CRCT(ID=140) --> ENCODER(ID=31) --> CONNECTED(ID=32) --> HDMI     buffer的建立是通过函数完成的,巨细是从plane相匹配。 framebuffer是在modetest内部门配的,会凭据设定的分辨率通过ioctl向驱动程序分配。   剩下的-a -Ftiles两项, -a use atomic API“ -F是指填充一种pattern,后面的值需要在modetest的源码里找,其他可用的值 tiles、smpte、plain、gradient。   参考链接: 1.https://www.kernel.org/doc/html/v4.10/gpu/index.html 2.https://gitlab.freedesktop.org/drm/igt-gpu-tools 3.https://gitlab.freedesktop.org/mesa/kmscube 4.https://wiki.st.com/stm32mpu/index.php?title=DRM_KMS_overview&printable=yes#How_to_use_the_framework
   ,

Allbet<

www.xinyongka369.com欢迎进入欧博平台(Allbet Gaming),欧博平台开放欧博(Allbet)开户、欧博(Allbet)代理开户、欧博(Allbet)电脑客户端、欧博(Allbet)APP下载等业务。

|

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:https://www.chen-eyes.com/post/831.html

网友评论

最新评论

  • 环球UG开户 10/19 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。很有特点呢

  • 环球UG开户 10/19 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。很有特点呢

  • UG环球APP下载 10/19 说:

    AllbetGmaing客户端下载欢迎进入AllbetGmaing客户端下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。不会这样吧

  • 环球UG客户端下载 10/19 说:

    欧博亚洲注册欢迎进入欧博亚洲注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。世界一级棒

  • Allbet电脑版下载 10/19 说:

    欧博allbet网址欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。给你我所有的赞美

  • allbet登陆网址 10/19 说:

    Allbet客户端下载欢迎进入Allbet客户端下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。千万不要断更啊

  • allbet登录官网 10/18 说:

    Us apple developer accounts for saleAppledeveloper.io is a reputed website selling apple developer account, providing us, China and worldwide developer individual accounts for sale. It's at low price and good quality. Always provides satisfying services!萌新求罩

  • 欧博官网手机版 10/17 说:

    欧博亚洲手机版下载欢迎进入欧博亚洲手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。路过打酱油,不走了