微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > EVB-335基于freebuffer显示bmp图片

EVB-335基于freebuffer显示bmp图片

时间:10-02 整理:3721RD 点击:
本实验需要给开发板移植好系统,且系统需支持freebuffer,开发板配置合适的显示屏(24色或32色),也可以直接在pc的Linux系统下运行,前提也要支持freebuffer,且配置好vga参数,vga参数配置表请参见:Linux下设置VGA显示模式方法_Linux教程_Linux公社-Linux系统门户网站 http://www.linuxidc.com/Linux/2011-08/40279.htm下面将代码贴上,看不懂的地方可以直接@我

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <sys/mman.h>
  5. #include <linux/fb.h>

  6. struct fb_fix_screeninfo fbfix ={0
  7. };
  8. struct fb_var_screeninfo fbvar = {0
  9. };
  10. long screensize = 0;
  11. unsigned char *fb32=NULL,*my_fb32=NULL;

  12. struct bmp{
  13.         unsigned char type[2];  // 0-1bit file type
  14.         long file_size;// 2-5bit file size
  15.         unsigned int off_size;//A-D sart to data offbit
  16.         unsigned int data_info;//0E-11 data info
  17.          int biwidth;//12-15 width
  18.          int bihight;//16-19 hight
  19.         unsigned int bicom;//1C-1D ò???????ó??àéù??±íê?
  20.         unsigned int bisize;//1E-21
  21.         unsigned int biclr;//2E-31
  22.         unsigned int biclrimp;//32-35
  23. };

  24. struct bmp my_bmp;

  25. void init_bmp_struct(struct bmp *p , int fd)
  26. {
  27.         unsigned char buff[54];
  28.         lseek(fd,0,SEEK_SET);  //???t?¨??
  29.         read(fd , buff , sizeof(buff));
  30.        
  31.         p->type[0] = buff[0];
  32.         p->type[1] = buff[1];
  33.         p->file_size =  (buff[5]<<24) | (buff[4]<<16) | (buff[3]<<8) | buff[2];
  34.         p->off_size =  (buff[13]<<24) | (buff[12]<<16) | (buff[11]<<8) | buff[10];
  35.         p->data_info =  (buff[17]<<24) | (buff[16]<<16) | (buff[15]<<8) | buff[14];
  36.         p->biwidth =  (buff[21]<<24) | (buff[20]<<16) | (buff[19]<<8) | buff[18];
  37.         p->bihight =  (buff[25]<<24) | (buff[24]<<16) | (buff[23]<<8) | buff[22];
  38.         p->bicom =  (buff[29]<<8) | buff[28];
  39.         p->bisize =  (buff[33]<<24) | (buff[32]<<16) | (buff[31]<<8) | buff[30];
  40.         p->biclr =  (buff[49]<<24) | (buff[48]<<16) | (buff[47]<<8) | buff[46];
  41.         p->biclrimp =  (buff[53]<<24) | (buff[52]<<16) | (buff[51]<<8) | buff[50];
  42.        
  43.         //printf("type is %c",p->type[0]);
  44.         //printf("%c\n",p->type[1]);
  45.         //if(p->type[0] != 'B' && p->type[1] != 'M')
  46.         //printf("wring: file not BMP file\n");
  47.         //printf("size is %d\n",p->file_size);
  48.         //printf("bicom is %d\n",p->bicom);
  49.         //printf("off is %d\n",p->off_size);
  50.   //printf("width is %d\n",p->biwidth);
  51.         //printf("hight is %d\n",p->bihight);

  52.        
  53. }

  54. int dis_bmp(unsigned char  *dis_addr, struct bmp info,int fd,int loc_x,int loc_y)
  55. {
  56.         int x,y,j,z,er=0;
  57.         char tmp[4];
  58.         if((loc_x+info.biwidth>fbvar.xres) || (loc_y+info.bihight)>fbvar.yres)
  59.         {
  60.         printf("set x   y failed\n");
  61.                 return 0;
  62.         }
  63.         x = info.biwidth*(fbvar.bits_per_pixel/8);
  64.         y = info.bihight;
  65.         lseek(fd,info.off_size,SEEK_SET);  //???t?¨??
  66.         if(info.bicom==24)
  67.         {
  68.                 er=(info.biwidth*3)%4;  //??????ò?DDì?3?μ?êy?Y??êy£?è?1?er=0£??ò??óDì?3?
  69.                 er = 4-er;
  70.         }
  71.         for(j=fbvar.yres-1;j>((int)fbvar.yres-info.bihight) || j==(fbvar.yres-info.bihight);j--)
  72.         {
  73.         for(z=0;z<x;z=z+(fbvar.bits_per_pixel/8))
  74.         read(fd , dis_addr+(j-loc_y)*fbvar.xres*(fbvar.bits_per_pixel/8)+z+loc_x*(fbvar.bits_per_pixel/8) ,info.bicom/8);
  75.                 if(er>0&&er<4)
  76.                 {
  77.           read(fd ,tmp,er); //è?1?′??úì?3?μ?êy?Y?ò?±?ó?a?úì?3?μ?êy?Y
  78.                 }
  79.         }

  80.        
  81. }


  82. int dis_bmp2(unsigned char  *dis_addr, struct bmp info,FILE *fd,int loc_x,int loc_y)
  83. {
  84.         int x,y,j,z,k=0,er=0;
  85.         char tmp[4];
  86.        
  87.         x = info.biwidth*(fbvar.bits_per_pixel/8);
  88.         y = info.bihight;
  89.        
  90.                 if((loc_x+info.biwidth)>fbvar.xres)
  91.         {
  92.         printf("wring  x!\n");
  93.                 x=fbvar.xres*(fbvar.bits_per_pixel/8);
  94.                 loc_x=0;
  95.         }
  96.         if((loc_y+info.bihight)>fbvar.yres)
  97.         {
  98.         printf("wring  y!\n");
  99.                 y=fbvar.yres;
  100.                 loc_y=0;
  101.         }
  102.        
  103.         if(info.bicom==24)
  104.         {
  105.                 er=(info.biwidth*3)%4;  //??????ò?DDì?3?μ?êy?Y??êy£?è?1?er=0£??ò??óDì?3
  106.                 er = 4-er;
  107.                 if(er==4)
  108.                         er=0;
  109.         }
  110.         unsigned char buffer[info.bihight][info.biwidth*(info.bicom/8)+er];
  111.         fseek(fd,info.off_size,SEEK_SET);  //???t?¨??
  112.                 fread(buffer,(info.biwidth*(info.bicom/8)+er)*info.bihight,1,fd);       
  113.         for(j=fbvar.yres-1;j>((int)fbvar.yres-info.bihight);j--)
  114.         {
  115.         //                printf("%X\n",(buffer[0]));
  116.         for(z=0,k=0;z<x;z=z+(fbvar.bits_per_pixel/8),k=k+(info.bicom/8))
  117.                 {
  118.          *(dis_addr+(j-loc_y)*fbvar.xres*(fbvar.bits_per_pixel/8)+z+loc_x*(fbvar.bits_per_pixel/8)) = buffer[fbvar.yres-j][k];
  119.          *(dis_addr+(j-loc_y)*fbvar.xres*(fbvar.bits_per_pixel/8)+z+loc_x*(fbvar.bits_per_pixel/8)+1) = buffer[fbvar.yres-j][k+1];
  120.          *(dis_addr+(j-loc_y)*fbvar.xres*(fbvar.bits_per_pixel/8)+z+loc_x*(fbvar.bits_per_pixel/8)+2) = buffer[fbvar.yres-j][k+2];
  121.          *(dis_addr+(j-loc_y)*fbvar.xres*(fbvar.bits_per_pixel/8)+z+loc_x*(fbvar.bits_per_pixel/8)+3) = 0;
  122.         }
  123. }
  124.        
  125. }






  126. int main(int argc, char *argv[])
  127. {       
  128.   int z=0,j=0,fp=-1,fd=-1,x=0,y=0;
  129.         FILE *bp=NULL;
  130.              if (argc <4 )
  131.      {
  132.          printf("please enter the file PATH or x or y!\n");
  133.          return 0;       
  134.      }
  135.         x=atoi(argv[2]);
  136.   y=atoi(argv[3]);       
  137. //printf(" x is %d\n y is %d\n",x,y);       
  138.   bp=fopen(argv[1],"r+");
  139.   if(bp==NULL)
  140.         {
  141.   printf("not PATH or file!\n");
  142. return 0;
  143.         }                       
  144.         fp =open(argv[1],O_RDWR,0664);
  145.         if(fp<0)
  146.         {
  147.   printf("not PATH or file!\n");
  148.                 fclose(bp);
  149. return 0;
  150.         }               
  151.        
  152.         fd = open("/dev/fb0",O_RDWR);
  153.                 if(fd<0)
  154.         {
  155.   printf("not dev!\n");
  156.                 close(fp);
  157. return 0;
  158.         }               
  159.         ioctl(fd ,FBIOGET_FSCREENINFO,&fbfix);
  160.         ioctl(fd ,FBIOGET_VSCREENINFO,&fbvar);
  161.         screensize = fbvar.xres*fbvar.yres*(fbvar.bits_per_pixel/8);
  162.         //printf("screensize %d\nxres is %d \n yres is %d\n per is %d \n",screensize,fbvar.xres,fbvar.yres,fbvar.bits_per_pixel);
  163.         fb32 =(unsigned char *)mmap((unsigned char *)0x400f8000,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

  164.         init_bmp_struct(&my_bmp,fp);
  165.         dis_bmp2(fb32,my_bmp,bp,x,y);
  166.         close(fd);
  167.         close(fp);
  168.         fclose(bp);
  169.         munmap(fb32,screensize);
  170.         return 0;
  171. }

复制代码


代码输入完毕后,如果在开发板环境下运行则 arm-linux-gcc    文件名 -o    文件名  如果在pc环境则 gcc 文件名 -o 文件名   
接下来就可以运行了,比如: ./dis_bmp.o   123.bmp  0  0
第一个参数是要显示的bmp图片,可以包含路径,第2  3个参数为坐标。
如果在pc环境下运行提示找不到deve,可能是你的vga参数没设好。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top