首页 > 解决方案 > 在屏幕imx6ul上显示不呈现正确的颜色

问题描述

我在 linux 上使用 imx6ul。我试图在 3 秒后在 LCD 上依次显示红色、绿色和蓝色。

这是我编写应用程序代码的方式。

static int setup_fb(struct fb_info *fb, int id)
{
    int retval = EXIT_SUCCESS;
    struct fb_fix_screeninfo fb_fix;
    char path[16];

    memset(fb, 0, sizeof(struct fb_info));
    snprintf(&path[0], ARRAY_SIZE(path), "/dev/fb%d", id);
    fb->id = id;
    if ((fb->fd = open(path, O_RDWR, 0)) < 0) {
        fprintf(stderr, "Unable to open %s\n", path);
        return EXIT_FAILURE;
    }
    if ((retval = ioctl(fb->fd, FBIOBLANK, FB_BLANK_UNBLANK)) < 0) {
        fprintf(stderr, "Unable to unblank %s\n", path);
        return retval;
    }
    if ((retval = ioctl(fb->fd, FBIOGET_FSCREENINFO, &fb_fix)) < 0) {
        fprintf(stderr, "Could not get fix screen info for %s\n", path);
        return retval;
    }

    if ((retval = ioctl(fb->fd, FBIOGET_VSCREENINFO, &fb->screen_info)) < 0) {
        fprintf(stderr, "Could not get screen info for %s\n", path);
        return retval;
    }

    fprintf(stderr,"%s: screen info: %dx%d (virtual: %dx%d) @ %d-bpp\n\n",
            fb->name,
            fb->screen_info.xres,
            fb->screen_info.yres,
            fb->screen_info.xres_virtual,
            fb->screen_info.yres_virtual,
            fb->screen_info.bits_per_pixel);

    /* Map the device to memory*/
    fb->size = fb->screen_info.xres_virtual * fb->screen_info.yres_virtual * fb->screen_info.bits_per_pixel / 8;
    fb->fb = (unsigned short  *)mmap(0, fb->size, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0);
    if (fb->fb == MAP_FAILED) {
        fprintf(stderr, "Error: failed mapping framebuffer %s to memory!\n", fb->name);
        return EXIT_FAILURE;
    }

    return retval;
}

static int fill_red(struct fb_info *fb)
{
        int i;
        int retval = 0;

        fprintf(stderr,"@%s: Set colorspace to 16-bpp\n", fb->name);
        fb->screen_info.bits_per_pixel = 16;
        if ((retval = ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb->screen_info)) < 0)
        {
                fprintf(stderr, "@%s: Could not set screen info!\n", fb->name);
                return retval;
        }

        fprintf(stderr,"@%s: Fill the screen in RED %d\n", fb->name, fb->size);
        for (i = 0; i < fb->size / 2; i++)
        {
            fb->fb[i] = 0xF800;
        }

        if ((retval = ioctl(fb->fd, FBIO_WAITFORVSYNC, &fb->screen_info)) < 0)
        {
                fprintf(stderr, "@%s: FBIO_WAITFORVSYNC error!\n", fb->name);
                return retval;
        }
        return retval;
}

    int display_test(void)
    {

    int retval = EXIT_SUCCESS;

    if ((retval = setup_fb(&fb0, 0)) < 0)
        goto exit;
    if ((retval = setup_fb(&fb1, 1)) < 0)
        goto exit;

    fb0.screen_info.bits_per_pixel = 16;
    fb0.screen_info.yoffset = 0;
    if ((retval = ioctl(fb0.fd, FBIOPUT_VSCREENINFO, &fb0.screen_info)) < 0) {
        fprintf(stderr, "@%s: Could not set screen info!\n", fb0.name);
        goto exit;
    }

    fb1.screen_info.bits_per_pixel = 16;
    fb1.screen_info.yoffset = 0;
    if ((retval = ioctl(fb1.fd, FBIOPUT_VSCREENINFO, &fb1.screen_info)) < 0) {
        fprintf(stderr, "@%s: Could not set screen info!\n", fb1.name);
        goto exit;
    }

    retval = fill_red(&fb0);    //Fill LCD with red color
    sleep(3);
    retval = fill_green(&fb0);  //Fill LCD with green color
    sleep(3);
    retval = fill_blue(&fb0);  //Fill LCD with blue color

    exit:
        cleanup_fb(&fb0);
        cleanup_fb(&fb1);
        if (retval != EXIT_SUCCESS)
        {
            fprintf(stderr, "%s.\n", strerror(-retval));
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }

运行应用程序后,我看到前 6 秒 LCD 显示半黑屏,而半底屏幕是混色。6 秒后,它在全屏上正确显示蓝色。

我的红蓝绿填充颜色函数是相同的,除了它在帧缓冲区中为每种颜色设置了不同的值。

fb->fb[i] = 0xF800; //red
fb->fb[i] = 0x07E0; //green
fb->fb[i] = 0x1F00;//blue

有人可以帮忙让我知道是否有任何同步问题,或者是否有任何其他 IOCTL 可以做到这一点。

问候, 阿斯玛

标签: linuxdisplaylcdimx6

解决方案


推荐阅读