By gooogleman Email: gooogleman@foxmail.com Date:
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 16 M 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 64 K 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 16 m pixel (4 K 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
However, this s5pv210 is strange. Although he looks more powerful than 2450, he has four windows.
Windows 0 ~ Windows 4
Such a normal display can only use one of the windows, such as Windows 0, and the serial port is bound to fimc0, then the size of fimc0 does not determine the resolution of s5pv210 LCD display?
Let's take a look.
However, the camera is also used with fimc1/fimc2 (the same size as fimc0), but the camera supports input resolution as high as 4096*4096. So
Fimc0 determines the LCD output resolution of s5pv210.
Let's take a look at what's going on, Grandma. I don't believe it. I don't believe it!
In the s5pv210 wince display driver
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 ).
However, there is another definition above.
Vidwxxadd0 bit description initial state
Vbaseu_f [31: 0] specifies a [31: 0] of the Start address for video frame buffer. 0
What does this mean? A 24-bit 32-bit explanation only adds a shadow.
Let's see how uiframebufferaddress is set.
The disp_set_framebuffer function also indicates that the s5pv210 display driver can only use one of fimc0/fimc1/fimc2 at a time!
This is too complicated, but I cannot find the uiframebufferaddress. I still cannot find the entire BSP folder of s5pv210.
Hey, after a week of continuous competition, we have achieved a resolution of 1440*900 1280*1024*1280*720 on s5pv210 wince + Android, with excellent compatibility, this debugging process is twists and turns, and you will be able to share your experience with VGA/LVDS soon!