From 79d07f2c23f97df27f2994aae9ec8659f3e060e1 Mon Sep 17 00:00:00 2001 From: "rick.chan" Date: Fri, 11 Sep 2020 21:02:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Display=20Parameters.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: rick.chan --- .../Peripherals/Display/Display_Parameters.md | 109 ++++++++++++++++++ .../Display/img/Display_Parameters/001.png | Bin 0 -> 21556 bytes 2 files changed, 109 insertions(+) create mode 100644 Hardware/Peripherals/Display/Display_Parameters.md create mode 100644 Hardware/Peripherals/Display/img/Display_Parameters/001.png diff --git a/Hardware/Peripherals/Display/Display_Parameters.md b/Hardware/Peripherals/Display/Display_Parameters.md new file mode 100644 index 0000000..8734353 --- /dev/null +++ b/Hardware/Peripherals/Display/Display_Parameters.md @@ -0,0 +1,109 @@ +# Display Parameters + +从事与显示系统有关的工作时,常接触一些术语和概念,并涉及到像素时钟与点时钟的计算,现总结如下: + +## 1.Dotclock 与 Pixclock + +Display Parameters + +Sometimes, configuring the properties associated with your display panel might be the only driver changes that you need to make to enable video on your device, so let's start learning about video drivers by looking at common display parameters. We will assume that the associated driver conforms to the frame buffer interface, and use the fbset utility to obtain display characteristics: + +```bash +$ fbset +mode "1024x768-60" + # D: 65.003 MHz, H: 48.365 kHz, V: 60.006 Hz + geometry 1024 768 1024 768 8 + timings 15384 168 16 30 2 136 6 + hsync high + vsync high + rgba 8/0,8/0,8/0,0/0 +endmode +``` + +The D: value in the output stands for the dotclock, which is the speed at which the video hardware draws pixels on the display. The value of 65.003MHz in the preceding output means that it'll take (1/65.003*1000000) or about 15,384 picoseconds for the video controller to draw a single pixel. This duration is called the pixclock and is shown as the first numeric parameter in the line starting with timings. The numbers against "geometry" announce that the visible and virtual resolutions are 1024x768 (SVGA) and that the bits required to store information pertaining to a pixel is 8. + +The H: value specifies the horizontal scan rate, which is the number of horizontal display lines scanned by the video hardware in one second. This is the inverse of the pixclock times the X-resolution. The V: value is the rate at which the entire display is refreshed. This is the inverse of the pixclock times the visible X-resolution times the visible Y-resolution, which is around 60Hz in this example. In other words, the LCD is refreshed 60 times in a second. + +Video controllers issue a horizontal sync (HSYNC) pulse at the end of each line and a vertical sync (VSYNC) pulse after each display frame. The durations of HSYNC (in terms of pixels) and VSYNC (in terms of pixel lines) are shown as the last two parameters in the line starting with "timings." The larger your display, the bigger the likely values of HSYNC and VSYNC. The four numbers before the HSYNC duration in the timings line announce the length of the right display margin (or horizontal front porch), left margin (or horizontal back porch), lower margin (or vertical front porch), and upper margin (or vertical back porch), respectively. Documentation/fb/framebuffer.txt and the man page of fb.modes pictorially show these parameters. + +To tie these parameters together, let's calculate the pixclock value for a given refresh rate, which is 60.006Hz in our example: + +```blk +dotclock = (X-resolution + left margin + right margin + + HSYNC length) * (Y-resolution + upper margin + + lower margin + VSYNC length) * refresh rate + = (1024 + 168 + 16 + 136) * (768 + 30 + 2 + 6) * 60.006 + = 65.003 MHz +pixclock = 1e12/dotclock + = 15384 picoseconds (which matches with the fbset output + above) +``` + +## 2.术语解析 + +* left margin:行切换,从同步到绘图之间的延迟,表示从水平同步信号开始到一行的有效数据开始之间的 VCLK 的个数,等同于 HBP(horizontal back porch); +* right margin:行切换,从绘图到同步之间的延迟,表示一行的有效数据结束到下一个水平同步信号开始之间的 VCLK 的个数,等同于 HFP(horizontal front porth); +* upper margin:帧切换,从同步到绘图之间的延迟,表示在一帧图像开始时,垂直同步信号以后的无效的行数,等同于 VBP(vertical back porch); +* lower margin:帧切换,从绘图到同步之间的延迟,表示在一帧图像结束后,垂直同步信号以前的无效的行数,等同于 VFB(vertical front porch); +* hsync len:水平同步的长度,表示水平同步信号的宽度,用 VCLK 计算,等同于 HSPW(horizontal sync pulse width); +* vsync len:垂直同步的长度,表示垂直同步脉冲的宽度,用行数计算,等同于 VSPW(vertical sync pulse width)。 + +可以用以下两张图来表示: + +![TFT 屏工作时序](./img/Display_Parameters/001.png) + +```blk ++----------+---------------------------------------------+----------+-------+ +| | ↑ | | | +| | |upper_margin | | | +| | ↓ | | | ++----------###############################################----------+-------+ +| # ↑ # | | +| # | # | | +| # | # | | +| # | # | | +| left # | # right | hsync | +| margin # | xres # margin | len | +|<-------->#<---------------+--------------------------->#<-------->|<----->| +| # | # | | +| # | # | | +| # | # | | +| # |yres # | | +| # | # | | +| # | # | | +| # | # | | +| # | # | | +| # | # | | +| # | # | | +| # | # | | +| # | # | | +| # ↓ # | | ++----------###############################################----------+-------+ +| | ↑ | | | +| | |lower_margin | | | +| | ↓ | | | ++----------+---------------------------------------------+----------+-------+ +| | ↑ | | | +| | |vsync_len | | | +| | ↓ | | | ++----------+---------------------------------------------+----------+-------+ +``` + +pixclock = 1e12/dotclock,其中 x1e12 是为了将时间单位统一为皮秒(picoseconds)。 + +* Horizontal Active:X Resolution +* Horizontal Blanking Interval:HFP + HSPW + HBP; +* Vertical Active:Y Resolution +* Vertical Blanking Interval:VFB + VSPW + VBP。 + +LCD提供的外部接口信号: + +* VSYNC/VFRAME/STV:垂直同步信号(TFT)/帧同步信号(STN)/SEC TFT 信号; +* HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC TFT 信号; +* VCLK/LCD_HCLK:象素时钟信号(TFT/STN)/SEC TFT 信号; +* VD[23:0]:LCD 像素数据输出端口(TFT/STN/SEC TFT); +* VDEN/VM/TP:数据使能信号(TFT)/LCD 驱动交流偏置信号(STN)/SEC TFT 信号; +* LEND/STH:行结束信号(TFT)/SEC TFT 信号; +* LCD_LPCOE:SEC TFT OE 信号; +* LCD_LPCREV:SEC TFT REV 信号; +* LCD_LPCREVB:SEC TFT REVB 信号。 diff --git a/Hardware/Peripherals/Display/img/Display_Parameters/001.png b/Hardware/Peripherals/Display/img/Display_Parameters/001.png new file mode 100644 index 0000000000000000000000000000000000000000..fc486587725e73e4c8483e70b06d41d425500445 GIT binary patch literal 21556 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