当前位置: 首页 > article >正文

笔记整理—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驱动相关。


http://www.kler.cn/a/382804.html

相关文章:

  • 论文阅读笔记-Covariate Shift: A Review and Analysis on Classifiers
  • 论 ONLYOFFICE:开源办公套件的深度探索
  • openvino python推理demo
  • 小菜家教平台(三):基于SpringBoot+Vue打造一站式学习管理系统
  • MySQL基础-单表查询
  • yolo继续训练模型
  • FlinkSql读取外部Mysql和HBase数据库的方法(scala)
  • AI笔筒操作说明及应用场景
  • Rust 图形界面开发——使用 GTK 创建跨平台 GUI
  • .NET 8 中 Entity Framework Core 的使用
  • 无人机无线电频谱侦测运行方式!
  • hf_transformers
  • 五、Java并发 Java Google Guava 实现
  • 解决CORS (跨源资源共享) 错误
  • RabbitMQ 实现消息队列负载均衡
  • 光纤定向耦合器
  • 基于vue框架的的冷链食品物流信息管理系统v81wb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • postman入参file的接口测试
  • 初识CSS
  • CSS综合练习
  • 使用 GitHub Actions 部署到开发服务器的详细指南
  • 如何学习Python编程?
  • Qt桌面应用开发 第二天(信号和槽 Lambda表达式)
  • 中级图像处理工具
  • web——warmup——攻防世界
  • csrf令牌