免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2351 | 回复: 1
打印 上一主题 下一主题

[图形界面] 关于TCC_89XX的Scaler [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-12 17:55 |只看该作者 |倒序浏览
  最近在开发TCC_89XX的板子,播放器运行在fb0,fb1暂时没用,fb2是Qt的图形界面.板子启动的时候,默认是VGA模式,分辨率为1280*768.如果要手动切换到HDMI模式的话,就要对f2进行伸缩处理,让fb2的分辨率和HDMI模式的分辨率匹配,这个时候就要调用M2M_ScalerForGUI_Enable和M2M_ScalerForGUI_Start两个函数,问题就是出在这里,当我调用这两个函数后,整个QT图形界面就花屏了,不知道为什么??望有大牛知道的,帮兄弟一把!!
以下是两个函数:
void M2M_ScalerForGUI_Enable(unsigned int dst_w, unsigned int dst_h)
{

    printf("m2m_scalerforugi_enable\n";
        int ret=0,on=1;
        int fb1_fd;
        int fb2_fd;
        unsigned int Imagewin_set[4]={0,};
        unsigned int M2MSrcPhyAddr = HW_MEM_BASE;
        unsigned int alpha = 0x00;
        struct fb_fix_screeninfo fbfix;

        printf("==M2M For GUI== dst W %d dst H %d \n",dst_w,dst_h);
        if(!Init_Virtual(&vM2MScaler1, TCC_MEMORY_DEVICE_NAME))
        {
                printf("Init_Virtual Alloc Error!\n";
                return;
        }
        /*For DDI Clock*/
        pClockReg1 = (DDICONFIG *) SetVirtual(&vM2MScaler1, &HwDDI_CONFIG_BASE, PHYSICAL_REG_SIZE);
        if(!pClockReg1)
        {
                printf("pCKCReg Alloc Error!\n";
                return;
        }
        /*For M2M0*/
        M2MBaseAddress1        = (unsigned int)SetVirtual(&vM2MScaler1, &HwMSC_BASE, PHYSICAL_REG_SIZE);
        if(!M2MBaseAddress1)
        {
                printf("M2MBaseAddress Alloc Error!\n";
                FreeVirtual(&vM2MScaler1, M2MBaseAddress1 ,PHYSICAL_REG_SIZE);
                return;
        }
        /*For IMGCh-2 Base Address*/
        LCDCBaseAddress1        = (unsigned int)SetVirtual(&vM2MScaler1, &HwLCDC1_BASE, PHYSICAL_REG_SIZE);
        if(!LCDCBaseAddress1)
        {
                printf("LCDCBaseAddress1 Alloc Error!\n";
                FreeVirtual(&vM2MScaler1, LCDCBaseAddress1 ,PHYSICAL_REG_SIZE);
                return;
        }

        /*Getting FB2 Base Address (physical) 胶纳老矾狼 Src 涝聪促.*/
        Imagewin_set[0]=0;Imagewin_set[1]=0;
        Imagewin_set[2]=dst_w;Imagewin_set[3]=dst_h;

        fb2_fd = open ( "/dev/fb2" , O_RDWR);
        ret = ioctl(fb2_fd, FBIOGET_FSCREENINFO, &fbfix);
        FB2_PAddr = fbfix.smem_start;
        ret = ioctl(fb2_fd, TCC_LCD_FB_IOCTL_SET_IMGWINDOW, Imagewin_set);
        if(ret < 0)
        {
            printf("set fb2 IMAGWINDOW Error!\n";
        }
        //ret = ioctl(fb2_fd, TCC_LCD_FB_IOCTL_ALPHA_SET,&alpha);
        close(fb2_fd);

        /*Getting FB1 Base Address (physical) 胶纳老矾狼 OutPut 滚欺 涝聪促.*/
        fb1_fd = open ( "/dev/fb1" , O_RDWR);
        ret = ioctl(fb1_fd, FBIOGET_FSCREENINFO, &fbfix);
        FB1_PAddr = fbfix.smem_start;
        close(fb1_fd);

        BITSET(pClockReg1->SWRESET, Hw5);
        BITCLR(pClockReg1->WDN, Hw5);
        BITCLR(pClockReg1->SWRESET, Hw5);
}



void M2M_ScalerForGUI_Start(unsigned int d_hsize, unsigned int d_vsize,unsigned int colormode)
{

    printf("----------->M2M_ScalerForGUI_Start dst_width = %d dst_height = %d\n",d_hsize,d_vsize);
        int fb2_fd;
        unsigned int                write_val;
        volatile unsigned int  IsM2MScalerEnd ;
        unsigned long                 IFlag;
        unsigned int src_w=0,src_h=0;
        struct fb_var_screeninfo fbvar;

        fb2_fd = open ( "/dev/fb2" , O_RDWR);

        ioctl(fb2_fd, FBIOGET_VSCREENINFO, &fbvar);
        src_w = fbvar.xres; src_h = fbvar.yres;

        printf("---------->M2M_ScalerForGUI_Start src_width = %d src_height = %d\n",src_w,src_h);

        close(fb2_fd);

        /*Source Color Format*/
        if(colormode)
        {
                BITCSET(HwREG(M2MBaseAddress1+0x14), 0xffffffff, HwDSTCFG_565);
        }
        else
        {
                BITCSET(HwREG(M2MBaseAddress1+0x14), 0xffffffff, HwDSTCFG_444);
        }

        /*Destination Color Format*/

        if(1)//colormode)
        {
                BITCSET(HwREG(M2MBaseAddress1+0x34), 0x0000000f, HwDSTCFG_565);
        }
        else
        {
                BITCSET(HwREG(M2MBaseAddress1+0x34), 0x0000000f, HwDSTCFG_444);
        }


        /*Source Image Base Address*/
        BITCSET(HwREG(M2MBaseAddress1+0x00), 0xffffffff, FB2_PAddr);

        /*Source Image Size*/
        write_val = (src_h<<16)+src_w;
        BITCSET(HwREG(M2MBaseAddress1+0x0c), 0xffffffff, write_val);

        /*Source Image Offset*/
        write_val = ((src_w*2)<<16)+src_w*2;                    // src frame offset : U/V = s_hsize/2, Y = s_hsize
        BITCSET(HwREG(M2MBaseAddress1+0x10), 0xffffffff, write_val);

        /*Destination Image Base Address 酒眶滚欺绰 荤侩窍瘤 臼篮 FB1栏肺 汲沥.*/
        BITCSET(HwREG(M2MBaseAddress1+0x20), 0xffffffff, FB1_PAddr);

        /*LCD Image 2 Base Address 甫  胶纳老矾 DST栏肺  甘俏..*/
        BITCSET(HwREG(LCDCBaseAddress1+0xf4), 0xffffffff, FB1_PAddr);

        /*Destination Image Size*/
        write_val = (d_vsize<<16) + d_hsize;                       // dst size
        BITCSET(HwREG(M2MBaseAddress1+0x2c), 0xffffffff, write_val);


        /*Destination Image Offset*/
        write_val = ((d_hsize*2)<<16) + d_hsize*2;                 // dst frame offset : src offset : U/V = s_hsize, Y = s_hsize*2
        BITCSET(HwREG(M2MBaseAddress1+0x30), 0xffffffff, write_val);

        /*Destination Image Configration*/
        write_val = 0         | (M2MSC_DSTFMT_MASK & HwDSTCFG_565)        // type
                                | ((Hw4)     & ((0)<< 4))// 0: memory, 1: LCDC
                                | ((Hw6)     & (( 1)<< 6))                                                // RDY
                        //        | ((Hw8|Hw9|Hw10) & ((0)<< )                                // WAITCNT
                                | 0;

        BITCSET(HwREG(M2MBaseAddress1+0x34), 0xffffffff, 0x00000000);
        BITCSET(HwREG(M2MBaseAddress1+0x34), 0xffffffff,  write_val);


        /*MSC Information*/
        write_val = ((256*src_h/d_vsize)<<16) + (256*src_w/d_hsize);           // scale ratio
        BITCSET(HwREG(M2MBaseAddress1+0x40), 0xffffffff, write_val);

        /*MSC Control*/
        BITCSET(HwREG(M2MBaseAddress1+0x44), 0xffffffff, 0x00000000);
        BITCSET(HwREG(M2MBaseAddress1+0x44), 0xffffffff, 0x00000021);               // start
}



void M2M_ScalerForGUI_Disable(void)
{
        int fb2_fd=0,on=1;
        unsigned int Imagewin_set[4]={0,};
        unsigned int src_w=0,src_h=0;
        struct fb_var_screeninfo fbvar;

        /*LCD Image 2 Base Address 甫  FB2肺 汲沥.*/
        printf("fb2 addr' LCDCBaseAddress1 %d FB2_PAddr %d\n",LCDCBaseAddress1,FB2_PAddr);
        BITCSET(HwREG(LCDCBaseAddress1+0xf4), 0xffffffff, FB2_PAddr);
        //BITCSET(HwREG(1073881088+0xf4),0xffffffff,1215299584);

        printf("MSCCTR Disable'\n";
        BITCSET(HwREG(M2MBaseAddress1+0x44), 0xffffffff, 0x00000000);               // End

        printf("DDI Config SWRESET  ' 1 '\n";
        BITSET(pClockReg1->SWRESET, Hw5);

        printf("DDI Config Power Down\n";
        BITSET(pClockReg1->WDN, Hw5);

        printf("DDI Config SWRESET  ' 0 '\n";
        BITCLR(pClockReg1->SWRESET, Hw5);

        if(LCDCBaseAddress1)
                FreeVirtual(&vM2MScaler1, LCDCBaseAddress1, PHYSICAL_REG_SIZE);

        if(pClockReg1)
                FreeVirtual(&vM2MScaler1, pClockReg1                ,PHYSICAL_REG_SIZE);

        if(M2MBaseAddress1)
                FreeVirtual(&vM2MScaler1, M2MBaseAddress1, PHYSICAL_REG_SIZE);

        DeInit_Virtual(&vM2MScaler1);

        fb2_fd = open ( "/dev/fb2" , O_RDWR);
        ioctl(fb2_fd, FBIOGET_VSCREENINFO, &fbvar);
        src_w = fbvar.xres; src_h = fbvar.yres;
        Imagewin_set[2]=src_w;
        Imagewin_set[3]=src_h;
        ioctl(fb2_fd, TCC_LCD_FB_IOCTL_SET_IMGWINDOW, Imagewin_set);
        close(fb2_fd);
}

论坛徽章:
0
2 [报告]
发表于 2012-06-21 17:25 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP