查看: 346|回复: 0

[经验] 飞凌嵌入式ElfBoard ELF1板卡-LCD显示图片编程示例之编程步骤

[复制链接]

该用户从未签到

发表于 2024-11-22 09:09:27 | 显示全部楼层 |阅读模式
分享到:
打开bmp文件
  1. //打开.bmp文件

  2.     FILE *fb = fopen(bmpname, "rb");

  3.     if (fb == NULL)

  4.     {

  5.         printf("fopen bmp error\r\n");

  6.         return -1;

  7.     }
复制代码

获取lcd参数
查看<linux/fb.h>
  1. struct fb_var_screeninfo {

  2.         __u32 xres;                     /* visible resolution           */

  3.         __u32 yres;

  4.         __u32 xres_virtual;             /* virtual resolution           */

  5.         __u32 yres_virtual;

  6.         __u32 xoffset;                  /* offset from virtual to visible */

  7.         __u32 yoffset;                  /* resolution                   */



  8.         __u32 bits_per_pixel;           /* guess what                   */

  9.         __u32 grayscale;                /* 0 = color, 1 = grayscale,    */

  10.                                         /* >1 = FOURCC                  */

  11.         struct fb_bitfield red;         /* bitfield in fb mem if true color, */

  12.         struct fb_bitfield green;       /* else only length is significant */

  13.         struct fb_bitfield blue;

  14.         struct fb_bitfield transp;      /* transparency                 */



  15.         __u32 nonstd;                   /* != 0 Non standard pixel format */



  16.         __u32 activate;                 /* see FB_ACTIVATE_*            */



  17.         __u32 height;                   /* height of picture in mm    */

  18.         __u32 width;                    /* width of picture in mm     */



  19.         __u32 accel_flags;              /* (OBSOLETE) see fb_info.flags */



  20.         /* Timing: All values in pixclocks, except pixclock (of course) */

  21.         __u32 pixclock;                 /* pixel clock in ps (pico seconds) */

  22.         __u32 left_margin;              /* time from sync to picture    */

  23.         __u32 right_margin;             /* time from picture to sync    */

  24.         __u32 upper_margin;             /* time from sync to picture    */

  25.         __u32 lower_margin;

  26.         __u32 hsync_len;                /* length of horizontal sync    */

  27.         __u32 vsync_len;                /* length of vertical sync      */

  28.         __u32 sync;                     /* see FB_SYNC_*                */

  29.         __u32 vmode;                    /* see FB_VMODE_*               */

  30.         __u32 rotate;                   /* angle we rotate counter clockwise */

  31.         __u32 colorspace;               /* colorspace for FOURCC-based modes */

  32.         __u32 reserved[4];              /* Reserved for future compatibility */

  33. };
复制代码

头文件中,用fb_var_screeninfo结构体定义屏幕参数基本信息,如分辨率,像素点位数及RGB分别用多少位表示。
获取结构体fb_var_screeninfo
  1. //获取屏幕信息

  2.     //若屏幕显示区域大小不合适,可用ioctl(dev_fd, FBIOPUT_VSCREENINFO, &scrinfo)设置

  3.     if (ioctl(dev_fd, FBIOGET_VSCREENINFO, &scrinfo))

  4.     {

  5.         printf("get screen infomation error!\r\n");

  6.         return -1;

  7.     }
复制代码

使用ioctl的参数,FBIOGET_VSCREENINFO来表示获得屏幕的可变信息。
映射framebuffer
  1. //计算需要的映射内存大小

  2.     screensize = scrinfo.xres_virtual * scrinfo.yres_virtual * scrinfo.bits_per_pixel / 8;

  3.     // printf("screensize=%lu!\r\n", screensize);



  4.     //内存映射

  5.     fbp = (char *)mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, dev_fd, 0);

  6.     if (-1 == (int)fbp)

  7.     {

  8.         printf("mmap error!\r\n");

  9.         return -1;

  10.     }
复制代码

首先计算需要的映射内存大小,计算公式为:映射内存大小 = 屏幕大小 = xres * yres * 每个像素位数 / 8。然后使用mmap映射内存,PROT_READ | PROT_WRITE表示该区域可读、可写;MAP_SHARED表示该区域是共享的,APP写入数据时,会直达驱动程序。到这一步之后就做好显示图片的准备了。

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-12-18 21:15 , Processed in 0.135625 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.