framebuffer结构体分析

转载出处  http://blog.chinaunix.net/uid-22666248-id-284148.html

分类: 嵌入式

我敲写了一遍 程序,然后补充了 fb_fix_screeninfo 和 fb_var_screeninfo 结构体元素的内容测试

完整的代码:  framebuff-myself-press.rar 

其中一部分的代码:
  1. ioctl(fdfd,FBIOGET_FSCREENINFO,&finfo);//获取 固定参数

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

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

  16.     printf("xres %d\n",vinfo.xres);//可见解析度  320
  17.     printf("yres %d\n",vinfo.yres);           240
  18.     printf("xres_virturl %d\n",vinfo.xres_virtual);//虚拟解析度  320
  19.     printf("yres_virtual %d\n",vinfo.yres_virtual);             240
  20.     printf("xoffset %d\n",vinfo.xoffset);//虚拟到可见的偏移       0
  21.     printf("yoffset %d\n",vinfo.yoffset);                        0
  22.     printf("bits_per_pixel %d\n",vinfo.bits_per_pixel);//每像素位数 bpp 16
  23.     printf("grayscale %d\n",vinfo.grayscale);//非零时,指灰度
  24.     
  25.     printf("fb_bitfield red.offset %d\n",vinfo.red.offset);    11  偏移11位
  26.     printf("fb_bitfield .length %d\n",vinfo.red.length);        5
  27.     printf("fb_bitfield .msb_right %d\n",vinfo.red.msb_right);    0
  28.     printf("fb_bitfield green.offset %d\n",vinfo.green.offset); 5 偏移5位
  29.     printf("fb_bitfield .length %d\n",vinfo.green.length);        6
  30.     printf("fb_bitfield .msb_right %d\n",vinfo.green.msb_right);  0
  31.     printf("fb_bitfield blue.offset %d\n",vinfo.blue.offset);
  32.     printf("fb_bitfield .length %d\n",vinfo.blue.length);
  33.     printf("fb_bitfield .msb_right %d\n",vinfo.blue.msb_right);
  34.     printf("fb_bitfield transp.offset %d\n",vinfo.transp.offset);
  35.     printf("fb_bitfield .length %d\n",vinfo.transp.length);
  36.     printf("fb_bitfield .msb_right %d\n",vinfo.transp.msb_right);

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

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

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

  50.     printf("sync %d\n",vinfo.sync);//
  51.     printf("vmode %d\n",vinfo.vmode);
  52.     printf("rotate %d\n",vinfo.rotate);
测试结果
  1. [root@yuweixian yu]#./framebuff-test
  2. the framebuffer device was opended successfully.
  3. id                          s3c2410fb
  4. smem_start                  864813056
  5. smem_len                    153600
  6. type                        0
  7. type_aux                    0
  8. visual                      2
  9. xpanstep                    0
  10. ypanstep                    0
  11. line_length                 640
  12. mmio_start                  0
  13. mmio_len                    0
  14. accel                       0

  15. xres                        320
  16. yres                        240
  17. xres_virturl                320
  18. yres_virtual                240
  19. xoffset                     0
  20. yoffset                     0
  21. bits_per_pixel              16
  22. grayscale                   0
  23. fb_bitfield red.offset      11
  24. fb_bitfield .length         5
  25. fb_bitfield .msb_right      0
  26. fb_bitfield green.offset    5
  27. fb_bitfield .length         6
  28. fb_bitfield .msb_right      0
  29. fb_bitfield blue.offset     0
  30. fb_bitfield .length         5
  31. fb_bitfield .msb_right      0
  32. fb_bitfield transp.offset   0
  33. fb_bitfield .length         0
  34. fb_bitfield .msb_right      0
  35. nonstd                      0
  36. activate                    0
  37. height                      240
  38. widht                       320
  39. accel_flags                 0
  40. pixclock                    80000
  41. left_margin                 28
  42. right_margin                24
  43. upper_margin                6
  44. lower_margin                2
  45. hsync_len                   42
  46. vsync_len                   12
  47. sync                        0
  48. vmode                       0
  49. rotate                      0
  50. the framebuffer devices was mapped to memory successfully
  51. bye the framebuffer
  52. [root@yuweixian yu]#

分析 1.

  1.     printf("fb_bitfield red.offset %d\n",vinfo.red.offset); 11 偏移11位
  2.     printf("fb_bitfield .length %d\n",vinfo.red.length); 5
  3.     printf("fb_bitfield .msb_right %d\n",vinfo.red.msb_right); 0
  4.     printf("fb_bitfield green.offset %d\n",vinfo.green.offset); 5 偏移5位
 
   这个对应 SC32440 中 RGB565 设置方式

分析 2
http://www.lslnet.com/linux/dosc1/48/linux-328178.htm
  1. printf("smem_len %d\n",finfo.smem_len);              153600
printf("line_length %d\n",finfo.line_length);          640
printf("xres %d\n",vinfo.xres);  
                      320
printf("yres %d\n",vinfo.yres);                       
240
printf("bits_per_pixel %d\n",vinfo.bits_per_pixel);    16


  1. 1.smem_len=153600 是这个 /dev/fb0 d的大小,也就是内存大小
2. line_length =640 是屏幕上一行的点在内存中占有的空间,不是一行上的点数  320*2
           因为是 16bpp 一个像素 占有2个字节大小,一行有320个点,所以line_length=640 字节大小
 
3. xres =320    yres=240      就是 x y 方向的分辨率,就是两个方向上的像素点 个数

4. bits_per_pixel=16bpp  每一个像素点 占用内存空间  2 字节

   从上面知道了 分配的内存是 smem_len=153600字
节=150KB,屏幕每一行占用内存640字节,153600/640=240,
我们发现,240 就是屏幕的高度。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值