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

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

0_1332308765VvL6

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各个参数的意义:
0_1332308765VvL6
 
名称 在数据手册中的简称 中文名 意义 备注
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;
posted @ 2020-02-15 21:28  Sky&Zhang  阅读(999)  评论(0编辑  收藏  举报