libdrm库封装了DRM driver提供的这些接口。通过libdrm库,程序可以间接调用DRM Driver。
DRM驱动会在/dev/dri下创建3个设备节点:
使用drmOpen()打开设备。它根据指定的name和busid,在上述三个设备中选择匹配的节点。
也可以使用open(),直接则兄打开指定设备。
得到、设置capability。
下图显示各个组件,以及组件之间的关联关系。在DRM的函数名中称作资源(Resource)。如drmModeGetResources()。
每种资源的结构都定义了一个成孙袭袭员,唯一标识这个资源。如drmModeCrtc的crtc_id、drmModeConnector的connector_id、drmModeEncoder的encoder_id、drmModePlane的plane_id。
显示设备的设置、状态,保存在若干结构、变量中,禅乎如下图。如drmModeModeInfo,保存设备大小,刷新率。drmModeConnection保存连接状态。
drmModeRes结构保存DRM设备的资源集。
drmModeRes的成员fbs、crtcs、connectors、encoders是变长数组,数组长度保存在对应的变量,如count_fbs中。数组中保存的是资源ID。
函数drmModeGetResources()用于得到资源集。
根据资源 ID 得到对应的资源,包括connector、encoder、crtc。
与其他资源不同,plane资源不在drmModeRes结构中,而是保存在drmModePlaneRes结构。
成员planes是变长数组,数组长度保存在count_planes中。这里保存是plane的资源ID。
drmModeGetPlaneResources()得到plane资源集。
drmModeGetPlane() 根据Plane ID得到Plane。
drmModeProperty结构保存属性。
drmModeObjectProperties保存资源的属性集。
drmModeObjectGetProperties()得到资源属性集。
drmModeGetProperty()得到属性,drmModeObjectSetProperty()设置属性。
使用drmIoctl()创建、映射framebuffer。
使用Linux API函数 mmap(),将framebuffer映射到用户空间。
加入framebuffer(不是提交显示!)。
drmModeAtomicReq保存DRM请求。
drmModeAtomicCommit()提交请求。比如,将framebuffer保存的图像提交显示。
将framebuffer绑定到plane。程序更新framebuffer,就是更新plane。
Linux DRM API - NVIDIA
DRM示例工程 zizimumu/DRM_test
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)