LostC 发表于 2012-05-12 17:55

关于TCC_89XX的Scaler

最近在开发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={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;Imagewin_set=0;
        Imagewin_set=dst_w;Imagewin_set=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->PWDN, 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 intIsM2MScalerEnd ;
        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)<< 8))                                // 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={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->PWDN, 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=src_w;
        Imagewin_set=src_h;
        ioctl(fb2_fd, TCC_LCD_FB_IOCTL_SET_IMGWINDOW, Imagewin_set);
        close(fb2_fd);
}

a2668100 发表于 2012-06-21 17:25

:outu::outu:
页: [1]
查看完整版本: 关于TCC_89XX的Scaler