Frame Buffer的本意帧缓冲。它是指显示设备里的显存。显存里保存是像素的RGB数据。一个显存的大小,屏幕宽度*屏幕高度*每像素字节数。

软件修改显存的像素值,就形成各种显示效果.再由硬件将显存数据送到显示模块输出。显存一般是由SDRAM一段连续的空间来充当。
Linux一般都把FB设备当成显示设备标准接口。它的设备结点 /dev/fbn表示。比如第一个FB设备是/dev/fb0.应用程序通过一组标准IOCTL来操作FB驱动。
fbset就是查询FB驱动的一命令行工具,以下是执行实例
[root@hxy /]# fbset
mode "480x272-1"
# D: 0.111 MHz, H: 0.211 kHz, V: 0.739 Hz
geometry 480 272 480 272 16
timings 9009000 2 2 2 2 41 10
accel false
rgba 5/11,6/5,5/0,0/0
endmode

其中最关健是红色那行,分别表示 实际的输出宽度,高度,虚拟输出宽度,高度.和bpp

在描述LCD的物理长度,是指一种对角线物理长度 比如4.3"屏就是对角线为4.3英寸长,这个尺寸与结构设计有关.而与软件编程相关几个参数主要是屏幕分辩率和色深.
   屏幕分辩率是指每行和第列的像素数的描述。比如480*272.表示每行分布着480点,每列分布着272点.
分辩率越高越意味显示越清
每一个像素的颜色是用三原色的分量来表示,即R(red) G (Green) B (blue) 另外一个与软件高度相关是bpp, (bits per pixel),表RGB的bits数。嵌入式LINUX常用 16bpp,18bpp,24bpp. bpp值越大,能表示颜色越丰富.但是占用空间越多.单色的bpp就是1.
一个点占的字节数移为(BPP) bytes per pixel,BPP与bpp的对应换算并不是一个简单除8的关系,要根据硬件换算。一般是16bpp占用2byte,18,24,32均是4个字节.
bpp还一个说法是,色深(Color Deepth)
在lcd的datasheet还是另外一个描述方法,即一个点的最大颜色数,相于是2的bpp次方.因此颜色数是可以直接换算bpp的
  • 8bpp的颜色数256
  • 16bpp的颜色数 65,536
  • 18bpp的颜色数262,144
  • 24bpp的颜色数是 16.1m
FB的基本操作
每个fb驱动实际是一个字符设备结点,其主设备号固定为
1。打开FB设备
open("/dev/fb0",O_RDWR,0)
2.控制功能用
ioctl实现
3.显存控制
显存是LINUX内核一个空间。应用程序对显存操作是用mmap后来操作
4.关闭设备close()
取得屏幕信息
ioctl(fd, FBIOGET_VSCREENINFO,&var);
取得屏幕信息,数据存放在var中,它是定义在linux/fb.h中struct fb_var_screeninfo当中

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_virtual/yres_virtual是虚拟屏幕的尺寸
xoffset/yoffset是实际屏幕输出虚拟屏幕.
bits_per_pixel 就是BPP
这一些信息就是
设置屏幕信息
在调整的屏幕信息的作用中,主要切换bpp, 缺省的bpp是由内核配置的.但是在运行中可以切换成不同的bpp.比如一般的s3c6410可以在16bpp/18bpp/24bpp切换.但是每次的切换时只在当前打开的fd有效,关闭后又会变成缺省的bpp.
切换bpp只需要把bits_per_pixel 设为相应的值.
Ioctl(fd, FBIOSET_VSCREENINFO,&var);
var一般是FBIOGET_VSCREENINFO取得缺省值,然后再在其上修改.

在实测时,发现s3c6410的LCD驱动有BUG,即在切换成18bpp时,相应的RGB排列值并未调整,仍然是上一次BPP的排列.这样造成BUG.
解决办法是一是调整LCD驱动,二是在应用程序切换成18bpp时,同时切换成RGB排列.即用如下代码

if(ioctl(fd,FBIOGET_VSCREENINFO,&var)==-1)
       {
        printf("get screen information failure\n");
     return -2;
       }

if(bpp == 18)
       {
        var.red.length = 6;
     var.red.offset = 12;
     var.red.msb_right = 0;

var.green.length = 6;
     var.green.offset = 6;
     var.green.msb_right = 0;

var.blue.length = 6;
     var.blue.offset = 0;
     var.blue.msb_right = 0;

}
   var.bits_per_pixel = bpp;
   if(ioctl(fd,FBIOPUT_VSCREENINFO,&var)==-1)
       {
        printf("put screen2 information failure\n");
     return -2;
       }

Linux frame buffer 编程 -- fb基本操作相关推荐

  1. linux frame buffer 显示图片 没有颜色,新路程----linux framebuffer显示图片c程序

    #include #include #include #include #include #include #include #include #include #include //14byte文件 ...

  2. frame buffer编程--画点功能和新增字符串代替RGBT

    (一):写在前面 这一次进行了一个比较大的迭代,在这里我先把相对于上一个版本的改进做一个解释: 1:进一步完善画点,增加了使用字符串代替RGBT值 2:实现字符串解析出RGBT值 3:增加了画圆的算法 ...

  3. Linux 驱动 – Frame Buffer (帧缓冲)显示驱动

    Linux 驱动 – Frame Buffer (帧缓冲)显示驱动 一.Frame Buffer Frame Buffer 翻译过来是帧缓冲的意思,帧指的是一帧图像,缓冲是暂时存放的意思,连起来就是暂 ...

  4. 【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. Linux下LCD编程

    Linux下的帧缓冲lcd应用编程 (2009-12-16 22:25)一键转载 分类: xserver 原文地址:http://www.dzkf.cn/html/qianrushixitong/20 ...

  6. 嵌入式Linux下Camera编程--V4L2【转】

    转自:http://blog.csdn.net/fwqlzz/article/details/51126653 版权声明:本文为博主原创文章,未经博主允许不得转载.USB video class(又称 ...

  7. frame buffer驱动

    因为移植的需要,对linux内核的fb驱动进行了封装,但是由于以前没有调试过fb驱动所以还是遇到了很多未知的问题,所以先把封装好的驱动移植到uboot中进行调试,下面是为这次fb驱动移植所做的总结: ...

  8. 【正点原子Linux连载】第二十三章 音频应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    第二十三章 音频应用编程 ALPHA I.MX6U开发板支持音频,板上搭载了音频编解码芯片WM8960,支持播放以及录音功能! 本章我们来学习Linux下的音频应用编程,音频应用编程相比于前面几个章节 ...

  9. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

最新文章

  1. 对抗粉尘攻击——CashShuffle正在保护BCHer隐私
  2. spring junit 测试
  3. 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
  4. h3csnmp管理命令_H3C S5500V2-EI系列以太网交换机 命令参考-Release 1118-6W100_网络管理和监控命令参考_SNMP命令-新华三集团-H3C...
  5. MySql字符串函数使用技巧
  6. 收集100条实用的网络知识
  7. uitest_您在Swift中的第一个UITest
  8. 实战经验:关于Oracle Delete数据后空间重用问题的测试
  9. Java基础学习总结(156)——那些年被淘汰的Java技术及框架
  10. 安装linux系统收费标准,LINUX操作系统安装标准规范.doc
  11. (转)关于CNN中平移不变性的理解
  12. Atitit  代理与分销系统(1)  子代理 充值总额功能设计概览 sum() groubpy subagt
  13. 镜像神经元训练方法图解,镜像神经元怎么训练
  14. BAPI_FIXEDASSET_OVRTAKE_CREATE 固定资产批导(历史遗留、折旧)
  15. 如何在一台手机上,同时登录两个微信号?
  16. PCL教程-PCLVisualizer可视化类的使用
  17. amoeba mysql mmm_MMM+Amoeba搭建MySQL高可用负载均衡群集
  18. vue 取数组第一个值_vue里如何取出数组中的数组(的某一个元素)
  19. python将word表格转写入excel
  20. 服务器主机进不去系统,服务器主机进不了系统

热门文章

  1. 4月13日学习笔记——jQuery动画
  2. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...
  3. Sizzle 官方API翻译
  4. JavaScript复习笔记(1)——AJAX
  5. 新人新气象,给自己加油!
  6. UA OPTI512R 傅立叶光学导论11 卷积的性质
  7. UA OPTI570 量子力学3 单个自由粒子的薛定谔方程
  8. UA MATH575B 数值分析下VI 统计物理的随机模拟方法2
  9. win32汇编定时器简单Demo
  10. NC命令行作为服务端、客户端以及win32 套接字程序的简单连接测试