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. drminfohttps://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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 装了.Net 7.0后,工程框架用 net6 的 dotnet watch 出错临时解决方案
- python爬虫之Scrapy框架,基本介绍使用以及用框架下载图片案例
- 孩子厌学如何解决?
- 作文辅导班有必要吗
- 考研英语怎么学
- 三星堆将改写历史 三星堆对于现在历史研究有和意义
- 如何开好一家水果店?
- 想用facebook facebook商务管理平台使用教程
- 女性过了30岁后应该如何护肤
- 彭小苒|《东宫》对于彭小苒来说,是最不愿意提及的伤疤