飞凌嵌入式ElfBoard-LCD显示图片(bmp)编程示例之编程步骤

打开bmp文件

//打开.bmp文件

    FILE *bmp_file = fopen(filename, "rb");

    if (!bmp_file) {

        perror("Failed to open BMP file");

        exit(1);

    }

获取lcd参数

查看<linux/fb.h>

struct fb_var_screeninfo {

        __u32 xres;                     /* visible resolution           */

        __u32 yres;

        __u32 xres_virtual;             /* virtual resolution           */

        __u32 yres_virtual;

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

        __u32 yoffset;                  /* resolution                   */

        __u32 bits_per_pixel;           /* guess what                   */

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

                                        /* >1 = FOURCC                  */

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

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

        struct fb_bitfield blue;

        struct fb_bitfield transp;      /* transparency                 */

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

        __u32 activate;                 /* see FB_ACTIVATE_*            */

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

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

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

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

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

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

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

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

        __u32 lower_margin;

        __u32 hsync_len;                /* length of horizontal sync    */

        __u32 vsync_len;                /* length of vertical sync      */

        __u32 sync;                     /* see FB_SYNC_*                */

        __u32 vmode;                    /* see FB_VMODE_*               */

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

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

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

};

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

获取结构体fb_var_screeninfo

//获取屏幕信息

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

    struct fb_var_screeninfo vinfo;

    if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo)) {

        perror("Error reading variable information");

        close(fb_fd);

        return 1;

    }

使用ioctl的参数,FBIOGET_VSCREENINFO来表示获得屏幕的可变信息。

映射framebuffer

// 映射帧缓冲区

    size_t screensize = vinfo->yres_virtual * vinfo->xres_virtual * (vinfo->bits_per_pixel / 8);

    uint8_t *fb_ptr = (uint8_t *)mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);

    if (fb_ptr == MAP_FAILED) {

        perror("Failed to map framebuffer device to memory");

        free(row);

        fclose(bmp_file);

        return;

    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值