作者: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 快速调试经验!
ARM9 S3C2450 这样的参数也能输出VGA 1024*768 的分辨率,A8 S5pv210 这么恐怖的参数也同样只能输出1024*768没天理啊!
最新推荐文章于 2023-09-29 06:30:00 发布