linux - 在屏幕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 可以做到这一点。
问候, 阿斯玛
解决方案
推荐阅读
- javascript - Javascript - 使用 for 循环在数组中添加新列 - 错误
- visual-studio-code - vscode中scss的错误自动注释
- amazon-web-services - 从 Lambda 函数向 SSM 发送参数
- bash - 如何使用引号和符号将值设置为变量并准确复制
- javascript - JS FileReader:从本地文件中读取 Excel 和 CSV 并显示在表格上
- list - 颤振位置轮播滑块未居中
- python - print(sklearn.__version__) NameError: name 'sklearn' 没有定义
- javascript - 如何在 HTML/JS 中使用选项动态添加 n 个选择元素
- java - Spring Batch ItemReader 跳过第二页的第一条记录
- google-chrome - 白名单域的Chrome切换