本文阅读总结自David Rheinsberg的drm-howto代码,代码的编排非常用心。注释也写的相当详尽,是很好的DRM应用程序入门参考资料
1、打开/dev/dri/card0节点
检查支持DRM_CAP_DUMB_BUFFER:drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &has_dumb)
2、查找可用的display设备,即connector+crtc+framebuffer组合
获取drmModeRes,该结构包含所有需要的信息:drmModeGetResources(fd);
获取drmModeConnector:conn = drmModeGetConnector(fd, res->connectors[i])
检查该Connector是否没有使用,即没有panel连接上
直接使用第一个mode(分辨率刷新率):memcpy(&dev->mode, &conn->modes[0], sizeof(dev->mode))
查找一个CRTC,在获得CRTC之前需要先获取Encoders:enc = drmModeGetEncoder(fd, conn->encoder_id)
crtc = enc->crtc_id
3、创建一个framebuffer
创建一个dumb buffer:drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq)
创建一个framebuffer实例:drmModeAddFB(fd, dev->width, dev->height, 24, 32, dev->stride,dev->handle, &dev->fb);
准备dumb buffer映射:drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq)
进行实际的mmap内存映射:dev->map = mmap(0, dev->size, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, mreq.offset);
将framebuffer置0黑色:memset(dev->map, 0, dev->size);
4、准备好以上对象后,就可以编程使CRTC连接到framebuffer和connector的组合:drmModeSetCrtc(fd, iter->crtc, iter->fb, 0, 0,
&iter->conn, 1, &iter->mode);
5、后面需要修改屏幕显示内容时,只需要修改framebuffer的内容即可