当前位置: 首页 > 科技观察

整理一篇关于linuxdrm显示系统的文章

时间:2023-03-21 11:29:01 科技观察

这篇文章主要是回答一个同学的问题,当然也是一个总结。相信很多关注我账号的人也做过LCD相关的驱动或者系统开发,即使不是我专攻LCD,但是在开发过程中难免会遇到这样那样的问题。于是找了几篇关于drm的好文章分享给大家。Linux是一个非常模块化的系统,每个子系统都有自己的特点。学习的时候,最好分门别类地学习。Linux的2种显示方案包括:FBDEV:FramebufferDeviceDRM/KMS:DirectRenderingManager/KernelModeSetting它们有什么区别?FBDEV:传统展示框架;简单,但只能提供最基本的显示功能;无法满足当前上层应用和底层硬件的显示需求;DRM/KMS:目前主流的显示方案;为了适应现在日益更新的显示硬件;该软件可以支持更高级的控件和功能;简单的说,FBDEV已经不能满足时代的发展需要了,然后就有了一个东西叫DRM,DRM,英文全称是DirectRenderingManager,即直接渲染管理器。它的创建是为了解决多个程序协同使用显卡资源的问题。它为用户空间提供了一组API来访问和操作GPU。DRM是内核级设备驱动程序,可以编译到内核中或作为标准模块加载。DRM最早出现在FreeBSD中,后来被移植到Linux系统中,成为Linux系统的标准部分。DRM可以直接访问DRM客户端的硬件。DRM驱动程序处理DMA、内存管理、资源锁定和安全硬件访问。为了同时支持多个3D应用,3D显卡硬件必须作为共享资源使用,所以需要锁来提供互斥访问。DMA传输和AGP接口用于向显卡硬件发送图形操作的缓冲区,因此需要防止客户端未经授权访问显卡硬件。LinuxDRM层用于支持那些复杂的图形设备,这些设备通常包含可编程管线,非常适合3D图像加速。内核中的DRM层使得这些显卡驱动更容易进行内存管理、中断处理和DMA操作,可以为上层应用提供统一的接口。FBDEV测试程序/**版权所有(C)2011TheAndroidOpenSourceProject**根据ApacheLicense,Version2.0(“许可证”)获得许可;*您可能不使用此文件,除非不符合许可证。*您可能获取许可证的副本**http://www.apache.org/licenses/LICENSE-2.0**除非适用法律要求或书面同意,否则软件*根据许可证分发是基于“ASIS”分发的,*没有任何明示或暗示的保证或条件。*请参阅许可证以了解特定语言的管理权限和*许可证下的限制。*/#include#include#include<#fcn#include<#fcnsys/ioctl.h>#include#include#include#include#ifndefFBIO_WAITFORVSYNC#defineFBIO_WAITFORVSYNC_IOW('F',0x20,__u32)#endifintmain(intargc,char**argv){intfd=open("/dev/graphics/fb0",O_RDWR);if(fd>=0){do{uint32_tcrt=0;interr=ioctl(fd,FBIO_WAITFORVSYNC,&crt);如果(错误<0){printf("FBIO_WAITFORVSYNCerror:%s\n",strerror(errno));break;}}while(1);close(fd);}return0;}DRM应用测试程序intmain(intargc,char**argv){intfd;drmModeConnector*conn;drmModeRes*res;uint32_tconn_id;uint32_tcrtc_id;//1.打开设备fd=open("/dev/dri/card0",O_RDWR|O_CLOEXEC);//2.获取crtc和connectoridres=drmModeGetResources(fd);crtc_id=res->crtcs[0];conn_id=res->connectors[0];//3.getconnectorconn=drmModeGetConnector(fd,conn_id);buf.width=conn->modes[0].hdisplay;buf.height=conn->modes[0].vdisplay;//4.创建framebuffermodeset_create_fb(fd,&buf);//5.SetsaCRTCconfiguration,之后会在crtc0+connector0pipelinemode0上启动输出显示drmModeSetCrtc(fd,crtc_id,buf.fb_id,0,0,&conn_id,1,&conn->modes[0]);getchar();//6.cleanup...return0;}DRM相关的驱??动很复杂,不敢出错。如果你只是想大概了解一下,我觉得上面的文章应该可以满足你的需求,但是如果你专攻LCD,你可以找到一些更好的资源