欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 笔记整理—linux驱动开发部分(8)framebuffer类设备

笔记整理—linux驱动开发部分(8)framebuffer类设备

2025/6/29 7:34:22 来源:https://blog.csdn.net/qq_35229394/article/details/143515552  浏览:    关键词:笔记整理—linux驱动开发部分(8)framebuffer类设备

         framebuffer显示设备。

        在应用层直接抽象位向DDR中存放图片。

        在操作系统中,将上图分为两个部分:驱动+应用。

        使用复制的方法效率十分的低,所以有了内存映射方法实现图片的显示。

        framebuffer帧(铺满一个屏幕)(fd)在linux在虚拟出一个设备/dev/fd,是向应用层提供的接口,也是同一接口,是一种直接抽象。

        frambuffer使用方法:①打开设备/dev/fdn;②获取设备信息<linux/fd.h>;③mmp映射(原因是应用层工作在应用层空间,内核工作在内核空间,两块虚拟空间不同,但映射到了同一块物理空间)。多个进程可同时操作同一LCD,无非是谁覆盖谁;④填充framebuffer。

        fb在应用层的使用:

#define FBDEVICE “/dev/fb0”fd = open(FBDEVICE, O_RDWR);//①打开设备
if(fd<0)
{//err
}

        #define FBIOPUT_VSCREENINFO与#define FBIOGET_FSCREENINFO宏是位于linux/fb.h下的宏,其中FBIOPUT_VSCREENINFO是可变的fb信息而FBIOGET_FSCREENINFO是不可变信息。不可变信息:如硬件真实分辨率(分辨率最大值,1080p显示器可支持720p的显示);可变信息:可适分辨率、虚拟分辨率、参考点等。

struct fb_fix_screeninfo finfo = {0};//在<linux/fb.h>查看具体情况struct fb_fix_screeninfo {char id[16];			/* identification string eg "TT Builtin" */unsigned long smem_start;	/* Start of frame buffer mem *//* (physical address) */__u32 smem_len;			/* Length of frame buffer mem */__u32 type;			/* see FB_TYPE_*		*/__u32 type_aux;			/* Interleave for interleaved Planes */__u32 visual;			/* see FB_VISUAL_*		*/ __u16 xpanstep;			/* zero if no hardware panning  */__u16 ypanstep;			/* zero if no hardware panning  */__u16 ywrapstep;		/* zero if no hardware ywrap    */__u32 line_length;		/* length of a line in bytes    */unsigned long mmio_start;	/* Start of Memory Mapped I/O   *//* (physical address) */__u32 mmio_len;			/* Length of Memory Mapped I/O  */__u32 accel;			/* Indicate to driver which	*//*  specific chip/card we have	*/__u16 reserved[3];		/* Reserved for future compatibility */
};//具体情况ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);//获取设备信息(不可变)
if(ret<0)
{//err
}

        fb大小是屏幕的一倍,用于做双缓冲(乒乓结构)。

        smem_len(字节)=虚拟分辨率(x*y)*bpp(32/8) <=色彩位(aRGB)。

unsigned int *pfb = NULL;
unsigned long smem_len= vinfo.xres_virtual * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;pfb = mmap(NULL, smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
//NULL 自分配地址(应用层)
//smem_len长度
//PROT_READ | PROT_WRITE可读可写
//MAP_SHARED非排它
//0 偏移量if (NULL == pfb)
{//err
}void draw_back(unsigned int width, unsigned int height, unsigned int color)//纯色填充
{unsigned int x, y;for (y=0; y<height; y++){for (x=0; x<width; x++){*(pfb + y * WIDTH + x) = color;}}
}

        draw_back(WIDTH, HEIGHT, 0xffffffff);//白

        在对vinfo进行修改后,使用ioctl写回:

ret=ioctl(fd,FBIOGET_VSCREENINFO,&vinfo);

        可视分辨率只能在驱动中修改。

        先介绍到这吧,下一章介绍framebuffer框架与fb驱动相关。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词