lcd规格:

像素:480x280

bpp:16

pix_format:RGB565

在开发板终端中执行:

ls /dev/fb0 -l ---> crw-rw----    1 root     video      29,   0 Jan  1  1970 /dev/fb0

/dev/fb0就是FrameBuffer的设备文件

然后我们就可以操作这个设备文件了

cat /dev/fb0 > screensnap  // 把设备文件/dev/fb0的内容保存到sreesnap文件中

ls -l screensnap

-rw-r--r--    1 root     root        268800 Nov 10 17:22 screensnap

我们得到了一个268800字节的文件,再做下面的操作:

清屏:dd if=/dev/zero of=/dev/fb0

把刚刚显示的内容重新再lcd上显示:cat /dev/screensnap >  /dev/fb0

通过以上的操作,可以推测。文件/dev/fb0就是控制屏幕上的每一点的颜色的文件。

我们可以写程序来改变这个文件的内容,就可以方便的在屏幕上画图了

测试代码:

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <fcntl.h>
  4. #include <linux/fb.h>
  5. #include <sys/mman.h>
  6.  
  7. int main()
  8. {
  9. int fbfd = ;
  10. struct fb_var_screeninfo vinfo;
  11. struct fb_fix_screeninfo finfo;
  12. struct fb_cmap cmapinfo;
  13. long int screensize = ;
  14. char *fbp = ;
  15. int x = , y = ;
  16. long int location = ;
  17. int b,g,r;
  18. // Open the file for reading and writing
  19. fbfd = open("/dev/fb0", O_RDWR); // 打开Frame Buffer设备
  20. if (fbfd < ) {
  21. printf("Error: cannot open framebuffer device.%x\n",fbfd);
  22. exit();
  23. }
  24. printf("The framebuffer device was opened successfully.\n");
  25.  
  26. // Get fixed screen information
  27. if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { // 获取设备固有信息
  28. printf("Error reading fixed information.\n");
  29. exit();
  30. }
  31. printf(finfo.id);
  32. printf("\ntype:0x%x\n", finfo.type ); // FrameBuffer 类型,如0为象素
  33. printf("visual:%d\n", finfo.visual ); // 视觉类型:如真彩2,伪彩3
  34. printf("line_length:%d\n", finfo.line_length ); // 每行字节长度
  35. printf("\nsmem_start:0x%x,smem_len:%d\n", finfo.smem_start, finfo.smem_len ); // 显存起始地址和显存大小
  36. printf("mmio_start:0x%x ,mmio_len:%d\n", finfo.mmio_start, finfo.mmio_len );
  37.  
  38. // Get variable screen information
  39. if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { // 获取设备可变信息
  40. printf("Error reading variable information.\n");
  41. exit();
  42. }
  43. printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );
  44. // Figure out the size of the screen in bytes
  45. screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / ; // 申请存放整个屏幕颜色数据的内存大小
  46. // Map the device to memory 通过mmap系统调用将framebuffer内存映射到用户空间,并返回映射后的起始地址
  47. fbp = (char *)mmap(, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
  48. fbfd, );
  49. if ((int)fbp == -) {
  50. printf("Error: failed to map framebuffer device to memory.\n");
  51. exit();
  52. }
  53. printf("The framebuffer device was mapped to memory successfully.\n");
  54.  
  55. vinfo.xoffset = (480-240)/; // (计算屏幕图像在屏幕中间一块区域显示)Where we are going to put the pixel (x坐标偏移量:120) 要分清一块屏有宽和高,宽即用x坐标表示,高用y表示,和直角坐标系一样
  56. vinfo.yoffset = (280-140)/; // (y坐标偏移量:70) 即该区域的左上角的像素点坐标为(x,y)=(120,70),右下角的坐标为(x,y)= (120+240,70+140)
  57. b = ; // 即blue : 0000 0010
  58. g = ; // A little green 即green: 0000 0100
  59. r = ; // A lot of red 即red : 0000 0100
  60. // Figure out where in memory to put the pixel
  61. for ( y = ; y < 140; y++ ) // 行扫描
  62. for ( x = ; x < 240; x++ ) { // 列扫描
  63.  
  64. location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/) + // 定位到具体哪一行的第几个像素
  65. (y+vinfo.yoffset) * finfo.line_length; //定位到哪一行(即该行的第一个像素的地址) 这两句即是实现求某一个像素的地址的功能
  66.  
  67. if ( vinfo.bits_per_pixel == ) { //
  68. *(fbp + location) = b; // Some blue
  69. *(fbp + location + ) = g; // A little green
  70. *(fbp + location + ) = r; // A lot of red
  71. *(fbp + location + ) = ; // No transparency
  72. } else { //16bpp: r:g:b=5:6:5 //assume 16bpp
  73.  
  74. unsigned short int t = r<< | g << | b;
  75. *((unsigned short int*)(fbp + location)) = t;
  76. }
  77.  
  78. }
  79. munmap(fbp, screensize);
  80. close(fbfd);
  81. return ;
  82. }

运行结果如下:

open framebuffer device successfully
DISP3 BG
type:0x0
visual:2
line_length:960

smem_start:0x3c080000,smem_len:268800
mmio_start:0x0 ,mmio_len:0
pixel:480x280, bits_per_pixel:16bpp
success to map framebuffer device to memory

分析如下:

struct fb_var_screeninfo 和 struct fb_fix_screeninfo 两个数据结构是在/usr/include/linux/fb.h中定义的:(都是无符号32位的整数)
在fb_fix_screeninfo中有,这里的值不能改变
__u32 smem_len 是这个/dev/fb0的大小,也就是内存大小。
__u32 line_length 是屏幕上一行的点在内存中占有的空间,不是一行上的点数。
在fb_var_screeninfo 中有,这里的值可以改变
__u32 xres ,__u32 yres 是x和y方向的分辨率,就是两个方向上的点数。
__u32 bits_per_pixel 是每一点占有的内存空间。

其中line_length:960 ---> 每行字节数,屏幕分辨率480x280,而且bpp为16(即两个字节表示一个像素点),所以一行共有480x2=960字节(一行480个像素,一个像素2字节表示)

smem_len:可以看到内存长度为268800字节,与上面ls screensnap -l显示大小一样

细心的你可能已经发现有些不对。屏幕上的点有480x280=134400个像素点,每个点占有两字节(16bpp)。屏幕一共的占有内存数为2x134400=268800 字节,恰好与smem_len内存长度一样。

参考:http://www.360doc.com/content/17/0705/17/45105951_669116458.shtml

参考中有一段内容是这样的:

内存长度smem_len是6M,分辨率是1024x768,色彩深度是32位。细心的你可能已经发现有些不对。屏幕上的点有1024x768=786432个,每个点占有32比特。屏幕一共的占有内存数为32x786432=25165824 就是3145728字节,恰好是3M但是上面的程序告诉我们有6M的存储空间。这是因为在现代的图形系统中大多有缓冲技术,显存中存有两页屏幕数据,这是方便快速的改变屏幕内容实现动画之类比较高的要求。关于这种缓冲技术有点复杂,我们目前先不讨论。对于我们来说只有这3M内存来存放这一个屏幕的颜色数据。

所以注意:smem_len:内存大小不一定就等于屏幕占有的内存数

hud项目lcd调试的更多相关文章

  1. hud项目lcd调试过程的一些见解

    1.帧缓冲(FrameBuffer)设备驱动帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/uapi/linux/major.h中的FB_MAJOR,次设备号定义帧缓 ...

  2. .NET WEB项目的调试发布相关

    最近接触了.NET WEB项目,调试的时候因为没配置好文件浪费了些时间,特此记录一下相关配置,以后备用 如果IIS的基目录指向了别处,在build以后必须要发布,其实就是把最新的程序更新到IIS的基目 ...

  3. vs2010旗舰版后,运行调试一个项目时调试不了,提示的是:无法使用“pc”附加到应用程序“webdev.webserver40.exe(PID:2260”

    具体问题描述: vs2010旗舰版后,运行调试一个项目时调试不了,能编译,按ctrl+f5 可以运行,但是就是调试就不行,提示的是:无法使用“pc”附加到应用程序“webdev.webserver40 ...

  4. 转载Eclipse中Maven WEB工程tomcat项目添加调试

    转载地址: http://blog.csdn.net/free4294/article/details/38260581 一.建立一个maven  WEB项目 1.file->new->o ...

  5. Ionic2开发环境搭建、项目创建调试与Android应用的打包、优化

    Ionic2开发环境搭建.项目创建调试与Android应用的打包.优化. windows下ionic2开发环境配置步骤如下: 下载node.js环境,稳定版本:v6.9.5 下载android stu ...

  6. RK平台LCD调试说明【转】

    本文转载自:http://blog.csdn.net/u014770862/article/details/76274951?locationNum=2&fps=1 RK平台LCD调试说明 原 ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试

    最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...

  8. idea启动java项目,使用调试会占用更多内存

    idea启动java项目,使用调试会占用更多内存

  9. Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll引用,导致项目无法调试问题

    最近在做录音功能,用到了Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll两个dll,但是引入后,无法调试项目 具体解决方法: 修改app. ...

随机推荐

  1. 十. 图形界面(GUI)设计9.列表和组合框

    列表和组合框是又一类供用户选择的界面组件,用于在一组选择项目选择,组合框还可以输入新的选择. 列表 列表(JList)在界面中表现为列表框,是JList类或它的子类的对象.程序可以在列表框中加入多个文 ...

  2. jeeplus中两个项目redis冲突问题

    修改端口号[两个项目使用不同的database]

  3. 两道Java面试题!

    body { font-family: 微软雅黑; font-size: 14px; line-height: 2; } html, body { color: inherit; background ...

  4. 我的vim配置---jeffy-vim-v2.3.tar

    http://files.cnblogs.com/pengdonglin137/jeffy-vim-v2.3.rar 使用方法: 在Linux下,解压后,进入解压后的目录,执行./install.sh ...

  5. Swift,函数

    1.无参数无输出的函数 func a(){ print("HI") } a() //HI 2.有参数有输出的函数 func add(a:Int,b:Int)->Int{ // ...

  6. C#中的访问修饰符

    1. 简述 private. protected. public. internal 修饰符的访问权限.private : 私有成员, 在类的内部才可以访问.protected : 保护成员,该类内部 ...

  7. 【枚举】【SDOI 2011】【bzoj 2241】打地鼠

    2241: [SDOI2011]打地鼠 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 877 Solved: 557 Description 打地鼠是 ...

  8. 动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?

    通常页面输入控件想得到日期选择功能,借助jQuery是这样实现的: 1.载入css和js <script src="jqueryui/jquery-ui.js" type=& ...

  9. php中一些函数的用法

    addslashes() 定义和用法 addslashes() 函数返回在预定义字符之前添加反斜杠的字符串. 预定义字符是: 单引号(') 双引号(") 反斜杠(\) NULL 提示:该函数 ...

  10. 播放器设置 Player Settings

    原地址:http://game.ceeger.com/Manual/class-PlayerSettings.html#Android Player Settings is where you def ...