阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux drm显示系统的两种方案

102次阅读
没有评论

共计 2454 个字符,预计需要花费 7 分钟才能阅读完成。

导读 找了几篇和 drm 不错的文章分享给大家,Linux 是一个模块化非常明显的系统,每个子系统又会有属于自己的一些特性,学习的时候,最好也是分类学习比较好。

这篇文章主要是回答一位同学的提问,当然也是做一次总结,我相信关注我号的很多人也有做 LCD 相关的驱动或者系统开发,即使不是专门做 LCD,但是在开发过程中也难免会遇到这样或者那样的问题。
Linux drm 显示系统的两种方案
所以找了几篇和 drm 不错的文章分享给大家,Linux 是一个模块化非常明显的系统,每个子系统又会有属于自己的一些特性,学习的时候,最好也是分类学习比较好。

Linux 的 2 种显示方案
包括:
FBDEV: Framebuffer Device
DRM/KMS: Direct Rendering Manager / Kernel Mode Setting

它们有什么区别?
FBDEV:

传统的显示框架;
简单,但是只能提供最基础的显示功能;
无法满足当前上层应用和底层硬件的显示需求;

DRM/KMS:

目前主流的显示方案;
为了适应当前日益更新的显示硬件;
软件上能支持更多高级的控制和特性;

简单的说就是 FBDEV 已经不满足时代的发展需要,然后就出现了 DRM 这个东西,DRM,英文全称 Direct Rendering Manager, 即 直接渲染管理器。它是为了解决多个程序对 Video Card 资源的协同使用问题而产生的。它向用户空间提供了一组 API,用以访问操纵 GPU。

DRM 是一个内核级的设备驱动,可以编译到内核中也可以作为标准模块进行加载。DRM 最初是在 FreeBSD 中出现的,后来被移植到 Linux 系统中,并成为 Linux 系统的标准部分。

DRM 可以直接访问 DRM clients 的硬件。DRM 驱动用来处理 DMA,内存管理,资源锁以及安全硬件访问。为了同时支持多个 3D 应用,3D 图形卡硬件必须作为一个共享资源,因此需要锁来提供互斥访问。DMA 传输和 AGP 接口用来发送图形操作的 buffers 到显卡硬件,因此要防止客户端越权访问显卡硬件。

Linux DRM 层用来支持那些复杂的显卡设备,这些显卡设备通常都包含可编程的流水线,非常适合 3D 图像加速。内核中的 DRM 层,使得这些显卡驱动在进行内存管理,中断处理和 DMA 操作中变得更容易,并且可以为上层应用提供统一的接口。

FBDEV 的测试程序

/*  
 * Copyright (C) 2011 The Android Open Source Project  
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");  
 * you may not use this file except in compliance with the License.  
 * You may obtain a copy of the License at  
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0  
 *  
 * Unless required by applicable law or agreed to in writing, software  
 * distributed under the License is distributed on an "AS IS" BASIS,  
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 * See the License for the specific language governing permissions and  
 * limitations under the License.  
 */  
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#ifndef FBIO_WAITFORVSYNC  
#define FBIO_WAITFORVSYNC   _IOW('F', 0x20, __u32)  
#endif  
int main(int argc, char** argv) {int fd = open("/dev/graphics/fb0", O_RDWR);  
    if (fd >= 0) {  
        do {  
            uint32_t crt = 0;  
           int err = ioctl(fd, FBIO_WAITFORVSYNC, &crt);  
           if (err 

DRM 应用测试程序

 
int main(int argc, char **argv)  
{  
 int fd;  
 drmModeConnector *conn;  
 drmModeRes *res;  
 uint32_t conn_id;  
 uint32_t crtc_id;   
    // 1. 打开设备  
 fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);  
    // 2. 获得 crtc 和 connector 的 id  
 res = drmModeGetResources(fd);  
 crtc_id = res->crtcs[0];  
 conn_id = res->connectors[0];  
    // 3. 获得 connector  
 conn = drmModeGetConnector(fd, conn_id);  
 buf.width = conn->modes[0].hdisplay;  
 buf.height = conn->modes[0].vdisplay;  
    // 4. 创建 framebuffer  
 modeset_create_fb(fd, &buf);  
    // 5. Sets a CRTC configuration,这之后就会开始在 crtc0 + connector0 pipeline 上进行以 mode0 输出显示  
 drmModeSetCrtc(fd, crtc_id, buf.fb_id, 0, 0, &conn_id, 1, &conn->modes[0]);  
 getchar();  
 // 6. cleanup  
 ...  
 return 0;  
}

DRM 相关的驱动很复杂,我并不敢班门弄斧,如果大家只是想了解个大概,我觉得上面的文章应该能够满足你们的需求,但是如果你们是专门做 LCD 的,可以找到一些更优秀的资源。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2454字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中