为BBB制作专属自己的cape(四)

强势归来!

在本系列的(一)到(三)中,我尝试在Beaglebone Black上使用MCU接口的LCD模块,因为驱动问题一直没成功,最近我使用RGB接口的LCD模块,参考官方LCD cape的资料自己画板子焊芯片,终于成功了。本文记录一下制作过程和我犯错误的一些地方。

首先强调一下LCD的类型选择。本博客之前转发过一篇博文可以参考,但这里还是要着重说一下MCU接口(也叫80接口)和RGB接口的LCD的区别。如果你也想从淘宝买LCD来为BBB自制屏幕,需要注意不要买宣称的“单片机可驱动”或者“可以用单片机控制”这类LCD,即MCU接口的LCD。它们内置了LCD控制器,需要按照不同控制器的要求输入相应命令来操控LCD。我们的BBB所用的AM3359芯片里面已经有LCD控制器了,所以我们只要买RGB接口,或称“裸的”LCD屏幕即可。另外淘宝上常见的RGB接口的屏幕,最小的也得4.3英寸。如果你想买更小的,可能得花更多的钱买进口的了。


需要准备的东西


一块RGB接口的4.3英寸LCD屏幕(约50元)

印刷PCB板(50元)

购买芯片、阻容和接插件(约50元)

总成本约150元。

如果购买官方LCD4 cape的话,税前价格是¥631.54。所以自制一块还是非常超值的!


电路原理图和PCB设计


官方已经开源,可以到这里下载http://elinux.org/CircuitCo:BeagleBone_LCD4

如果愿意的话,可以直接拿它的PCB设计图去印PCB板。但是它用到了一个BGA封装的芯片74AVC32T245,不利于手工焊接,因此我用了同系列的另一个SOP封装的74AVC20T245代替它。原理图变了,就得自己进行PCB布线了。

我用的4寸LCD接口是40pin的,跟上面这个官方cape的LCD接口一样。大多数厂商生产的40pin RGB接口LCD都能通用的,不必买官方使用的那个屏。

关于接口简单说两点:一是第31个引脚DISEN是LCD显示使能脚,高电平使能。官方电路图中把它接到了BBB的一个IO口上,你也可以把它接到一个开关上。
二是40pin的显示屏都是支持24位色的,RGB各占8个引脚,但BBB的lcd引脚有一些被eMMC占用了,除非你的系统装在micro SD卡上,可以禁用eMMC,否则就只能使用16位显示了,就像官方电路图中那样。

关于缓冲芯片74AVC20T245。从这个芯片的datasheet里看不出这个芯片有啥用,看起来就是把输入信号原样输出了。实际上这个芯片的作用在于,BBB的lcd引脚有一些是在系统启动中被使用的,如果直接把它们接到LCD上,系统就启动不起来了。这个缓冲芯片起到了隔离作用。

关于EEPROM电路请参考本系列的第(一)篇文章。这里提示一点,如果你按照官方cape的原理图做出来发现eeprom写不进东西,是因为你没有把WP(写保护)引脚拉低。官方原理图在这里有一个test point,写入内容时把它接地,写完以后去掉接地就能防止再次写入了。当然如果你像我一样图省事,或者不确定今后会不会随时修改eeprom内容,那把WP引脚悬空就行了。

关于5V供电。如果你用USB连接电脑来供电,那么要使用BBB上的SYS_5V(P9.7, P9.8)作为5V电源,如果使用外接5V电源供电,就要使用BBB上的VDD_5V(P9.5, P9.6)。额外说一句,如果要用电池给BBB供电,应该把稳压后的5V电供到VDD_5V接口上。

注意电感和电容的封装类型。特别是背光电路里的电感,是要在升压电路中储能的,不能用普通电感。

这里最难手工焊接的应该就是升压芯片TPS61080了,是QFN封装的。可以到网上搜一下焊接技巧。我的建议是首先要配备一个好用的烙铁。

官方原理图中有大量元件被标记为“DNI”,是do not install的意思,主要是测试用的,如果你只是想做一个可以使用的LCD屏,那么抄电路原理图的时候忽略所有的标有DNI的元件就可以了。读图的时候同样要忽略掉它们来理解电路。

EEPROM的读写


cape的EEPROM必须连接到I2C2_SCL和I2C2_SDA引脚上才能在启动时被识别(在系统中看到的是i2c-1)。下面先介绍如何进行读写,再介绍该写入什么东西。

首先确定eeprom的地址,由A0,A1,A2三个引脚的电平确定,请参考本系列文章(一)。比如我把A0,A1接地,A2拉高,地址就是0x54。

$ cd /sys/bus/i2c/devices/1-0054/  #到eeprom目录中
$ cat eeprom | hexdump -C  #读取eeprom内容并以字符形式显示
$ echo -e "\xaa\x55\x33\xeeA1Beaglebone LCD4 Cape\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000A1BeagleboardToys\x00BB-BONE-LCD4-01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" > eeprom  #写入内容
$ cat eeprom | hexdump -C  #确认是否写入成功

其中\x开头的字符代表按ASCII码值写入。
写入内容时,要按照SRM里的标准(如下图),最重要的是要把头6个字节\xaa\x55\x33\xeeA1以及后面的版本号00A1和要调用的dtbo文件名BB-BONE-LCD4-01写对,其他的比如Board Name、Number of Pins什么的都无所谓。空余的地方必须用\x00补全,用其他字符会产生错误。

为BBB制作专属自己的cape(四)


大功告成!


因为用的是官方现成的驱动、现成的dtbo文件,所以我们省了很多事,只要向eeprom中写入正确的内容,就能“骗”过系统,让它“误以为”我插到BBB上的是官方的LCD cape^^。总之至此已经成功DIY了自己的LCD cape。
使用方法是先把cape插到BBB上,再为BBB供电,系统启动时会自动检测eeprom的内容,然后加载的BB-BONE-LCD4-01-00A1.dtbo文件并配置相应的驱动程序,稍等一会就会在显示屏上出现Beagleboard的logo。登录之后就能看到linux桌面了。触摸屏如果不好用的话(可能会有点漂),在usb上连接鼠标也是可以直接用的。
为BBB制作专属自己的cape(四)


补充


我在制作过程中被卡住两次,简单补充一下我的解决过程,以便有人遇到同样问题被卡可以参考。

第一次是升压芯片焊接的问题。QFN封装的芯片不容易用眼睛确认是否有虚焊或短路,只能用其输出的表现来判断。
短路检测用万用表就行。需要注意的是这里LED-引脚用了一个2欧姆电阻接地,这点电阻在万用表看来是短路的,别被它误导了。
虚焊的话最直接的表现就是输出电压不够,LED+和LED-之间应该输出一个20多V的电压才对。

第二次被卡是忘记把前面说的DISEN引脚拉高,导致背光很正常,但屏幕一片白,什么也没有。
我想说的是,如果你遇到类似问题,用fbset命令测试,输出是
mode "480x272-0"
	# D: 0.000 MHz, H: 0.000 kHz, V: 0.000 Hz
	geometry 480 272 480 272 16
	timings 0 0 0 0 0 0 0
	accel true
	rgba 5/11,6/5,5/0,0/0
endmode
里面频率都是0,这不代表驱动有问题,我的显示屏正常工作时还是这样。

如果你dmesg了一下,发现有如下输出
tilcdc 4830e000.fb: timeout waiting for framedone
同样不代表驱动有问题。

如果屏幕能亮,但是没有内容显示,首先可以检测背光驱动是否正常。方法是
$ cd /sys/devices/ocp.2/backlight.10/backlight/backlight.10
$ echo 10 > brightness
$ echo 100 > brightness
如果背光亮度变了,说明背光驱动工作正常。

检测驱动是否正常工作的另一个办法是用示波器。一般实验室的数字示波器都是100MHz的,显示屏的时钟是9MHz,如果直接检测的话,方波会畸变成三角波。这时记得把示波器手柄上的x10开关打开。

如果你的eeprom电路设计错了,或者没有eeprom,那也可以测试LCD。首先要通过修改uEnv.txt禁用HDMI的自动启动(参考本系列之(二)),在系统启动完毕以后用
$ echo BB-BONE-LCD4-01 > /sys/devices/bone_capemgr.*/slots
的办法手动加载cape,如果LCD正常的话,会显示出与串口连接BBB一样的Angstrom logo和登录界面,等待你输入用户名和密码。


思路拓展:有时候我们想得到一个PWM输出(比如控制电机、舵机),但又没有合适的驱动,不妨使用LCD背光驱动试试。

为BBB制作专属自己的cape(四)


为BBB制作专属自己的cape(四)


下图是在测试背光。屏幕应该是白色的,角度原因照片里成了蓝色。。
为BBB制作专属自己的cape(四)







为BBB制作专属自己的cape(四)

上一篇:Guzz源码分析(四) guzz加载config-server信息


下一篇:iOS开发-模式视图