转自:http://cnlearn.linksprite.com/?p=7372

fbset与fb_videomode参数对应计算【转】

Posted by: admin , 九月 12, 2014
 
<a href="http://cnlearn.linksprite.com/wp-content/uploads/2014/09/2010-01-01-000950_1920x1080_scrot.png"><img class="aligncenter" src="http://cnlearn.linksprite.com/wp-content/uploads/2014/09/2010-01-01-000950_1920x1080_scrot.png" alt="2010-01-01-000950_1920x1080_scrot" /></a>
Linux内核的amba lcd控制器使用clcd_panel结构体表示一个LCD屏的硬件参数:
/* include/linux/fb.h */
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;
};
/* include/linux/amba/clcd.h */
struct clcd_panel {
struct fb_videomode     mode;
signed short          width;     /* width in mm */
signed short          height;     /* height in mm */
u32                       tim2;
u32                       tim3;
u32                        cntl;
unsigned int             bpp:8,
fixedtimings:1,
grayscale:1;
unsigned int           connector;
};
可以看出来,里面很重要的是fb_videomode,先科普一下fb_videomode各个参数的意义:
fbset与fb_videomode参数对应计算【转】
 
名称 在数据手册中的简称 中文名 意义 备注
name No 名字 液晶屏名字(可选) No
refresh No 刷新频率 刷新频率(内核中很多例子都赋值为60) No
xres No 行宽 每行的像素个数 No
yres No 屏幕高度 屏幕的行数 No
pixclock No 像素时钟 每个像素时钟周期的长度,单位是皮秒(10的负12次方分之1秒) No
left_margin HBP  (Horizontal Back Porch) 水平后沿 在每行或每列的象素数据开始输出时要插入的象
素时钟周期数
No
right_margin HFP (Horizontal Front Porch ) 水平前沿 在每行或每列的象素结束到LCD 行时钟输出脉冲
之间的象素时钟数
No
upper_margin VBP (Vertical Back Porch) 垂直后沿 在垂直同步周期之后帧开头时的无效行数 No
lower_margin VFP (Vertical Front Porch) 垂直前沿 本帧数据输出结束到下一帧垂直同步周期开始之
前的无效行数
No
hsync_len HPW  (HSYNC plus width) 行同步脉宽 单位:像素时钟周期 也有手册简称为HWH(HSYNC width)
vsync_len VPW (VSYNC width) 垂直同步脉宽 单位:显示一行的时间th 也有手册简称为VWH(VSYNC width)
sync No 同步极性设置 可以根据需要设置FB_SYNC_HOR_HIGH_ACT(水平同步高电平有效)和FB_SYNC_VERT_HIGH_ACT(垂直同步高电平有效) No
vmode No No 在内核中的大多数示例都直接置为FB_VMODE_NONINTERLACED。interlaced的意思是交错[隔行]扫描,电视中使用2:1的交错率, 即每帧分两场,垂直扫描两次,一场扫描奇数行,另一场扫描偶数行。很显然LCD目前不是这种模式。 No
flag No No 目前没有看到用法 No

说明:

(1)Linux对LCD的抽象是以图像为中心的,而LCD手册则以同步信号为中心,所以内核中的left_margin是指在每一行之前(前面自然对应左边)的空闲周期数,而它对应LCD数据手册中的水平后沿(HBP  Horizontal Back Porch),是指在行同步信号之后的空闲周期。参照物不同而已,但是说的是同一个东西。
(2)水平同步信号有时也成为行同步型号,垂直同步信号有人称为场同步信号。
(3)对于LCD的frambuffer抽象模型请参考内核中的文档:Documention/fb/frambuffer.txt。
(4)fb_videomode各个成员的用处是我自己参照内核代码中的include/linux/amba/clcd.h中的clcdfb_decode()函数总结的,不保证护绝对正确。
好了,现在来看个实际的,我先把各个参数的值从内核中打印出来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@ubuntu:~# fbset -a "1920x1080-50"
[   47.631053] new_mode.refresh;      = 50
[   47.631056] new_mode.xres;         = 1920
[   47.631060] new_mode.yres;         = 1080
[   47.631063] new_mode.pixclock;     = 6734
[   47.631067] new_mode.left_margin; = 148
[   47.631070] new_mode.right_margin;= 528
[   47.631074] new_mode.upper_margin;= 36
[   47.631077] new_mode.lower_margin;= 4
[   47.631080] new_mode.hsync_len;   = 44
[   47.631083] new_mode.vsync_len;   = 5
[   47.631086] new_mode.sync;         = 3
[   47.631089] new_mode.vmode;    = 0
[   47.631093] new_mode.flag;         = 32
在看看fbset的值:
1
2
3
4
5
6
7
8
9
10
11
root@ubuntu:~# fbset
 
mode "1920x1080-50"
    # D: 148.500 MHz, H: 56.250 kHz, V: 50.000 Hz
    geometry 1920 1080 1920 1629 32
    timings 6734 148 528 36 4 44 5
    hsync high
    vsync high
    accel true
    rgba 0/0,0/0,0/0,0/0
endmode
下面看看怎么计算的:
pixclock={(xres+left_margin+right_margin+hsync_len) x (yres+upper_margin+lower_margin+vsync_len) x refresh }/1
对应参数看看:
{(1920+148+528+44)x (1080+36 +4+5) x 50}/1
=(2640 x 1125 x 50 )/1
=(2970000×50)/1
=148500000/1
=6.7340067340067340067340067340067e-9 ≈ 6.734
也就是pixclock/1000;

相关文章:

  • 2021-12-22
  • 2022-12-23
  • 2021-09-07
  • 2021-06-23
  • 2021-08-02
  • 2021-04-10
  • 2021-11-30
猜你喜欢
  • 2022-12-23
  • 2021-08-06
  • 2022-12-23
  • 2021-04-30
  • 2022-01-22
  • 2021-12-03
  • 2022-12-23
相关资源
相似解决方案