对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动( 二 )


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); }
大致的思路是:
 

  1. 通过 drmModeGetResources() 获取到 crtc、connector 等对象的 id,然后通过 id 获取到具体的 object;
  2. 通过 ioctl(DRM_IOCTL_MODE_CREATE_DUMB) 和 drmModeAddFB() 创建 DRM framebuffer object,并获得 fb id;
  3. 通过 ioctl(DRM_IOCTL_MODE_MAP_DUMB) 和 mmap() 将 framebuffer 映射到用户空间,应用将自己要显示的内容写到 framebuffer 中;
  4. 将 crtc、connector、fb 的id 通过 drmModeSetCrtc() 告诉 DRM driver,让内核帮我们配置好 display pipeline,从而将 framebuffer 里的内容显示出来;
 
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G 。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十 。
点击这里找小助理0元领取:加微信领取资料
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 

关于 KMS atomic api:
atomic 的核心思想是将各种设置都保存在一个个的 property 里,最后将所有 property 一次性提交给内核,对于本次 commit 操作,要么成功,要么保持原来的状态完全不变 。atomic 的好处在于可以避免操作到一半时中途失败后难以回滚的问题,同时也能避免设置期间屏幕闪烁的问题 。
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
non atomic
对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动

文章插图
 
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


推荐阅读