ARM9 S3C2450 这样的参数也能输出VGA 1024*768 的分辨率,A8 S5pv210 这么恐怖的参数也同样只能输出1024*768没天理啊!

 作者:gooogleman           邮箱:gooogleman@foxmail.com  日期:2012.11.24
ARM9 S3C2450
TFT(Thin Film Transistor) Color Displays Feature 
?  Supports 1, 2, 4 or 8 bpp (bit-per-pixel) palette 
color displays for color TFT 
?  Supports 16, 24 bpp non-palette true-color 
displays for color TFT 
?  Supports maximum 16M color TFT at 24 bpp 
mode 
?  Supports multiple screen size 
– Typical actual screen size: 640x480, 320x240,  
   160x160, and others. 
– Maximum frame buffer size is 4Mbytes. 
– Maximum virtual screen size in 64K color  
   mode: 2048x2048, and others 
?  Support 2 overlay windows for TFT 


S5pv210 
?  TFT-LCD Interface 
The TFT-LCD Interface supports: 
?  24/ 18/ 16-bpp parallel RGB Interface LCD   
?  8/ 6 bpp serial RGB Interface   
?  Dual i80 Interface LCD   
?  1/ 2/ 4/ 8 bpp Palletized or 8/16/24-bpp Non-Palletized Color TFT   
?  Typical actual screen size: 1024x768, 800x480, 640x480, 320x240, 160x160, and so on 
?  Virtual image up to 16M pixel (4K pixel x4K pixel)   
?  Five Window Layers for PIP or OSD   
?  Real-time overlay plane multiplexing   
?  Programmable OSD window positioning   
?  8-bit Alpha blending (Plane/Pixel) 
?  ITU-BT601/656 format output 




不过这个S5pv210 比较奇怪,虽然他看上去比2450 这些强大,但是他是有四个窗口的
windows0~windows4


这样的普通显示只能用其中一个窗口,比比如windows 0,并且这个串口和FIMC0 绑定的,那么这个FIMC0 的大小岂不是决定了 S5pv210 LCD 显示的分辨率?
不会这么扯淡吧,再看看。
不过摄像头也是用和FIMC1/FIMC2(和FIMC0一样大小) ,但是摄像头可视支持输入的分辨率高达4096*4096 的。所以
FIMC0的大小决定S5pv210的 LCD输出分辨率大小是站不住脚的。
再看咋回事,奶奶的,我就不信,咋就不行了!
在S5pv210 的wince显示驱动中有
DISP_ERROR Disp_set_framebuffer(DISP_WINDOW Win, unsigned int uiFrameBufferAddress)
{
    DISP_ERROR error = DISP_SUCCESS;


    DISP_MSG((_T("[DISP]++Disp_set_framebuffer(%d, 0x%08x)\n\r"), Win, uiFrameBufferAddress));


    Disp_window_registers_lock(Win);


    switch(Win)
    {
    case DISP_WIN0:
        if (g_Win0Config.LocalPathEnable == LOCAL_PATH_ENABLE)
        {
#if    0
            DISP_ERR((_T("[DISP:ERR] Disp_set_framebuffer() : Window0 Local Path is Enabled\n\r")));
            error = DISP_ERROR_ILLEGAL_PARAMETER;
#else
            // Safe Frame buffer Address for Local Path
            g_pDispConReg->VIDW00ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
            g_pDispConReg->VIDW00ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+0x10);    // 4 Words
            g_pDispConReg->VIDW00ADD2 = PAGEWIDTH_F(0x10);                                    // 4 Words
            g_pDispConReg->WINCON0 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
#endif
        }
        else
        {
            g_pDispConReg->VIDW00ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
            g_pDispConReg->VIDW00ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+g_Win0Config.uiPageWidth*g_Win0Config.uiHeight);
            g_pDispConReg->VIDW00ADD2 = PAGEWIDTH_F(g_Win0Config.uiPageWidth);
            g_pDispConReg->WINCON0 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
        }
        break;
    case DISP_WIN1:
        if (g_Win1Config.LocalPathEnable == LOCAL_PATH_ENABLE)
        {
#if    0
            DISP_ERR((_T("[DISP:ERR] Disp_set_framebuffer() : Window1 Local Path is Enabled\n\r")));
            error = DISP_ERROR_ILLEGAL_PARAMETER;
#else
            // Safe Frame buffer Address for Local Path
            g_pDispConReg->VIDW01ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
            g_pDispConReg->VIDW01ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+0x10);    // 4 Words
            g_pDispConReg->VIDW01ADD2 = PAGEWIDTH_F(0x10);                                    // 4 Words
            g_pDispConReg->WINCON1 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
#endif
        }
        else
        {
            g_pDispConReg->VIDW01ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
            g_pDispConReg->VIDW01ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+g_Win1Config.uiPageWidth*g_Win1Config.uiHeight);
            g_pDispConReg->VIDW01ADD2 = PAGEWIDTH_F(g_Win1Config.uiPageWidth);
            g_pDispConReg->WINCON1 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
        }
        break;
    case DISP_WIN2:
        if (g_Win2Config.LocalPathEnable == LOCAL_PATH_ENABLE)
        {
#if    0
            DISP_ERR((_T("[DISP:ERR] Disp_set_framebuffer() : Window2 Local Path is Enabled\n\r")));
            error = DISP_ERROR_ILLEGAL_PARAMETER;
#else
            // Safe Frame buffer Address for Local Path
            g_pDispConReg->VIDW02ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
            g_pDispConReg->VIDW02ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+0x10);        // 4 Words
            g_pDispConReg->VIDW02ADD2 = PAGEWIDTH_F(0x10);
            g_pDispConReg->WINCON2 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0// 4 Words
#endif
        }
        else
        {
            g_pDispConReg->VIDW02ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
            g_pDispConReg->VIDW02ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+g_Win2Config.uiPageWidth*g_Win2Config.uiHeight);
            g_pDispConReg->VIDW02ADD2 = PAGEWIDTH_F(g_Win2Config.uiPageWidth);
            g_pDispConReg->WINCON2 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
        }
        break;
    case DISP_WIN3:
        g_pDispConReg->VIDW03ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
        g_pDispConReg->VIDW03ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+g_Win3Config.uiPageWidth*g_Win3Config.uiHeight);
        g_pDispConReg->VIDW03ADD2 = PAGEWIDTH_F(g_Win3Config.uiPageWidth);
        g_pDispConReg->WINCON3 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
        break;
    case DISP_WIN4:
        g_pDispConReg->VIDW04ADD0B0 = VBANK_F(uiFrameBufferAddress>>24) | VBASEU_F(uiFrameBufferAddress);
        g_pDispConReg->VIDW04ADD1B0 = VBASEL_F(VBASEU_F(uiFrameBufferAddress)+g_Win4Config.uiPageWidth*g_Win4Config.uiHeight);
        g_pDispConReg->VIDW04ADD2 = PAGEWIDTH_F(g_Win4Config.uiPageWidth);
        g_pDispConReg->WINCON4 &= ~(BUFSEL_BUF1|BUFSEL_BUF2);    // Buffer set to Buf0
        break;
    default:
        DISP_ERR((_T("[DISP:ERR] Disp_set_framebuffer() : Unknown Window Number [%d]\n\r"), Win));
        error = DISP_ERROR_ILLEGAL_PARAMETER;
        break;
    }


    Disp_window_registers_unlock(Win);


    //DISP_MSG((_T("[DISP]--Disp_set_framebuffer() : %d\n\r"), error));


    return error;
}




VBANK_F  [31:24]  Specifies A[31:24] of the bank location for video buffer in the system memory (Shadow). 
VBASEU_F  [23:0]  Specifies A[23:0] of the start address for video frame  buffer (Shadow). 
不过在前面又有这么一个定义
VIDWxxADD0  Bit   Description                                                                                    Initial State 
VBASEU_F  [31:0]  Specifies A [31:0] of the start address for Video frame buffer.  0 
这是啥意思啊 一个24 bit 一个32 bit 就是多了一个shadow 的说明而已。


先看看uiFrameBufferAddress 这玩意是怎么设置的再说吧。
Disp_set_framebuffer 这个函数也说明这个S5pv210 显示驱动也只是一次只能用 FIMC0/FIMC1/FIMC2 其中一个而已!
这玩意也太复杂了,不过死活找不到这个uiFrameBufferAddress 设置的的地方 查找了S5pv210 的整个BSP文件夹还是看不到这个是哪里来的。
            嘿嘿,目前俺经过一周的连续奋战,已经在S5pv210 wince+android上实现了1440*900 1280*1024 1280*720 的分辨率,兼容性相当的好,这个调试过程比较曲折,以后有空再交流VGA/LVDS 快速调试经验!





    

















































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值