framebuffer 应用层函数

显示屏里面有一些自带的驱动寄存器,我们要操作显示器的亮灭显示及颜色等,其实就是对该显示器的寄存器进行操作,有一些寄存器是只读的,里面包含了该显示屏的一些基本且不可更改的信息,比如说该显示器实际的长和宽,还有一些信息是可以改变的,比如说屏幕的分辨率。

我们首先需要读取显示器找中的一些特定的信息,在程序的实现中是通过
ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
来实现读取硬件不可变的信息。
而通过
ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
则可以读取硬件的可变信息,然后再对这些读取到的信息进行调整,然后再写进去到屏幕的寄存器中即可改变显示器的设置

        vinfo.xres = 1024;
        vinfo.yres = 600;
        vinfo.xres_virtual = 1024;
        vinfo.yres_virtual = 1200;
        ret = ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo); 

而显示背景和显示字体颜色其实就是对某个像素点的地址进行写值,地址的不同决定了像素点的坐标不同,值的不同决定了该坐标像素点的颜色和亮度不同。首先需要获得该显示屏地址的基址,然后随着偏移地址累加会逐渐扫描各个像素点。我们只需要在里面赋相应的值即可。

 pfb = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  
 *(pfb + y * WIDTH + x) = color;

完整代码如下:
本程序参考朱友鹏老师视频程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#define FBDEVICE        "/dev/fb0"

//#define WIDTH         800     
//#define HEIGHT        480
#define WIDTH           1024    
#define HEIGHT          600
#define WHITE           0xffffffff      // test ok
#define BLACK           0x00000000
#define RED             0xffff0000
#define GREEN           0xff00ff00      // test ok
#define BLUE            0xff0000ff                      

#define GREENP          0x0000ff00   
void draw_back(unsigned int width, unsigned int height, unsigned int color);
void draw_line(unsigned int color);
unsigned int *pfb = NULL;

int main(void)
{
        int fd = -1, ret = -1;
        struct fb_fix_screeninfo finfo = {0};
        struct fb_var_screeninfo vinfo = {0};

        fd = open(FBDEVICE, O_RDWR);
        if (fd < 0)
        {
                perror("open");
                return -1;
        }
        printf("open %s success.\n", FBDEVICE);

        ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);  //
        if (ret < 0)
        {
                perror("ioctl");
                return -1;
        }
        printf("smem_start = 0x%x, smem_len = %u.\n", finfo.smem_start, finfo.smem_len);

        ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);    //
        if (ret < 0)
        {
                perror("ioctl");
                return -1;
        }
        printf("xres = %u, yres = %u.\n", vinfo.xres, vinfo.yres);
        printf("xres_virtual = %u, yres_virtual = %u.\n", vinfo.xres_virtual, vinfo.yres_virtual);
        printf("bpp = %u.\n", vinfo.bits_per_pixel);


        vinfo.xres = 1024;
        vinfo.yres = 600;
        vinfo.xres_virtual = 1024;
        vinfo.yres_virtual = 1200;
        ret = ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo);  
        if (ret < 0)
         {
                perror("ioctl");
                return -1;
        }

        ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
        if (ret < 0)
        {
                perror("ioctl");
                return -1;
        }
        printf("xres = %u, yres = %u.\n", vinfo.xres, vinfo.yres);
        printf("xres_virtual = %u, yres_virtual = %u.\n", vinfo.xres_virtual, vinfo.yres_virtual);
        printf("bpp = %u.\n", vinfo.bits_per_pixel);


        unsigned long len = vinfo.xres_virtual * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;
        printf("len = %ld\n", len);
        pfb = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  //get address for back color
        if (NULL == pfb)
        {
                perror("mmap");
                return -1;
        }
        printf("pfb = %p.\n", pfb);

        draw_back(WIDTH, HEIGHT, WHITE);  //  
        draw_line(RED);

        close(fd);

        return 0;
}



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;
        }
    }
}

void draw_line(unsigned int color)
{
    unsigned int x, y;

    for (x=50; x<600; x++)
    {
        *(pfb + 200 * WIDTH + x) = color;
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值