OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3824|回复: 5

[XILINX] Zynq LCD 1024*600屏幕颜色显示不太对

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-8-1
在线时间
3 小时
发表于 2022-8-1 08:14:23 | 显示全部楼层 |阅读模式
1金钱

大家好,我用Zynq 7010 在linux下显示LCD图像,用lcdTest.c显示,颜色如下,正常
1.jpg

2.jpg
如果系统显示,正点原子的logo,这个色彩显示不对
3.jpg

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2018-10-22
在线时间
35 小时
发表于 2022-8-1 09:55:38 | 显示全部楼层
这两个应用显示的rgb顺序不对,一个可能是rgb,一个是bgr,就会导致这样的结果,如果你了解大小端的问题的话,就知道这是应用对颜色的大小端的不一样,一个是小端模式,一个是大端模式
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-8-1
在线时间
3 小时
 楼主| 发表于 2022-8-1 14:43:08 | 显示全部楼层
鑫梦 发表于 2022-8-1 09:55
这两个应用显示的rgb顺序不对,一个可能是rgb,一个是bgr,就会导致这样的结果,如果你了解大小端的问题的 ...

如果RGB顺序反了,为什么进入linux后,我用自带的例程显示颜色,这个正常呢
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-8-1
在线时间
3 小时
 楼主| 发表于 2022-8-1 14:43:46 | 显示全部楼层
/***************************************************************
Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
文件名    : lcdTest.c
作者      : 邓涛
版本      : V1.0
描述      : LCD应用层测试程序
其他      : 无
论坛      : www.openedv.com
日志      : 初版V1.0 2020/7/23 邓涛创建
***************************************************************/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>

static void display_demo_1 (unsigned char *frame, unsigned int width, unsigned int height, unsigned int stride)
{
        unsigned int xcoi, ycoi;
        unsigned char wRed, wBlue, wGreen;
        unsigned int iPixelAddr = 0;

        for(ycoi = 0; ycoi < height; ycoi++) {

                for(xcoi = 0; xcoi < (width * 3); xcoi += 3) {

                        if (((xcoi / 4) & 0x20) ^ (ycoi & 0x20)) {
                                wRed = 255;
                                wGreen = 255;
                                wBlue = 255;
                        } else {
                                wRed = 0;
                                wGreen = 0;
                                wBlue = 0;
                        }

                        frame[xcoi + iPixelAddr + 0] = wRed;
                        frame[xcoi + iPixelAddr + 1] = wGreen;
                        frame[xcoi + iPixelAddr + 2] = wBlue;
                }

                iPixelAddr += stride;
        }
}

static void display_demo_2 (unsigned char *frame, unsigned int width, unsigned int height, unsigned int stride)
{
        unsigned int xcoi, ycoi;
        unsigned int iPixelAddr = 0;
        unsigned char wRed, wBlue, wGreen;
        unsigned int xInt;

        xInt = width * 3 / 8;
        for(ycoi = 0; ycoi < height; ycoi++) {

                for(xcoi = 0; xcoi < (width*3); xcoi+=3) {

                        if (xcoi < xInt) {                                   //White color
                                wRed = 255;
                                wGreen = 255;
                                wBlue = 255;
                        }
                        else if ((xcoi >= xInt) && (xcoi < xInt*2)) {         //YELLOW color
                                wRed = 255;
                                wGreen = 255;
                                wBlue = 0;
                        }
                        else if ((xcoi >= xInt * 2) && (xcoi < xInt * 3)) {        //CYAN color
                                wRed = 0;
                                wGreen = 255;
                                wBlue = 255;
                        }
                        else if ((xcoi >= xInt * 3) && (xcoi < xInt * 4)) {        //GREEN color
                                wRed = 0;
                                wGreen = 255;
                                wBlue = 0;
                        }
                        else if ((xcoi >= xInt * 4) && (xcoi < xInt * 5)) {        //MAGENTA color
                                wRed = 255;
                                wGreen = 0;
                                wBlue = 255;
                        }
                        else if ((xcoi >= xInt * 5) && (xcoi < xInt * 6)) {        //RED color
                                wRed = 255;
                                wGreen = 0;
                                wBlue = 0;
                        }
                        else if ((xcoi >= xInt * 6) && (xcoi < xInt * 7)) {        //BLUE color
                                wRed = 0;
                                wGreen = 0;
                                wBlue = 255;
                        }
                        else {                                                //BLACK color
                                wRed = 0;
                                wGreen = 0;
                                wBlue = 0;
                        }

                        frame[xcoi+iPixelAddr + 0] = wRed;
                        frame[xcoi+iPixelAddr + 1] = wGreen;
                        frame[xcoi+iPixelAddr + 2] = wBlue;
                }

                iPixelAddr += stride;
        }
}

int main (int argc, char **argv)
{
        struct fb_var_screeninfo fb_var = {0};
        struct fb_fix_screeninfo fb_fix = {0};
        unsigned int screensize;
        unsigned char *base;
        int fd;

        /* 打开LCD */
        fd = open("/dev/fb0", O_RDWR);

        if (fd < 0) {
                printf("Error: Failed to open /dev/fb0 device.\n");
                return fd;
        }

        /* 获取framebuffer设备的参数信息 */
        ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);
        ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);

        /* mmap映射 */
        screensize = fb_var.yres * fb_fix.line_length;
        base = (unsigned char *)mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        if ((unsigned char *)-1 == base) {
                close(fd);
                return -1;
        }

        memset(base, 0x00, screensize);                // 显存清零

        /* 循环显示不同颜色 */
        for ( ; ; ) {

                display_demo_1(base, fb_var.xres, fb_var.yres, fb_fix.line_length);
                sleep(2);

                display_demo_2(base, fb_var.xres, fb_var.yres, fb_fix.line_length);
                sleep(2);
        }

        /* 关闭设备 释放内存 */
        memset(base, 0x00, screensize);
        munmap(base, screensize);
        close(fd);
        return 0;
}

回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2018-10-22
在线时间
35 小时
发表于 2022-8-2 09:45:55 | 显示全部楼层
fenghua1234 发表于 2022-8-1 14:43
如果RGB顺序反了,为什么进入linux后,我用自带的例程显示颜色,这个正常呢

唉,都说了,两个应用显示的rgb顺序不一样,一个可能是rgb,一个是bgr。从你发的代码来看,自带的例程是rgb的顺序,不过从显示的效果来看,红蓝反了,不过是彩条,而且是lcd测试,所以颜色反不反对测试没影响;同时也可以看出,正确的顺序应该是bgr,logo应该也是rgb,所以logo和自带的例程,颜色顺序都反了。自带的例程,显示的彩条看不出来,除非结合代码看,而且反不反意义不大,logo的话,颜色顺序反了就看出来了。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-8-1
在线时间
3 小时
 楼主| 发表于 2022-8-4 20:24:27 | 显示全部楼层
实际上显示的图像颜色变成如下

Snap1.jpg Snap2.jpg

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-4 02:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表