linux & android平臺XGA分辨率玩捕魚遊戲屏閃解決方法

先說明下軟件平臺:

linux:2.6.35

android: 2.3.4

CPU: 三星S5PV210

顯示屏分辨率:1024*768

bug現象:

        在玩捕魚達人遊戲的時候屏抖動,有的是在主界面抖,有的是撒網抖動,有的是換網/炮的大小抖動。並且在初步測試中發現還和音頻等應用有關,現象飄忽不定。最後緊緊圍繞lcd驅動查找原因,經過同事幫忙測試,以及查找原因,已經解決,修改方法如下:

1.使用free run模式
文件:\drivers\video\samsung\s3cfb_fimd6x.c
函數:s3cfb_set_clock
修改方法:S3C_VIDCON0_VCLKEN_NORMAL改為S3C_VIDCON0_VCLKEN_FREERUN

2.修改vclk,使其處於正常狀態。之前我們設置的83Mhz已經超過瞭cpu所允許的66MHz。
datasheet中有寫The maximum frequency of VCLK is 66MHz. 
文件:\drivers\video\samsung\s3cfb_lcd_info.c
數組:g_s3cfb_lcd_para[]
修改方法:將1024×768分辨率的clk_p改為3,此時vclk=166/3=55Mhz 幀率56hz,接近lcd屏的參考幀率,之前的vclk為80多MHz,幀率也達到瞭80多Hz,太高瞭。

註意:
還發現一個bug:我們在s3cfb_set_clock函數裡面加瞭自己指定p的代碼,但是並不完善。修改之前是這樣的:
#if defined(CONFIG_FB_MSD_LCD)
    if (ctrl->lcd->clk_p != 0){
p = ctrl->lcd->clk_p;
}else{
p = (int) (src_clk / vclk);
}
#else
p = src_clk / vclk;
#endif
if (src_clk % vclk)
p++;
if ((src_clk/p) > maxclk)
dev_info(ctrl->dev, "vclk(%d) should be smaller than %d Hz\n",
src_clk/p, maxclk);

既然指定就直接寫死,不允許再有類似以下的判斷
if (src_clk % vclk)
p++;
所以把這個包到#else裡面去瞭,以絕後患,修改如下:
#if defined(CONFIG_FB_MSD_LCD)
    if (ctrl->lcd->clk_p != 0){
p = ctrl->lcd->clk_p;
}else{
p = (int) (src_clk / vclk);
}
#else
p = src_clk / vclk;
if (src_clk % vclk)
p++;
if ((src_clk/p) > maxclk)
dev_info(ctrl->dev, "vclk(%d) should be smaller than %d Hz\n",
src_clk/p, maxclk);
#endif

還有一個極為惱人的是三星代碼的bug。開始我p指定為3的是發現其實效果是4,難道是沒有減1,仔細看瞭看設置是有減1操作的。最後加打印消息發現,cfg在設置之前bit[6]就是1,p-1之後隻是簡單的與瞭cfg,竟然沒有清零!!!
直接在前面cfg初始化的時候加入清零操作。
修改前:
cfg &= ~(S3C_VIDCON0_CLKSEL_MASK | S3C_VIDCON0_CLKVALUP_MASK |
S3C_VIDCON0_VCLKEN_MASK | S3C_VIDCON0_CLKDIR_MASK );
修改後:
cfg &= ~(S3C_VIDCON0_CLKSEL_MASK | S3C_VIDCON0_CLKVALUP_MASK |
S3C_VIDCON0_VCLKEN_MASK | S3C_VIDCON0_CLKDIR_MASK | S3C_VIDCON0_CLKVAL_F(0xFF));

作者:ximuyi
 

發佈留言