Я использую 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, чтобы сделать это.
С уважением, Асма