Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4463016
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-05-03 10:19:01

程序附件: framebuff.rar  

在程序中,对 fb_fix_screeninfo 中的line_length 有疑问??
    fb_fix_screenifo  是固定参数,是不能变的
    line_length 表示:一行的字节数  ???

我打印 输出 line_length  是  640 ,这是上面意思呢 ??
 
    一行有 640 个字节呢???

  1. // Figure out where in memory to put the pixel 指出内存的哪里防止像素点
  2.         for ( y = 100; y < 200; y++ )
  3.             for ( x = 100; x < 300; x++ )
  4.         {

  5.          location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + //vinfo 可变参数
  6.          (y+vinfo.yoffset) * finfo.line_length; //finfo 不可变参数   //这行代码不是很懂   line_length=640 是 vinfo.xres的2

  7.             if(y==100||y==102||y==110||y==120||y==200)
  8.             {    
  9.                 if(x==100||x==102||x==103||x==110||x==120||x==200)                        
  10.                     {
  11.                         printf("vinfo.xoffset=        %d\n",vinfo.xoffset);
  12.                         printf("vinfo.yoffset=        %d\n",vinfo.yoffset);
  13.                         printf("finfo.line_length=    %d\n\n",finfo.line_length);
  14.                     }
  15.             }
  16.         //输出结果:xoffset=0,yoffset=0,line_length=640

  17.          if ( vinfo.bits_per_pixel == 32 )
  18.             {
  19.          *(fbp + location) = 100; // Some blue
  20.          *(fbp + location + 1) = 15+(x-100)/2; // A little green
  21.          *(fbp + location + 2) = 200-(y-100)/5; // A lot of red
  22.          *(fbp + location + 3) = 0; // No transparency
  23.          }
  24.             else
  25.             { //assume 16bpp 假设 16bpp bit per pixel
  26.          int b = 10;
  27.          int g = (x-100)/6; // A little green
  28.          int r = 31-(y-100)/16; // A lot of red
  29.          unsigned short int t = r<<11 | g << 5 | b;
  30.          *((unsigned short int*)(fbp + location)) = t;
  31.                    }             //fbp=mmap() 映射的首地址

  32.             }


在 源程序中,location 代码如下;

  1. location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + //vinfo 可变参数
  2.          (y+vinfo.yoffset) * finfo.line_length; //finfo 不可变参数 //这行代码不是很懂 line_length=640 是 vinfo.xres的2倍


在 《设备驱动开发详解 》LCD设备驱动代码中是 这么写的


  1. //Drax 3 rect with graduate RED/GREN/BLUE

  2. for(i=0;i<3;i++)
  3.     for(y=i*(vinfo.yres/3);y<(i+1)*(vinfo.yres/3);y++)
  4.     {
  5.         for(x=0;x<info.xres;x++)
  6.         {
  7.             long location=x*2+y*vinfo.xres*2;
  8.             int r=0,g=0,b=0;
  9.             unsigned short rgb;
  10.             if(i==0)
  11.                 r=((x*1.0)/vinfo.xres)*32;
  12.             if(i==1)
  13.                 g=((x*1.0)/vinfo.xres)*64;
  14.             if(i==2)
  15.                 b=((x*1.0)/vinfo.xres)*32;
  16.         
  17.             rgb=(r<<11)|(g<<5)|(b);
  18.             *(unsigned short*)(fbp+location)=rgb;
  19.         }
  20.     }

总结上两个代码:

           long location=x*2+y*vinfo.xres*2;
                    (x,y) 像素坐标, vinffo.xres=320 x的范围

               vinfo.xres*2=finfo.line_length


           就按照着这种方法写了,还是不知道这是什么回事,

             等功力 深了以后,看看。。。。



阅读(3106) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~