AM335X作为一颗高性价比的cortex-a8芯片,其广泛应用的一个应用就是人机界面。而在人机界面中,LCD接口是必不可少的。
这里,我们就讨论一下关于LCD接口设计的一些问题。
首先,介绍下AM335X的LCD controller的一些feature。详细的feature,大家可以参考AM335X technical reference manual(TRM) 的第13章节。
简单来说,其大致概况一下特点:
(1)有24条LCD数据线,所以支持RGB888,RGB565。当然也支持RGB666。不支持LVDS(TI有高性价比的RGB转LVDS的芯片可以配套)
(2)TRM上写的最大分辨率支持2048×2048。而实际受限于总线带宽等因素,最大分辨率为1366×768。
(3)支持Active mode(TFT屏)和passive mode(STN屏)
接下来以目前常用的TFT屏进行讨论。
TFT屏:
(1)目前常见的屏有4.3寸,5寸,7寸,10寸屏,而其模式通常有sync模式,DE模式。(有些屏sync和DE模式都兼容,通过管脚进行配置选择)
(2)驱动电路。对于我所了解的常见4.3寸屏来说,其驱动比较简单。只需要3.3v或5v作为LCD供电。同时搭配背光电路即可。
而7寸屏则会复杂一些。基本上看到常用的7寸屏,都需要偏置电路进行驱动。 其偏置(bias)电路会提供多种电压,如AVDD(10v),VDDG(18V),VEFG(-7V),VCOM(6V)。这些电压要求都可以在LCD屏的数据手册中查阅到。
对于上述bias和backlight电路,有如下TI的方案可供推荐。
TPS61040 Low cost biasTPS65150 high cost performance
tps61165 backlight
(3)LCD信号
典型的,除了RGB或者BGR信号排列外,sync模式下还有会vsync、hsync、PCLK、EN, DE 模式下会有PCLK, DE信号。
在此,需要有两个问题需要注意:
1)由于AM335X LCD部分的bug,此在勘误表中有列出。其RGB888和RG565两种模式下,LCD信号线的分组不同。设计时需要注意。
2)如果需要RGB666的模式,此时可以设置LCD为RGB888模式,硬件设计时,RGB的低2位接地。
驱动:
由于TI SDK已更新至SDK08.00(内含的Linux为3.14)。且今后会长期维持在此版本(LTS)。所以建议新设计的朋友使用该版本。
该版本下linux使用device-tree进行板级配置。其中LCD部分的配置比较简单。
配置可以参考linux/arch/arm/boot/dts/am335x-evm.dts中的LCD配置(7寸屏,800×480)
或者参考该路径下的am335x-evmsk.dts(4.3寸屏,480×272)
配置主要包含两部分:
1)参数部分:具体参考可以直接在LCD屏的数据手册上查阅到。
2)pinmux部分。
以下列出am335x-evm.dts中关于LCD的部分供参考。
lcd_pins_default: lcd_pins_default {
pinctrl-single,pins = <
0x20 0x01 /* gpmc_ad8.lcd_data16, OUTPUT | MODE1 */
0x24 0x01 /* gpmc_ad9.lcd_data17, OUTPUT | MODE1 */
0x28 0x01 /* gpmc_ad10.lcd_data18, OUTPUT | MODE1 */
0x2c 0x01 /* gpmc_ad11.lcd_data19, OUTPUT | MODE1 */
0x30 0x01 /* gpmc_ad12.lcd_data20, OUTPUT | MODE1 */
0x34 0x01 /* gpmc_ad13.lcd_data21, OUTPUT | MODE1 */
0x38 0x01 /* gpmc_ad14.lcd_data22, OUTPUT | MODE1 */
0x3c 0x01 /* gpmc_ad15.lcd_data23, OUTPUT | MODE1 */
0xa0 0x00 /* lcd_data0.lcd_data0, OUTPUT | MODE0 */
0xa4 0x00 /* lcd_data1.lcd_data1, OUTPUT | MODE0 */
0xa8 0x00 /* lcd_data2.lcd_data2, OUTPUT | MODE0 */
0xac 0x00 /* lcd_data3.lcd_data3, OUTPUT | MODE0 */
0xb0 0x00 /* lcd_data4.lcd_data4, OUTPUT | MODE0 */
0xb4 0x00 /* lcd_data5.lcd_data5, OUTPUT | MODE0 */
0xb8 0x00 /* lcd_data6.lcd_data6, OUTPUT | MODE0 */
0xbc 0x00 /* lcd_data7.lcd_data7, OUTPUT | MODE0 */
0xc0 0x00 /* lcd_data8.lcd_data8, OUTPUT | MODE0 */
0xc4 0x00 /* lcd_data9.lcd_data9, OUTPUT | MODE0 */
0xc8 0x00 /* lcd_data10.lcd_data10, OUTPUT | MODE0 */
0xcc 0x00 /* lcd_data11.lcd_data11, OUTPUT | MODE0 */
0xd0 0x00 /* lcd_data12.lcd_data12, OUTPUT | MODE0 */
0xd4 0x00 /* lcd_data13.lcd_data13, OUTPUT | MODE0 */
0xd8 0x00 /* lcd_data14.lcd_data14, OUTPUT | MODE0 */
0xdc 0x00 /* lcd_data15.lcd_data15, OUTPUT | MODE0 */
0xe0 0x00 /* lcd_vsync.lcd_vsync, OUTPUT | MODE0 */
0xe4 0x00 /* lcd_hsync.lcd_hsync, OUTPUT | MODE0 */
0xe8 0x00 /* lcd_pclk.lcd_pclk, OUTPUT | MODE0 */
0xec 0x00 /* lcd_ac_bias_en.lcd_ac_bias_en, OUTPUT | MODE0 */
>;
};
panel {
compatible = "ti,tilcdc,panel";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&lcd_pins_default>;
panel-info {
ac-bias = <255>;
ac-bias-intrpt = <0>;
dma-burst-sz = <16>;
bpp = <32>;
fdd = <0x80>;
sync-edge = <0>;
sync-ctrl = <1>;
raster-order = <0>;
fifo-th = <0>;
};
display-timings {
800x480p62 {
clock-frequency = <30000000>;
hactive = <800>;
vactive = <480>;
hfront-porch = <39>;
hback-porch = <39>;
hsync-len = <47>;
vback-porch = <29>;
vfront-porch = <13>;
vsync-len = <2>;
hsync-active = <1>;
vsync-active = <1>;
};
};
};
leo chen:
hfront-porch = <39>;hback-porch = <39>;hsync-len = <47>;vback-porch = <29>;vfront-porch = <13>;vsync-len = <2>;hsync-active = <1>;vsync-active = <1>;
对这几个参数的配置很迷糊
LCD手册上都没有明确给出,有的时候全靠猜
Steven Liu1:
回复 leo chen:
这几个参数的配置要根据LCD屏幕的手册来进行的。
我帮客户配的时候,有些屏幕的手册上确实给的很模糊,不过至少还是会给消影timing的总时间,所以保证前后消影总和在允许范围内,剩下的只能实测了。
zeming chen:
请问,在RG565模式下,如何做RGB to LVDS的转接,帮忙推荐下转接芯片。
lu wei:
请问3.1.1里面的两张图在哪个手册里,我从官网下载的5000页的手册里面没有找到这两张图