范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

对于Display框架,我需要了解KMSapi吗?Linux驱动

  缘由
  什么是 KMS ?
  要了解 KMS,首先要了解 DRM。
  DRM 是 Direct Rendering Manager 的缩写,最初只是用来支持 GPU 的,最初它负责:Initialize GPU card, load its firmware, etc. Share the GPU command queue between multiple applications Manage the memory (allocation, access)
  那时候,Mode-Setting (包括更新画面、配置 display pipeline、screen resolution、color depth、refresh rate等) 是在 Userspace 中实现的,这样做的缺点是:Rendering 和 Mode-Setting 会发生竞争; 不统一,缺少抽象,不同的硬件平台各自为营;
  后来就引入了 Kernel Mode-Setting (KMS),其实就是将 Mode-Setting 的活移回到内核,DRM driver 即负责访问 GPU 也负责访问 Display Engine,且将 KMS 作为 DRM API 的一部分,如下图:
  目前我们关注最左边的路径就好,不用太关注 GEM、PRIME 等概念。
  图形应用是如何进行显示的?
  通常,一个普通的图形应用并不会直接通过 KMS 和内核进行交互,而是先和 display server (例如给予 X11 的 Xorg, 或者基于 Wayland 的 Weston,也称 display compositor) 进行交互:将显示的图像提交给 display server, 再由 display server 负责将多个 client 图形应用的图像合成成一张图像,并将这张图像通过 KMS 的接口提交给内核。
  简而言之,就是 2 个步骤:
  step1: 合成
  step2: 提交给内核
  何时要用 KMS ?
  对于普通的图形应用,一般是不会直接去使用 KMS 的。
  只有一些需要 low level control 的应用需要使用 KMS,例如:Display servers; Media players,例如 Kodi,它们有自己的 KMS backend,不需要额外的 display server; 游戏相关的应用,例如 RetroArch,为了支持更多的平台,它们会做到不依赖 display server; VR、XR,它们对性能要求很严格,所以会亲自访问 KMS 以达到最小的延迟;
  既然很少直接使用 KMS,为什么还要学习它 ?DRM Driver 的驱动开发人员有必要了解 KMS api,这样才能理解 DRM Driver 的设计目的,从而编写出正确的驱动程序; 理解原理,可以协助我们定位图形应用不稳定或者性能相关的问题,尤其是嵌入式 Linux 领域,显示相关的功能复杂且容易出现异常; 如果你想要为开源软件 Wayland 或者 Kodi 做贡献的话,则需要了解 KMS api; 如果你的应用对性能和延迟性要求很高的话,也需要了解 KMS api。
  如何编写 KMS Demo?
  要编写 KMS 程序,首先要了解 KMS 的模型。
  KMS 将硬件模块抽象成下面几个对象类型:Planes:图层,例如在 rockchip 平台里对应 SOC 内部 VOP 模块的 win 图层; CRTC:显示控制器,例如在 rockchip 平台里对应 SOC 内部的 VOP 模块; Encoder:输出转换器,指 RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口; Connector:连接器,指 encoder 和 panel 之间交互的接口部分; Bridge:桥接设备,一般用于注册 encoder 后面另外再接的转换芯片,如 DSI2HDMI 转换芯片; Panel:泛指屏,各种 LCD、HDMI 等显示设备的抽象;
  应用通过 KMS api 将这些对象连接成一条 display pipeline,最终将图像显示在屏幕上:
  点击查看大图 KMS 有两套 api: legacy api (已过时) 和 atomic api:
  legacy api 虽说已经过时了,但是它其实是很适合 KMS api 初学者的,因为它仍然是基于 plane、crct、encoder、connector 这些核心概念的。atomic api 只是在 legacy api 基础上进行一些改进,待会会细说。
  KMS legacy api 最简单示例:int main(int argc, char **argv) {  int fd;  drmModeConnector *conn;  drmModeRes *res;  uint32_t conn_id;  uint32_t crtc_id;   /* open the drm device */  fd = open("/dev/dri/card0");   /* get crtc/encoder/connector id */  res = drmModeGetResources(fd);  crtc_id = res->crtcs[0];  conn_id = res->connectors[0];   /* get connector for display mode */  conn = drmModeGetConnector(fd, conn_id);   /* create a dumb-buffer */  drmIoctl(DRM_IOCTL_MODE_CREATE_DUMB);   /* bind the dumb-buffer to an FB object */  drmModeAddFB(...);   /* map the dumb buffer for userspace drawing */  drmIoctl(DRM_IOCTL_MODE_MAP_DUMB);  mmap(...);   /* start display */  drmModeSetCrtc(crtc_id, fb_id, connector_id, mode); }
  大致的思路是:通过 drmModeGetResources() 获取到 crtc、connector 等对象的 id,然后通过 id 获取到具体的 object; 通过 ioctl(DRM_IOCTL_MODE_CREATE_DUMB) 和 drmModeAddFB() 创建 DRM framebuffer object,并获得 fb id; 通过 ioctl(DRM_IOCTL_MODE_MAP_DUMB) 和 mmap() 将 framebuffer 映射到用户空间,应用将自己要显示的内容写到 framebuffer 中; 将 crtc、connector、fb 的id 通过 drmModeSetCrtc() 告诉 DRM driver,让内核帮我们配置好 display pipeline,从而将 framebuffer 里的内容显示出来;
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取:加微信领取资料
  关于 KMS atomic api:
  atomic 的核心思想是将各种设置都保存在一个个的 property 里,最后将所有 property 一次性提交给内核,对于本次 commit 操作,要么成功,要么保持原来的状态完全不变。atomic 的好处在于可以避免操作到一半时中途失败后难以回滚的问题,同时也能避免设置期间屏幕闪烁的问题。
  non atomic
  atomic
  下面的代码同样也是将 crtc、connector 等对象连成一条 display pipeline,只不过这次用的是 atomic api。req = drmModeAtomicAlloc(); drmModeAtomicAddProperty(req, crtc_id, property_active, 1); drmModeAtomicAddProperty(req, crtc_id, property_mode_id, blob_id); drmModeAtomicAddProperty(req, conn_id, property_crtc_id, crtc_id); drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); drmModeAtomicFree(req);
  代码虽然增多了,但是能得到更好的用户体验。
  更多内容:
  KMS 功能比较多,api 也比较多,需要一系列的文章才能描述清楚,网上已经有一个比较好的教程,我就不再详细描述了。
  请参考何小龙的 blog:
  https://blog.csdn.net/hexiaolong2009/article/details/83720940
  相关文章列表:最简单的DRM应用程序 (single-buffer) 最简单的DRM应用程序 (double-buffer) 最简单的DRM应用程序 (page-flip) 最简单的DRM应用程序 (plane-test) DRM应用程序进阶 (Property) DRM应用程序进阶 (atomic-crtc) DRM应用程序进阶 (atomic-plane) 其他适合学习 KMS 的开源软件1. drminfo
  https://github.com/ascent12/drm_info
  drminfo 是一个命令行工具,它可以将系统里 DRM 设备的所有信息都 dump 出来,很适合用于调试。
  编译:$ apt-get install meson ninja-build  $ git clone https://github.com/ascent12/drm_info drm_info  $ cd drm_info  $ meson build/ $ ninja -C build install
  用法:# ./drm_info Node: /dev/dri/card0 ├───Driver: rockchip (RockChip Soc DRM) version 2.0.0 (20140818) │   ├───DRM_CLIENT_CAP_STEREO_3D supported │   ├───DRM_CLIENT_CAP_UNIVERSAL_PLANES supported │   ├───DRM_CLIENT_CAP_ATOMIC supported │   ├───DRM_CLIENT_CAP_ASPECT_RATIO supported │   ├───DRM_CLIENT_CAP_WRITEBACK_CONNECTORS supported │   ├───DRM_CAP_DUMB_BUFFER = 1 │   ├───DRM_CAP_VBLANK_HIGH_CRTC = 1 │   ├───DRM_CAP_DUMB_PREFERRED_DEPTH = 0 │   ├───DRM_CAP_DUMB_PREFER_SHADOW = 0 │   ├───DRM_CAP_PRIME = 3 │   ├───DRM_CAP_TIMESTAMP_MONOTONIC = 1 │   ├───DRM_CAP_ASYNC_PAGE_FLIP = 1 │   ├───DRM_CAP_CURSOR_WIDTH = 64 │   ├───DRM_CAP_CURSOR_HEIGHT = 64 │   ├───DRM_CAP_ADDFB2_MODIFIERS = 1 │   ├───DRM_CAP_PAGE_FLIP_TARGET = 0 │   ├───DRM_CAP_CRTC_IN_VBLANK_EVENT = 1 │   ├───DRM_CAP_SYNCOBJ = 0 │   └───DRM_CAP_SYNCOBJ_TIMELINE not supported ├───Device: platform rockchip,display-subsystem │   └───Available nodes: primary, render ├───Framebuffer size │   ├───Width: [0, 8192] │   └───Height: [0, 8192] ├───Connectors │   ├───Connector 0 │   │   ├───Object ID: 77 │   │   ├───Type: eDP │   │   ├───Status: connected │   │   ├───Physical size: 256x144 mm │   │   ├───Subpixel: unknown │   │   ├───Encoders: {0} │   │   ├───Modes │   │   │   └───1920x1080@60.00 nhsync nvsync  │   │   └───Properties │   │       ├───"EDID" (immutable): blob = 0 │   │       ├───"DPMS": enum {On, Standby, Suspend, Off} = On │   │       ├───"link-status": enum {Good, Bad} = Good │   │       ├───"non-desktop" (immutable): range [0, 1] = 0 │   │       ├───"CRTC_ID" (atomic): object CRTC = 54 │   │       ├───"brightness": range [0, 100] = 50 │   │       ├───"contrast": range [0, 100] = 50 │   │       ├───"saturation": range [0, 100] = 50 │   │       └───"hue": range [0, 100] = 50 [...] ├───Encoders │   ├───Encoder 0 │   │   ├───Object ID: 76 │   │   ├───Type: TMDS │   │   ├───CRTCS: {0} │   │   └───Clones: {} │   ├───Encoder 1 │   │   ├───Object ID: 78 │   │   ├───Type: TMDS │   │   ├───CRTCS: {0, 1} │   │   └───Clones: {} │   └───Encoder 2 │       ├───Object ID: 80 │       ├───Type: TMDS │       ├───CRTCS: {1} │       └───Clones: {} ├───CRTCs │   ├───CRTC 0 │   │   ├───Object ID: 54 │   │   ├───Mode: 1920x1080@60.00 nhsync nvsync  │   │   ├───Gamma size: 256 │   │   └───Properties │   │       ├───"ACTIVE" (atomic): range [0, 1] = 1 │   │       ├───"MODE_ID" (atomic): blob = 91 │   │       │   └───1920x1080@60.00 nhsync nvsync  │   │       ├───"OUT_FENCE_PTR" (atomic): range [0, UINT64_MAX] = 0 │   │       ├───"left margin": range [0, 100] = 100 │   │       ├───"right margin": range [0, 100] = 100 │   │       ├───"top margin": range [0, 100] = 100 │   │       ├───"bottom margin": range [0, 100] = 100 │   │       ├───"ALPHA_SCALE" (atomic): range [0, 1] = 1 │   │       └───"FEATURE" (immutable): bitmask {afbdc} = () [...] └───Planes     ├───Plane 0     │   ├───Object ID: 53     │   ├───CRTCs: {0}     │   ├───FB ID: 128     │   │   ├───Object ID: 128     │   │   ├───Size: 1920x1080     │   │   ├───Pitch: 7680 bytes     │   │   ├───Bits per pixel: 32     │   │   └───Depth: 24     │   ├───Formats:     │   │   ├───XRGB8888 (0x34325258)     │   │   ├───ARGB8888 (0x34325241)     │   │   ├───XBGR8888 (0x34324258)     │   │   ├───ABGR8888 (0x34324241)     │   │   ├───RGB888 (0x34324752)     │   │   ├───BGR888 (0x34324742)     │   │   ├───RGB565 (0x36314752)     │   │   └───BGR565 (0x36314742)     │   └───Properties     │       ├───"type" (immutable): enum {Overlay, Primary, Cursor} = Primary     │       ├───"FB_ID" (atomic): object framebuffer = 128     │       │   ├───Object ID: 128     │       │   ├───Size: 1920x1080     │       │   ├───Pitch: 7680 bytes     │       │   ├───Bits per pixel: 32     │       │   └───Depth: 24     │       ├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1     │       ├───"CRTC_ID" (atomic): object CRTC = 54     │       ├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0     │       ├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0     │       ├───"CRTC_W" (atomic): range [0, INT32_MAX] = 1920     │       ├───"CRTC_H" (atomic): range [0, INT32_MAX] = 1080     │       ├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0     │       ├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0     │       ├───"SRC_W" (atomic): range [0, UINT32_MAX] = 1920     │       ├───"SRC_H" (atomic): range [0, UINT32_MAX] = 1080     │       ├───"ZPOS" (atomic): range [0, 3] = 0     │       ├───"FEATURE" (immutable): bitmask {scale, alpha, hdr2sdr, sdr2hdr, afbdc} = (alpha | afbdc)     │       ├───"EOTF" (atomic): range [0, 5] = 0     │       ├───"COLOR_SPACE" (atomic): range [0, 12] = 0     │       ├───"GLOBAL_ALPHA" (atomic): range [0, UINT8_MAX] = 255     │       ├───"BLEND_MODE" (atomic): range [0, 1] = 0     │       ├───"ASYNC_COMMIT" (atomic): range [0, 1] = 0     │       └───"SHARE_ID" (atomic): range [0, UINT32_MAX] = 53     [...] 2、libdrm 自带的测试程序:modetest
  https://gitlab.freedesktop.org/mesa/drm
  modetest 是由 libdrm 提供的测试程序,可以查询显示设备的支持状况,进行基本的显示测试,以及设置显示的模式。
  编译:$ apt-get install meson ninja-build  $ git clone https://gitlab.freedesktop.org/mesa/drm libdrm  $ cd libdrm  $ meson build/ $ ninja -C build install
  会生成库文件和测试程序:libkms tests/  # 包含 modetest libdrm.so.2.4.0 libdrm.so.2 libdrm.so
  用法:// 在 edp 屏上显示测试画面 $ modetest -M rockchip -s 77@54:1920x1080 setting mode 1920x1080-60.00Hz on connectors 77, crtc 54  // 在 hdmi 屏上显示测试画面 $ modetest -M rockchip -s 81@65:1920x1080 setting mode 1920x1080-60.00Hz on connectors 81, crtc 65
  参数说明:-M  :用于指定访问哪个 DRM 设备;-s [,][@]:[#][-][@]  :用于在指定的 pipeline 上以某个 mode 显示某个 pattern 的画面。3、kmscube
  https://gitlab.freedesktop.org/mesa/kmscube/
  kmscube 是一个演示程序,用于说明如何在没有 X11、wayland 等 compositor 的情况下编写 bare metal 图形应用。它使用了 DRM/KMS(kernel mode setting)、GBM(graphics buffer manager)和 EGL 来使用 OpenGL 或 OpenGL ES 渲染内容。
  编译:$ apt-get install meson ninja-build  $ git clone https://gitlab.freedesktop.org/mesa/kmscube/ kmscube  $ cd kmscube  $ meson build/ $ ninja -C build install
  用法:$ ./kmscube
  kmscube 运行效果
  还有很多优秀的开源软件,例如 Wayland 的参考实现 Weston,媒体播放器 Kodi、复古游戏模拟器前端 RetroArch 等,都是我们学习 KMS api 的优秀学习资料,感兴趣的小伙伴可以自行研究一波。
  到此,KMS api 的基础知识就介绍完毕了,感谢阅读!
  文章链接:
  https://mp.weixin.qq.com/s/2Wermbnh4GKEF8RvbdDj4A
  转载自:老吴嵌入式  ,作者吴伟东Jack
  文章链接: 对于 Display 框架,我需要了解 KMS api 吗? | Linux 驱动

教育部教材局已对人教教材插图开展调查,该事件或将如何发展?一组人教版数学教材插图引起了网友们的热议,原因是对比了以前的教材封面,不少的网友觉得现在的插图人物眼神奇怪毫无美感,跟以前的封面图差得不是一点半点,那时候的插图多么好看,甚至还有红案例女盗贼偷窃不成,反被威胁失身,心有不甘报警导读勿以恶小而为之,勿以善小而不为。意思是说,不要因为坏事较小就去做,不要觉得是较小的善事就不关心。犯盗窃罪的人,往往是从小偷小摸开始的。由于第一次犯错没有被发现,或者没有被正确管男子因色起意收留乌克兰美女,仅过10天便抛弃妻子女儿与其私奔近日,随着俄罗斯与乌克兰之间的冲突爆发,其对普通人民的生活影响逐渐变大,致使1400万人被迫成为难民,部分难民纷纷流向了西方国家。来自乌克兰的美女难民而最近英国的一对夫妇在收留了一小宝与康熙建宁为了韦小宝不做公主受尽委屈,却最终死于非命看过小宝与康熙这部剧的观众暴露年龄了,这部由张卫健主演,众多明星加盟的电视剧,当年也算是风靡一时。尤其是韦小宝出场必念的经典台词凉风有信,秋月无边,亏我思娇的情绪好比度日如年,虽然这些明星替身简直以假乱真最近窦骁和陈都灵主演的良辰好久知几何广受好评,窦骁也凭这部剧,再次以演员的身份回归公众视野。同时,他剧中的替身也受到大家的关注。两人的合照更是让人大呼分不清谁是谁。窦骁与替身演员合前女友是吴昕,前未婚妻是张天爱,如今35岁升级当老爸5月21号是个浪漫的日子,演员李子峰不仅表白了妻子,还官宣了自己做父亲的好消息。他通过视频的方式为自己未出生的孩子写了一封信。从此,二人世界成为幸福的一家三口,开启自己的人生新角色岂止是难看,简直就是毁三观人教社回应教材插画难看重绘人教版数学教材央媒教材插图设计须重视大众意见一觉醒来铺天盖地都是同一条事情上热搜小学教材出现丑陋毁三观的插画更让人厌恶的是设计者啊这大家先做好心理准备一起2022年中国国内的经济复苏破局,必须要面对和解决的三个关键问题内行才知道这是熊猫贝贝的第1091篇原创文章2022年即将过半,外部的俄乌冲突和依然持续的疫情,关注的热度早已下降,取而代之的,是几乎人人都在谈论经济美日印越等13国建立世界经济新宿舍的洗发水老被偷,一气之下买了芥末换上,隔天305发来贺电毕业之后你还有机会用手写名字吗姑娘,劝你还是重新找一个吧缘分来了,挡都挡不住看着空空如也的副驾驶,实在想不明白,到底输在哪里你和人家毕竟不是一个世界的看到三千七百四十秒的时候,我自吸烟有害健康,为什么国家不禁止呢?5月31日是世界无烟日,今年世界无烟日的主题是烟草威胁环境。它提醒人们,烟草除了危害健康,还危害环境。烟草业对环境的危害是巨大的,而且还在不断增长。烟草的种植生产和分销过程都产生严2014年贵州男孩被打重伤,智商不足2岁,7名同学获刑,现在咋样了孩子是父母的心肝宝贝未来希望。让人痛心的是,一个正值青春健康活泼的14岁贵州少年,在学校遭到数名同学施暴,疯狂殴打近半小时。经医院抢救之后,少年虽然保住了命,但由于伤情过重,他的智
美国20岁女体操运动员人气旺,男粉丝狂热到令队友害怕,惹争议奥莉维亚邓恩(OliviaDunne),是一位在美国体操界掀起巨大波澜的女孩。现年20岁的奥莉维亚,被粉丝们亲切地称呼为莉维(Livvy),来自新泽西州,3岁就开始练习体操的她已经CBA三消息广东队球霸或退役,挨骂新F4上线,争冠三足鼎立最近,CBA联赛打到了第二阶段收官的关键赛程,对于各支球队来说,马上就迎来新春假期,所以在放假之前都希望用好成绩来为明年打好基础。下面就跟大家来分享,三条关于CBA联赛的最新的消息美股内部人士情绪指标连续6个月下跌,预示什么?根据InsiderSentiment。com的数据,美股的内部人士情绪(insidersentiment)指标连续6个月下跌,录得两年来最长的连跌。内部人士情绪指标以企业高管或董事抑郁症除了出现情绪低落,还会有一些生理体现,患病了却不知道抑郁症是比较常见的一种疾病,主要症状是情绪低落,这几乎也是很多抑郁症患者的有的症状,病情严重程度的轻重也会在情绪低落的程度上体现出来。但是,抑郁症患者除了情绪低落外,还会出现一些生影评丨阿凡达2水之道特效奇观与情绪价值柳莺詹姆斯卡梅隆凭借泰坦尼克号和阿凡达封神后,全球观众对其每一部新作都翘首以待。当他公布阿凡达续集计划后,第二部何时能够问世,已成为影迷们的每年一问。终于,在漫长的十三年后,导演隆长期喝烧开的自来水,不碰矿泉水和纯净水,身体最终会面临什么?水是生命之源,每日保证充足饮水量,对于强身健体效果非常理想。但是在现实生活中,很多人存在饮水不足的情况。目前我们饮用最多的还是以自来水为主,因为自来水饮用方便,通过管道已经运输到家肿瘤患者这样吃水果更健康有的患者说不敢吃生冷食物,水果是冷的,能不能热了吃?其实,大部分水果都是可以热起来吃的,只是口感或味道可能会变,高温会破坏大部分维生素,所以建议没有腹泻或胃肠刺激的患者尽量直接洗干快过年了,无论阳过阳康,建议这2种酒都别喝,要注意身体整整三年的时间,大多数人都没有回老家好好过一个团圆年了,这三年对于历史的变迁来说是很短暂的,而对于我们个人来说又是一段很漫长的时期。有人在这三年的时间里改头换面春风得意,而有些人却酒精税或上调酒厂扩建,2023年威士忌市场会发生什么?回顾威士忌的2021,展望2023市场低迷贸易冲突疫情防控与放开,在多种因素的冲击之下,各个行业都面临着极大的挑战,威士忌行业也不例外。但令人欣慰的是,在历经艰难求生后,威士忌前进坏的情绪瞬间就能破坏您的生活,那么能改变它的人在哪里呢有一个小女孩有些胖,她的同班同学就总是嘲笑她,因为她胳膊粗力气壮,所以她就经常和那些嘲笑她的同学打架!这种状况让她的老师和家长都很头疼。他们也总是劝她你不要太在意他们,其实你也不太德国出生纸公证认证办理需要原件吗?德国出生纸公证认证办理需要原件吗?出生证是宝宝的第一份证件,宝宝无论在哪个国家出生,医院都会出具一份出生医学证明,信息包括宝宝的出生时间名字以及父母的信息。今天就讲讲德国出生证公证