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;
};

结构体中参数和显示图像的对应关系如下:

imx显示驱动参数详解

各参数具体含义:

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 (单位:皮秒)

例如:

  1. static const struct fb_videomode vga_mode[] = 
  2. {
  3.      /* 640x480 @ 60 Hz */
  4.      NULL, 60, 640, 480, 39721, 48, 16, 33, 10, 96, 2, 0,
  5.      FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA,
  6. };

其中,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近似。

相关文章:

  • 2021-12-31
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2021-12-30
  • 2022-01-22
  • 2021-08-29
猜你喜欢
  • 2021-08-28
  • 2022-01-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-23
相关资源
相似解决方案