主题 : LCD颜色显示 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 6147
精华: 0
发帖: 91
金钱: 640 两
威望: 241 点
综合积分: 182 分
注册时间: 2009-05-21
最后登录: 2011-06-23
楼主  发表于: 2009-11-11 19:28

 LCD颜色显示

各位,
我写了一个上层应用程序,调试LCD驱动,发现本来第一个显示一个值为0xE0 (RED)而显示出来的却是GREEN ,第二个0x1C(GREEN)显示出来的却是blue,第三个显示值为0x03(BLUE),而显示的却是red,

颜色乱了,看了下偏移,长度都没有问题 red length :3 offset :5  green length:3 offset:2 blue length:2 offset :0
这个是什么原因造成的呀,是不是和硬件的接线有关呀
级别: 侠客
UID: 6147
精华: 0
发帖: 91
金钱: 640 两
威望: 241 点
综合积分: 182 分
注册时间: 2009-05-21
最后登录: 2011-06-23
1楼  发表于: 2009-11-12 09:05
没人答话呀
级别: 侠客
UID: 6147
精华: 0
发帖: 91
金钱: 640 两
威望: 241 点
综合积分: 182 分
注册时间: 2009-05-21
最后登录: 2011-06-23
2楼  发表于: 2009-11-12 16:46
#include <stdio.h>
#include <linux/kernel.h>
#include <stdlib.h>
//#include <fnctl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
//#include <asm/page.h>
//#include <asm/pgalloc.h>
//#include <linux/io.h>
#include <linux/types.h>
#include <fcntl.h>

#include "LcdAppDisp.h"

#define PAGE_SHIFT    12
#define PAGE_SIZE    (1UL << PAGE_SHIFT)
#define PAGE_MASK    (~(PAGE_SIZE-1))

int main(int argc, char *argv[] )
{
    FBDEV    pFBdev;
    printf("11111111111111\n");
    memset(&pFBdev,0x0,sizeof(FBDEV));
    printf("222222222222\n");
    strcpy(pFBdev.dev,"/dev/fb0");
    printf("333333333333\n");
    PFBDEV ppFBdev = &pFBdev;
    ppFBdev->fb = open(ppFBdev->dev, O_RDWR );
    printf("44444444443\n");
    if (ppFBdev->fb < 0 )
    {
        printf("Erroring Open DEV \n");
        return 0;
    }
    printf("open fb success \n");
    if ( ioctl(ppFBdev->fb, FBIOGET_VSCREENINFO,&(ppFBdev->fb_var)) == -1 )
    {
        printf("ioctl FBIOGET_VSCREENINFO error \n");
        return 0;
    }

    if ( ioctl(ppFBdev->fb,FBIOGET_FSCREENINFO,&(ppFBdev->fb_fix)) == -1 )
    {
        printf("ioctl FBIOGET_FSCREENINFO error \n");
        return 0;
    }
    printf("get fscreeninfo success \n");
    ppFBdev->fb_mem_offset = (unsigned long )(ppFBdev->fb_fix.smem_start) & (~PAGE_MASK);
    ppFBdev->fb_mem = (unsigned long int )mmap( NULL,ppFBdev->fb_fix.smem_len + ppFBdev->fb_mem_offset,
                        PROT_READ | PROT_WRITE, MAP_SHARED, ppFBdev->fb, 0 );
    printf("fb_mem_offset success \n");
    if ( ppFBdev->fb_mem == -1L)
    {
        printf("fb mmap failed, fb_mem : %d, fb_offset : %d \n",ppFBdev->fb_mem, ppFBdev->fb_mem_offset );
        return 0;
    }

    int xres = ppFBdev->fb_var.xres;
    int yres = ppFBdev->fb_var.yres;

    int mem_len = ppFBdev->fb_fix.smem_len;

    void *mem_addr = (void*)(ppFBdev->fb_mem + ppFBdev->fb_mem_offset);
    
    printf("mem_addr success \n");
    int i,j;
    for ( i = 0; i < 50; i ++ )
        for ( j = 0; j < 40; j ++ )
    {


        unsigned char *pVideomem = (unsigned char *)(mem_addr) + (xres*j+i );
        *pVideomem = (unsigned char)0xE0;
    }

    for ( i = 50; i < 100; i++ )
        for( j = 0; j < 40; j++ )
    {
    
        unsigned char *pVideomem = (unsigned char *)(mem_addr) + (xres*j+i );
        *pVideomem = (unsigned char)0x1C;
    }    

    for ( i = 100; i < 150; i++ )
        for (j = 0; j < 40; j++ )
    {
        
        unsigned char *pVideomem = (unsigned char *)(mem_addr) + (xres*j+i );
        *pVideomem = (unsigned char)0x03;
    }
    printf("loop end \n");
    while ( 1 )
    {
        ;
    }

    exit( 0 );
    return EXIT_SUCCESS;
}

各位这是我写的上层,请帮我分析下,我找了下在调用mmap时是不是会调用fb_cmap颜色表进行计算颜色,
目录程序显示出来的颜色 RED->GREEN GREEN->BLUE BLUE->RED ,
驱动中设置的颜色长度和偏移都是正确的
                              var->red.length        = 3;
            var->red.offset        = 5;
            var->green.length    = 3;
            var->green.offset    = 2;
            var->blue.length    = 2;
            var->blue.offset    = 0;