显示设备文件接口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示设备文件接口相关的知识,希望对你有一定的参考价值。

 

例:  将/dev/fb0文件映射到内存空间(mmap), 显示相应内容

   先通过ioctl()取得framebuffer对应的设备文件/dev/fb0相关的信息, 包括显示区域的长度/宽度/每像素占用的位长等, 并以此计算映射到内存空间时的对应内存空间大小.

   向/dev/f0b映射到的内存空间写入数据, 即可在屏幕上显示相应内容.

myfb.c

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/mman.h>

#include <linux/fb.h>

#define ERROR(flag,msg)            if(flag)                        {                                    printf("%d: ",__LINE__);        fflush(stdout);                    perror(msg);                    exit(errno);                }

int main(int argc, char *argv[])
{
    int fd;
    int i;
    
    struct fb_var_screeninfo var;

    fd = open("/dev/fb0", O_RDWR);
    ERROR(fd == -1, "open()");

    int ret = ioctl(fd, FBIOGET_VSCREENINFO, &var);
    ERROR(ret == -1, "ioctl()");

    printf("bits_per_pixel = %d\n", var.bits_per_pixel);
    printf("x = %d\n", var.xres);
    printf("y = %d\n", var.yres);

    int screensize = var.xres * var.yres * var.bits_per_pixel / 8;
    char *fbp = mmap(NULL, screensize,PROT_READ | PROT_WRITE,MAP_SHARED, fd, 0);

    int x,y;

    for(y = var.yres/3; y < var.yres * 2/3; y++)
    {
        for(x = var.xres/3; x < var.xres * 2/3; x++)
        {
            int location = (y * var.xres + x) * var.bits_per_pixel/8;
            int r = 31 - (y - 200) / 16;
            int g = (x - 400) / 6;
            int b = 10;
            unsigned short t = r << 11 | g << 5 | b;
            *(unsigned short*)(fbp + location) = t;
        }
    }
    munmap(fbp,screensize);
    sleep(2);

    return 0;
}

编译链接后, 在tty1终端运行, 输出结果如下:

 技术分享

以上是关于显示设备文件接口的主要内容,如果未能解决你的问题,请参考以下文章

与另一个片段通信的片段接口

不要在片段中显示列表视图项

是否可以动态编译和执行 C# 代码片段?

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

java 代码片段

无法通过接口获取与片段通信的活动