Не отображать правильный цвет на экране imx6ul - PullRequest
1 голос
/ 27 марта 2020

Я использую imx6ul с linux. Я пытаюсь отобразить красный, зеленый и синий цвета на ЖК-дисплее один за другим через 3 секунды.

Вот как я написал свой код приложения.

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 секунд ЖК-дисплей показывает наполовину черный экран, а наполовину нижний экран представляет собой смесь цветов. Через 6 секунд он отображает синий цвет на полном экране правильно.

Моя функция цвета заливки для красного, синего и зеленого цвета остается такой же, за исключением того, что для каждого цвета его значение в буфере кадров различается.

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

Может кто-нибудь, пожалуйста, помогите сообщить мне, если есть какие-либо проблемы с синхронизацией или есть какие-либо другие IOCTL, чтобы сделать это.

С уважением, Асма

...