struct fb_videomode {
const char *name; /* optional */
u32 refresh; /* optional */
u32 xres;
u32 yres;
u32 pixclock;
u32 left_margin;
u32 right_margin;
u32 upper_margin;
u32 lower_margin;
u32 hsync_len;
u32 vsync_len;
u32 sync;
u32 vmode;
u32 flag;
};
结构体中参数和显示图像的对应关系如下:
各参数具体含义:
u32 pixclock; /*每个像素时钟周期的长度,单位是皮秒(10 ^ -12 秒)*/
u32 left_margin; /*即HBP (Horizontal Back Porch),从水平同步信号到一行的有效数据之间的VCLK数*/
u32 right_margin; /*即HFP(horizontal front porth),一行的有效数据结束到下一个水平同步信号开始之间的VCLK数*/
u32 upper_margin; /*即VBP(vertical back porch),在一帧图像开始时,垂直同步信号以后的无效行数*/
u32 lower_margin; /*即VFB(vertical front porch),在一帧图像结束后,垂直同步信号以前的无效行数*/
u32 hsync_len; /*即HSPW(horizontal sync pulse width),表示水平同步信号的宽度,用VCLK计算*/
u32 vsync_len; /*即VSPW(vertical sync pulse width),表示垂直同步脉冲的宽度,用行数计算*/
计算公式:
pixclock的计算:
dotclk = refresh × (xres + left_margin + right_margin + hsync_len) × (yres + upper_margin + lower_margin + vsync_len) (单位:Hz)
pixclock = 10^12 / dotclk (单位:皮秒)
例如:
- static const struct fb_videomode vga_mode[] =
- {
- /* 640x480 @ 60 Hz */
- NULL, 60, 640, 480, 39721, 48, 16, 33, 10, 96, 2, 0,
- FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA,
- };
其中,refresh=60,xres=640,yres=480,left_margin=48, right_margin=16,upper_margin=33, lower_margin=10,hsync_len=96,vsync_len=2。
dotclk = refresh × (xres + left_margin + right_margin + hsync_len) × (yres + upper_margin + lower_margin + vsync_len)
= 60 * (640 + 48 + 16 + 96) * (480 + 33 + 10 + 2)
= 25.2 * 10^6 (Hz)
则刷新一帧画面所需的时间为 1 / dotclk (s) = (1 / 25.2) * (10 ^ -6) (s) = 0.039683 (us)。
而pixclock参数的单位是ps,1us = 10^6 ps,故:
pixclock = 0.039683 * (10 ^ 6) (ps)
= 39683 (ps)
和代码中的39721近似。