即帧缓存技术,就是将像素点显示在显示屏上。其需显卡的硬件支持,显卡将显存中的数据转化到显示屏上,而该技术就是将用户空间与显存空间进行内存映射,用户在用户空间写入数据(RGB颜色值),显存空间也会有该数据,从而可以通过此过程实现绘制图像。
显示屏上的数据储存是从左到右再从上至下的,而用户空间与显存空间是一维空间,所以要绘制指定位置的图像,首先要将显示屏上的二维坐标转化为一维坐标,再找到坐标根据RGB码绘制即可。
流程:
打开显示设备:/dev/fb0
以读写的形式用open函数打开设备,用自带的结构体struct fb_var_screeninfo定义一个结构体a,再用ioctl函数将用户空间与显存空间绑定。
int ioctl(int fd,int cmd,...)
fd:文件描述符
cmd:交互协议,包括struct fb_fix_screeninfo和struct fb_var_screeninfo,前者为固定信息,后者为可变信息
...:灵活的参数,一般为定义的结构体,用来接受文件的信息,要取地址。
获取显示设备相关参数:分辨率、像素深度
在通过ioctl函数后,设备的相关信息储存到了定义的结构体a中,其中,a.xres,a.yres为实际的设备屏幕大小,a.xres_virtual与a.yres_virtual为虚拟屏幕大小。a.bits_per_pixel为像素深度。
建立内存映射mmap
定义另一个结构体b来接受结构体a的信息,b要包括设备套接字符,像素深度,虚拟的像素大小,以及指针pmem,用以接收mmap返回的映射地址。
内存映射函数mmap(void *addr,size_t size,int prot,int fd,0)
addr如果为 NULL,则内核选择创建映射的地址; 如果 addr 不为 NULL,则内核把它作为放置位置的提示映射;
size 为虚拟像素大小*像素深度/8;
prot 为执行的方式:
PROT_EXEC 执行
PROT_READ 阅读
PROT_WRITE 写入
PROT_NONE 报错-----一般选择读写;
fd为设备描述符
写入颜色值,绘制出一个点,根据点绘制出图像。
步骤:1.判断设备像素深度是rgb888或者RGB565;
2.定位到想绘制的点,赋予其RGB码(上色)----由于屏幕为一维,所以找坐标用mmap返回的映射地址b.pmem偏移虚拟屏幕的x行*y列加x;
int point(int x,int y,unsigned int col)
{
if(x>=fb1.x_vr||y>=fb1.y_vr)
{
return -1;
}
if(fb1.bit==32)
{
unsigned int *p=fb1.pmem;
*(p+y*fb1.x_vr+x)=col;
}
if(fb1.bit==16)
{
unsigned int *p=fb1.pmem;
*(p+y*fb1.x_vr+x)=col;
}
}
解除映射、关闭设备
munmap(a.pmem,size_t size);
close(a.fd);