- 论坛徽章:
- 0
|
最近在开发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);
} |
|