1. N bit的 LCD 指的是什么意思?
我们常常会说18bit 的LCD, 24 bit 的LCD, 是什么意思呢?
18/24 bit 指的是LCD 数据总线的宽度。
如下图RGB的数据总线:
这里写图片描述
搞清楚这个是很简单的,但如果你在配置设备树时遇到这样的情况, 往往很容易混淆:
mxcfb1: fb@0 {
compatible = "fsl,mxc_sdc_fb";
interface_pix_fmt = "RGB666";
default_bpp = <32>;
status = "okay";
};
interface_pix_fmt 指的是什么? default_bpp又指的是什么?
default_bpp:
default_bpp 是指frambuffer 的颜色深度, bit per pixel, 顾名思义, 就是每一个像素由多个bit 表示。 注意, 这是描述的framebuffer 的, 不是LCD HW。
interface_pix_fmt:
interface_pix_fmt 指LCD HW 输出信号格式。如RGB565,RGB888,GRB888,BGR888,RGB666等。顾名思义,interface_pix_fmt 就是一个LCD 接口输出一个像素的格式。
一个18bit的LCD有可能输出RGB666, BGR666,GBR666. 其他依次类推!
framebuffer 的32bpp 的数据是如何转化为接口上的格式的呢?
是由硬件自动转换的。
framebuffer 的RGBA8888 转化为接口的RGB888,是不需要转化的。转化为RGB666/565就得硬件参与转化。
罗嗦了这么多,不过还有一个问题需要注意:就是一个18bit的屏幕,你的接口配置是RGB888呢?还是RGB666呢,还是GRB666 .....
这个要完全看你的HW接法,如果你的HW 工程师按照RGB888 格式接了, 只是把最低位的01两位没有接, 这时LCD 可以正常显示。虽然色深减低了, 但肉眼是没有办法察觉的。这是一种。
另外一种是RGB666的接法,这种接法在有些ARM平台上是和RGB888 的接的pin 完全不一样。如果你的接口还是用RGB24 那一定显示会出问题。
AM335x 平台RGB888和RGB666能兼容。
2. LCD Timing
关于LCD timing 概念介绍,请参照下图:
其解释如下:
Screenshot-2017-11-22 LCD参数解释及计算 - CSDN博客.png
这些参数大都是从LCD datasheet 上查出来的(pixelclock 除外)。hsync_len 和vsync_len 分别是hsync和vsync 同步信号所需要的时间,有些LCD device 会对这两参数指定, 有些没有,可以随意指定。
知道了这些值之后,你需要通过下面的公式得出pixelclock 的值:
F=(left_margin+xres+right_margin+hsync_len) x (upper_margin+yres+lower_margin+vsync_len)x refresh
pixelclock = 1/F
这个公式是你理解这些参数的关键。
了解了这些参数的含义后,我们将会举一个栗子来说明具体的应用。
假设,我们LCD datasheet 给出了下面一段信息:
这幅图中有三种推荐值,min, type,Max。有经验的工程师会告诉你,一般选type,没错,但特殊情况呢?特殊情况有时什么? 有经验的工程师哥哥并没有告诉过我们。
我们刚才描述了pixelclock 的计算方法,但如果你计算出来的pixelclock不符合LCD 时钟源pll 分频范围,这个pixelclock 的时钟仍然不能用。为什么呢?
我们先描述下,pixelclock 的时钟来源,pixelclock不是天上掉下来的,他的来源于为LCD 提供时钟的PLL. pixelclock 是经过该PLL分频得来的。
如果,PLL最大只能分频50MHz,而你的pixelclock需要60MHz的clock, 如此,这是无论如何也办不到。软件只能给你分出他最大的频率50MHz。此时你拿着参数去显示,必定会有问题。
如果遇到这个问题,我们一般该怎么处理:
方案一:
修改该pll的时钟源,使其适应对应的pixelclock,这种方案一般不推荐,因为麻烦,不得以才为之。
方案二:
根据需要调整相应的LCD timing 参数,使对应的pixelclock 满足pll的分频条件。
方案二解答了我们对为什么lcd datasheet 会同时存在min.type.max三组值 的困惑。 其实不只有三组值,你完全可以通过上面那个公式计算出各种你想要的pixelclock。
我们再罗嗦一下上面那张LCD timing 的图:
Period : 指一行像素数目/一列的行数
Active: 就是激活的像素/行,也就是有效的像素数目/有效的行。如果800x600, 那么行有800哥active像素,列有600个active的行。
Blanking:H Blanking=left_margin+right_margin+hsync_len
V Blanking =upper_margin+lower_margin+vsync_len
至此,关于LCD 概念上的东西基本描述完了。希望对你有所帮助!
网友评论