強勢歸來!
在本系列的(一)到(三)中,我嘗試在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螢幕(約60元)
印刷PCB闆(50元)
購買晶片、阻容和接插件(約50元)
總成本約160元。
如果購買官方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位顯示了,就像官方電路圖中那樣。沒有被eMMC占用,可以使用24位。但下面以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補全,用其他字元會産生錯誤。

大功告成!
因為用的是官方現成的驅動、現成的dtbo檔案,是以我們省了很多事,隻要向eeprom中寫入正确的内容,就能“騙”過系統,讓它“誤以為”我插到BBB上的是官方的LCD cape^^。總之至此已經成功DIY了自己的LCD cape。 使用方法是先把cape插到BBB上,再為BBB供電,系統啟動時會自動檢測eeprom的内容,然後加載的BB-BONE-LCD4-01-00A1.dtbo檔案并配置相應的驅動程式,稍等一會就會在顯示屏上出現Beagleboard的logo。登入之後就能看到linux桌面了。觸摸屏如果不好用的話(可能會有點漂),在usb上連接配接滑鼠也是可以直接用的。
補充
我在制作過程中被卡住兩次,簡單補充一下我的解決過程,以便有人遇到同樣問題被卡可以參考。
第一次是升壓晶片焊接的問題。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背光驅動試試。
下圖是在測試背光。螢幕應該是白色的,角度原因照片裡成了藍色。。