FB的一些概念

framebuffer的两个重要结构体:
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 */
};

其中重要的成员变量xres 和 yres定义在显示屏上真实显示的分辨率。而 xres_virtualyres_virtual虚拟分辨率,它们定义的是显存分辨率。比如显示屏垂直 分辨率是400,而虚拟分辨率是800。这就意味着在显存中存储着800行显示行,但是每次只能显示400行。但是显示哪400行呢?这就需要另外一个成 员变量yoffset,当yoffset=0时,从显存0行开始显示400行,如果yoffset=30,就从显存31行开始显示400行。实际上这个技 术就是乒乓 buffer 。

我的LCD参数如下:
id                        manu FB
smem_start                -945815552
smem_len                  356352
type                      0
type_aux                  0
visual                    3
xpanstep                  1
ypanstep                  1
line_length               736
mmio_start                0
mmio_len                  0
accel                     0

xres                      720
yres                      480
xres_virturl              720
yres_virtual              480
xoffset                   0
yoffset                   0
bits_per_pixel            8
其中分辨分辨率为720X480,BPP为8,但是其line_length为736。直接在FB绘图的时候要使用line_length计算像素的偏移量,而不是直接使用xres。
另外smem_len不一定等于line_length×yres_virtual。有时smem_len要考虑对齐到页大小(一般4096),所以经常会偏大。

计算像素的偏移量:
               location=(x+vinfo.xoffset)*(vinfo.bits_per_pixel/8)+
                    (y+vinfo.yoffset)*finfo.line_length;



获取/dev/fb0设备信息的函数:
来自 http://blog.chinaunix.net/uid-22666248-id-284148.html
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>


int main()
{
     int fdfd=0;     
     struct fb_var_screeninfo vinfo;
     struct fb_fix_screeninfo finfo;
     long int screensize=0;
     char *fbp=0;
     int x=0,y=0;
     long int location=0;

     fdfd=open("/dev/fb0",O_RDWR);
     printf("the framebuffer device was opended successfully.\n");

     ioctl(fdfd,FBIOGET_FSCREENINFO,&finfo); //获取 固定参数

     printf("id                        %s\n",finfo.id);
     printf("smem_start                %d\n",finfo.smem_start);  //帧缓冲 内存开始地址,物理地址
     printf("smem_len                  %d\n",finfo.smem_len);  // 帧缓冲 内存 长度
     printf("type                      %d\n",finfo.type);
     printf("type_aux                  %d\n",finfo.type_aux);//平面交织交替
     printf("visual                    %d\n",finfo.visual); //记录 色彩模式
     printf("xpanstep                  %d\n",finfo.xpanstep);//如果没有硬件panning,赋0
     printf("ypanstep                  %d\n",finfo.ypanstep);
     printf("line_length               %d\n",finfo.line_length);  
     printf("mmio_start                %d\n",finfo.mmio_start);//内存映射IO开始地址 物理地址
     printf("mmio_len                  %d\n",finfo.mmio_len);//内存映射IO 长度
     printf("accel                     %d\n\n",finfo.accel);
     

     ioctl(fdfd,FBIOGET_VSCREENINFO,&vinfo); //获取可变参数

     printf("xres                      %d\n",vinfo.xres);  //可见解析度
     printf("yres                      %d\n",vinfo.yres);
     printf("xres_virturl              %d\n",vinfo.xres_virtual);  //虚拟解析度
     printf("yres_virtual              %d\n",vinfo.yres_virtual);
     printf("xoffset                   %d\n",vinfo.xoffset);   //虚拟到可见的偏移
     printf("yoffset                   %d\n",vinfo.yoffset);
     printf("bits_per_pixel            %d\n",vinfo.bits_per_pixel);   //每像素位数 bpp
     printf("grayscale                 %d\n",vinfo.grayscale);//非零时,指灰度
     
     printf("fb_bitfield red.offset    %d\n",vinfo.red.offset);
     printf("fb_bitfield    .length    %d\n",vinfo.red.length);
     printf("fb_bitfield    .msb_right %d\n",vinfo.red.msb_right);
     printf("fb_bitfield green.offset  %d\n",vinfo.green.offset);
     printf("fb_bitfield      .length  %d\n",vinfo.green.length);
     printf("fb_bitfield    .msb_right %d\n",vinfo.green.msb_right);
     printf("fb_bitfield blue.offset   %d\n",vinfo.blue.offset);
     printf("fb_bitfield     .length   %d\n",vinfo.blue.length);
     printf("fb_bitfield    .msb_right %d\n",vinfo.blue.msb_right);
     printf("fb_bitfield transp.offset %d\n",vinfo.transp.offset);
     printf("fb_bitfield       .length %d\n",vinfo.transp.length);
     printf("fb_bitfield    .msb_right %d\n",vinfo.transp.msb_right);

     printf("nonstd                    %d\n",vinfo.nonstd); //!=0 非标准像素格式
        printf("activate                  %d\n",vinfo.activate);
     printf("height                    %d\n",vinfo.height); //高度/
     printf("widht                     %d\n",vinfo.width);
     printf("accel_flags               %d\n",vinfo.accel_flags); //看 fb_info.flags

     //定时,除了 pixclock之外,其他的都以像素时钟为单位
     printf("pixclock                  %d\n",vinfo.pixclock);//像素时钟,皮秒
     printf("left_margin               %d\n",vinfo.left_margin);//行切换:从同步到绘图之间的延迟
     printf("right_margin              %d\n",vinfo.right_margin);//行切换:从绘图到同步之间的延迟
     printf("upper_margin              %d\n",vinfo.upper_margin);//帧切换:从同步到绘图之间的延迟
     printf("lower_margin              %d\n",vinfo.lower_margin);//帧切换:从绘图到同步之间的延迟

     printf("hsync_len                 %d\n",vinfo.hsync_len);  //hor 水平同步的长度
     printf("vsync_len                 %d\n",vinfo.vsync_len);  //vir 垂直同步的长度

     printf("sync                      %d\n",vinfo.sync);     //
     printf("vmode                     %d\n",vinfo.vmode);
     printf("rotate                    %d\n",vinfo.rotate);


     screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;    //计算一帧图片占了 多少字节

     fbp=(char *)mmap(NULL,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fdfd,0);

     printf("the framebuffer devices was mapped to memory successfully\n");


     x=100;y=100;
          
     for(y=100;y<200;y++)
          for(x=100;x<300;x++)
          {
               location=(x+vinfo.xoffset)*(vinfo.bits_per_pixel/8)+
                    (y+vinfo.yoffset)*finfo.line_length;
               /*
               location=x*2+y*vinfo.xres*2;;
               */

               int b=(x-100)/6;
               int g=31-(y-100)/16;
               int r=10;
               unsigned short int t=r<<11|g<<5|b;
               *((unsigned short int *)(fbp+location))=t;
          }
          
     printf("bye the framebuffer\n");
     munmap(fbp,screensize);
     close(fdfd);
     
     return 0;     
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OB、FB、DB和FC是S7 1200中的基本元素,具体概念和特点如下: 1. OB(Organization Block):组织块是S7 120中的一种程序块,用于定义和PLC程序的执行顺序和周期。OB可以分为多个类型,如OB1、OB100等,每个类型都有特定的功能和触发条件。OB可以包含多个FC、FB和DB。 2. FB(Function Block):函数块是一种可重用的程序块,由多个功能模块组成。FB可以接收输入参数,执行特定的功能,并输出结果。FB可以在程序中多次调用,提高代码的可读性和重用性。与FC不同的是,FB在函数调用结束后,通过Static变量仍然可以保留数值,用于调用间的数据共享。 3. DB(Data Block):数据块是用于存储和管理数据的块。DB可以包含多个变量,如位、字节、整数、浮点数等。DB可以在程序中被多个FC、FB和OB共享,实现数据的共享和传递。 4. FC(Function):函数是一种可重用的程序块,用于执行特定的功能。FC可以接收输入参数,执行特定的操作,并返回结果。与FB不同的是,FC在函数调用结束后,通过Static变量无法保留数值,不适用于调用间的数据共享。 总结: - OB用于定义和管理PLC程序的执行顺序和周期。 - FB是可重用的函数块,可以在程序中多次调用,并通过Static变量保留数值。 - DB用于存储和管理数据,可以在程序中被多个FC、FB和OB共享。 - FC是可重用的函数,用于执行特定的功能,但无法通过Static变量保留数值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值