如果应用程序需要知道Framebuffer设备的相关参数,必须通过ioctl()系统调用来完成。
在头文件<linux/fb.h>中定义了所有的ioctl命令字,不过,最常用的ioctl命令字是下面这两个:FBIOGET_FSCREENINFO和FBIOGET_VSCREENINFO。
前者返回与Framebuffer有关的固定的信息,比如图形硬件上实际的帧缓存空间的大小、能否硬件加速等信息。
而后者返回的是与Framebuffer有关的可变信息。
之所以可变,是因为对同样的图形硬件,可以工作在不同的模式下。
简单来讲,一个支持1024x768x24图形模式的硬件通常也能工作在800x600x16的图形模式下。
可变的信息就是指Framebuffer的长度、宽度以及颜色深度等信息。
这两个命令字相关的结构体有两个:struct fb_fix_screeninfo和struct fb_var_screeninfo。
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 */
};
struct fb_var_screeninfo {
__u32 xres; /* visible resolution */
__u32 yres;
__u32 xres_virtual; /* virtual resolution */
__u32 yres_virtual;
__u32 xoffset; /* offset from virtual to visible */
__u32 yoffset; /* resolution */
__u32 bits_per_pixel; /* guess what */
__u32 grayscale; /* != 0 Graylevels instead of colors */
struct fb_bitfield red; /* bitfield in fb mem if true color, */
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp; /* transparency */
__u32 nonstd; /* != 0 Non standard pixel format */
__u32 activate; /* see FB_ACTIVATE_* */
__u32 height; /* height of picture in mm */
__u32 width; /* width of picture in mm */
__u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
/* Timing: All values in pixclocks, except pixclock (of course) */
__u32 pixclock; /* pixel clock in ps (pico seconds) */
__u32 left_margin; /* time from sync to picture */
__u32 right_margin; /* time from picture to sync */
__u32 upper_margin; /* time from sync to picture */
__u32 lower_margin;
__u32 hsync_len; /* length of horizontal sync */
__u32 vsync_len; /* length of vertical sync */
__u32 sync; /* see FB_SYNC_* */
__u32 vmode; /* see FB_VMODE_* */
__u32 rotate; /* angle we rotate counter clockwise */
__u32 reserved[5]; /* Reserved for future compatibility */
};
这两个结构体都比较大,前者用于保存Framebuffer设备的固定信息,后者用于保存Framebuffer设备的可变信息。
在调用ioctl()的时候,要用到这两个结构体。
应用程序中通常要用到struct fb_var_screeninfo的下面这几个字段:
xres、yres、bits_per_pixel,分别表示x轴的分辨率、y轴的分辨率以及每像素的颜色深度(颜色深度的单位为bit/pixel),其类型定义都是无符号32位整型数。
http://hi.baidu.com/atoe/blog/item/e8da6416912a8a4a20a4e94f.html
http://hi.baidu.com/excellentderek/blog/item/f387e64e24b713cdd0c86a59.html
图形系统开发基础(挺详细)
http://linux.chinaunix.net/bbs/thread-1063136-1-1.html
又一个framebuffer编程的例子。
-------------------------------------
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
char *fb_addr;
unsigned fb_size;
int print_screen(char *buf,int width,int height);
int main(int argc,char *argv[])
{
int screen_fbd=0;
struct fb_fix_screeninfo fb_fix;
struct fb_var_screeninfo fb_var;
char *env=NULL;
short *picture;
env="/dev/fb0";
screen_fbd=open(env,O_RDWR);
printf("Success opening framebuffer device %s/n",env);
ioctl(screen_fbd,FBIOGET_FSCREENINFO,&fb_fix);
printf("fb_fix.line_length=%d/n",fb_fix.line_length);
printf("fb_fix.accel=%d/n",fb_fix.accel);
ioctl(screen_fbd,FBIOGET_VSCREENINFO,&fb_var);
printf("fb_var.xres=%d/n",fb_var.xres);
printf("fb_var.yres=%d/n",fb_var.yres);
fb_size=fb_var.yres*fb_fix.line_length;
fb_addr=(char *)mmap(NULL,fb_size,PROT_READ|PROT_WRITE,MAP_SHARED,screen_fbd,0);
/*fb_addr的获取,是很核心的步骤,表示成功获得了framebuffer设备*/
picture=(char *)malloc(fb_var.yres*fb_fix.line_length);
memset(picture,0xFF,fb_var.yres*fb_fix.line_length);
/*注意,这里对颜色的赋值只是一次赋一半值,也就是一个字节,8bit*/
/*而事实上,一个像素的颜色值是16bit*/
/*0xFFFF就是白色*/
/*介绍一下16bit的颜色的类型,颜色是由RGB组成,如果是565排列,
则依次为Red Green Blue
11111 111111 11111
*/
print_screen(picture,fb_var.xres,fb_var.yres);
return 0;
}
int print_screen(char *buf,int width,int height)
{
short *t_data=(short *)buf;
short *t_fb_addr=(short *)fb_addr;
int bytew=width<<1; /*像素数乘以2即是字节数,因为颜色深度是2个字节(16bit)*/
while(--height>=0)
{
memcpy(t_fb_addr,t_data,bytew); /*一行的数据赋值*/
t_fb_addr += width;
t_data += width;
}
}
分享到:
相关推荐
详细介绍RFB协议的中文电子书,VNC监控使用的协议
面部表情识别模型权重 https://github.com/Whiffe/PyTorch-Facial-Expression-Recognition
python库。 资源全名:jupyter_rfb-0.2.0-py2.py3-none-any.whl
使用者可以在一端的电脑上安装该服务器后,通过在另一端电脑上安装的VNC Viewer来进行连接,连接之后该软件将会通过RFB协议来将服务器端的屏幕像素数据传输到另一台安装VNC Viewer的电脑上从而控制该机器,非常适合...
手把手教物体检测——RFBNet实例源码。包含数据、模型、测试、可视化展示。方便大家使用RFBNet模型。
基于python和c++改写后的RFB320_Face_Detector移植部署版本源码(caffe、onnx、tensorRT平台).zip RFB320_Face_Detector 部署版本,后处理用python语言和C++语言形式进行改写,便于移植不同平台(caffe、onnx、...
VNC-RFB-CLIENT RFC 6143(RFB协议/ VNC)客户端的纯node.js实现,没有外部依赖关系。 支持Raw,CopyRect,Hextile和ZRLE编码。 入门 要求 Node.js> = 10 安装 安装NPM软件包npm install vnc-rfb-client 用法 const...
资源来自pypi官网。 资源全名:rfb_mc-0.0.12-py3-none-any.whl
资源分类:Python库 所属语言:Python 资源全名:rfb_mc-0.0.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
rfb-key 将单个按键(带有可选修饰符)发送到 VNC 服务器。 安装: npm install -g rfb-key 例如,在 Google Hangout 上发送 Ctrl-D 并切换静音,假设: rfb-key --host office-tv --pass secret --key d --...
算法部署_使用TensorRT部署行人跟踪算法RFBNet模型_优质算法部署项目实战
正在安装命令: yarn add exchanges-rfb 命令: npm install exchanges-rfb --save使用范例 import Exchange from "exchanges-rfb"const MyEx = new Exchange ( { exchange_name : "BiscointEx" , exchange_cnpj : ...
RFB协议的中英文参考资料,对于做远程控制软件具有参考价值
3.8版本标准RFB协议 .
当前,它包含以下功能: 多种SSD变体:ssd,rfb,fssd,ssd-lite,rfb-lite,fssd-lite 多基础网络:VGG,Mobilenet V1 / V2 免费图片大小使用可视化:训练损失,评估损失/ mAP,例如弓箭手箱。 此存储库取决于 , ...
重新设计的RFBNet300,模型参数量只有0.99MB,AP达到0.78(排名RFBNet300降了4个点,相当于RFong7993降了两个点),速度可以达到200FPS。RFSong779虽然参数量更小,但是速度与RFSong7993差不多,而精度低了两个点,...
keras ,RFBnet网络的训练所需权重,voc数据集的训练权重
RFB协议(remote frame buffer)