為BBB製作專屬自己的cape(一)

來源:互聯網
上載者:User

最新更新請見http://blog.csdn.net/wyt2013/article/details/18228095

本文將以製作“LCD顯示屏cape”為例記錄一下製作Beaglebone Black的cape的過程。目前還沒有做完,遇到的困難比想象多得多。。。不過還是先把前面解決的問題和注意事項記錄一下吧~ 為什麼要製作cape。

cape是Beaglebone官方所稱的硬體插接外設的統稱(完全沒有概念的同學可以到 http://elinux.org/Beagleboard:BeagleBone_Capes 這裡來看一下)。使用cape的好處是可以把硬體外設模組化。比如今天我想實現某個功能,就插上相應的cape,明天想換個功能,就插上另一個cape。一旦cape做好,今後就無需再為驅動和硬體問題煩心了。BBB的一大優點就是介面多,而且為BBB定製的Angstrom Linux系統也有很多特性方便了我們製作和使用cape。
我的目標是給BBB添加一個LCD顯示屏。雖然官方有賣現成的LCD cape,但買回來插上就完事了,感覺過於easy,少了很多樂趣。剛好我手頭有一個購買ALIENTEK STM32開發板時一起買的2.4“ TFT LCD觸控螢幕,我決定就用它改造了。OK,我們馬上開始吧。
需要準備的東西
除了LCD,還需要準備 麵包板、杜邦線、若干阻值在2K到7K之間的電阻和一個eeprom晶片。(我本來想用ALIENTEK STM32開發板上帶的24C02 EEPROM,可是由於一些奇怪的不能用) eeprom是每個cape上必備的東西。假設你有很多個cape,分別插到BBB上,那麼BBB怎麼區分你插上的是哪個cape,該載入什麼驅動呢。就是靠存在eeprom裡的資訊來確定的。 ALIENTEK的LCD模組只能用80並口模式,接線更少的SPI模式它竟然不支援。。好吧,只能用杜邦線串連16跟並口線了。。所以要多準備點杜邦線。
電阻是做eeprom i2c介面的上拉電阻使用的。
先說說cape的工作原理
Angstrom Linux使用device tree來 綁定硬體和驅動以及 設定晶片引腳的複用功能,系統核心裡存有一個預設的device tree(尾碼名是dtb),啟動時首先會載入它。然後使用 device tree overlay的方式,在這個預設device tree的基礎上” 覆蓋“(overlay)上新的硬體和驅動或者remap引腳功能,要用到的覆蓋檔案的尾碼名是dtbo。
BBB內建了很多的dtbo檔案,放在 /lib/firmare/ 目錄下,大部分dtbo檔案都對應著官方支援的cape(就是前面那個網址裡的那些cape,正因為系統裡已經有了對應的dtbo檔案,所以我們買來cape以後才能插上就能用,我們自己要做cape,就只能自己寫dtbo檔案了)。
接著說系統啟動。載入了預設的dtb以後,系統就開始掃描是否有要載入的overlay。系統預設要載入的有兩個overlay,對應著板子上的eMMC晶片和HDMI處理晶片。如果沒有外接cape的話,就把這兩個overlay載入,然後這一步就過去了。不過下面要說一下有外接cape的情況。
說有外接cape,其實不如說有外接eeprom。如果發現有eeprom,並且裡面存的資訊符合cape要求的格式,那麼系統會首先載入這個eeprom裡要求載入的overlay(如果同時插了幾個eeprom,就依次載入對應的overlay),然後再去載入eMMC和HDMI的overlay(注意載入順序)。載入完overlay以後,系統再按照overlay的指示進行驅動綁定和引腳複用,然後再繼續其他的啟動項目。
啟動完成以後,硬體和驅動就完美匹配好了,晶片引腳功能也正確了。
(順便說一句,我是怎麼知道這些的。輸入dmesg便知。)
幾個細節
1、BBB最多隻支援同時插 4個eeprom,它們的地址必須互不相同。
2、 eeprom的地址必須在0x54到0x57之間,否則系統不會載入。科普一下:不管什麼牌子的eeprom晶片,它們的地址都是一樣的,高4位是1010,低3位對應著晶片的A2,A1,A0這3個引腳的電平(有的晶片只有A1和A0),所以通過外接電路就能改變eeprom的地址。也就是說eeprom的地址只可能是0x50到0x57這8種,如果A2保持高電平,那麼就只有0x54到0x57這4個地址可用了(這就是SRM(官方參考手冊)裡eeprom電路中把A2接高電平的原因)。
另外,似乎所有8個引腳的eeprom,它們的引腳布局也都是一樣的。(我今天買回來一個24C256的eeprom,一看上面印的標號完全不知道是啥,網上也搜不到。我就按照其他牌子的引腳接上,發現果然能用。。)
3、前面說如果一次插入多個eeprom,會依次讀取之。準確來說,讀取順序就是從0x54到0x57的順序。
為什麼如此強調overlay的載入順序呢。因為 一旦前面載入的overlay佔用了某些片上資源,其他overlay就不能再用了。比如我要做的LCD使用的引腳跟預設載入的HDMI用的引腳是有重疊的,當系統啟動時首先載入了LCD的overlay,那麼HDMI就不能再載入了。
4、eeprom必須串連到BBB的 I2C2_SCL和I2C2_SDA引腳上(在系統中看到的是i2c-1)。因為I2C2這兩個引腳的預設功能就是i2c功能。這也告訴我們,程式中盡量不要永久改變這兩個引腳的功能複用,否則就沒法載入cape了。
5、由上述可以看到,cape是在系統啟動時候載入的,所以必須 先插好cape,再給BBB通電。 但是。對於LCD來說,因為它用到的引腳中有些是與系統啟動相關的,所以如果不做額外軟體處理的話,LCD模組只能在系統啟動完以後才允許裝上,否則系統無法啟動(具體表現就是電源燈亮了,4個user led一直不亮)。但是eeprom顯然必須在上電前就連好。 這就是官方LCD cape電路原理圖中buffer晶片(74AVC32T245)的作用,看起來這個晶片的輸入和輸出是完全相同的,沒什麼作用,可是它能防止啟動前那些LCD引腳電平不穩定。
6、插一句,系統運行時用 echo *** > $SLOTS 來載入虛擬cape時如果遇到 echo: write error: File exists 的提示,不代表這個cape已經載入,而是某些硬體資源已經被佔用了的意思。所以系統啟動以後你是無法載入與LCD有關的cape的,因為引腳已經被HDMI佔用了。
編寫自己的overlay(dtbo)
dtbo檔案是用dts檔案編譯而成的(請看我之前的日誌),我簡要說一下怎麼寫與某個裝置相關的dts檔案。
注意,我的假設是需要的驅動都已經裝好在系統中了。否則的話,請自行想辦法。其實BBB定製的Angstrom系統內建驅動有很多,我手邊的晶片都能找到對應的驅動。一般驅動都會帶說明文檔,特別是關於如何寫dts的文檔,幾乎都有的。你只需要按照裡面的例子,結合BBB現有的dts檔案(/lib/firmware目錄下),自行修改就可以了。 BBB定製的Angstrom系統源碼在這裡下載https://github.com/beagleboard/kernel。你需要一個案頭linux系統(或者mac os)來解壓和下載kernel檔案,加起來大約700MB吧好像,下載挺慢的,我下了一晚上。。但這是居家必備的東西,果斷下。
記錄幾個dts書寫的注意事項:
1、 檔案名稱必須是 boardname-version.dts 的形式,比如 BB-BONE-LCD4-01-00A0.dts。這裡面BB-BONE-LCD4-01就是boardname,00A0就是version號。(其實dts的名字無所謂了。。關鍵是編譯出來的dtbo名字必須是它,為了統一,就都這麼規定吧)。
2、 version必須是00AX的形式,X從0開始按版本依次增加,而且, 想命名00A1,必須有00A0的存在才行。不能跨越版本。
3、dts檔案裡面會有part-number和version這兩項, 其內容必須跟檔案名稱相符。part-number就是boardname。
實際上,系統啟動讀取eeprom時,就是要讀取裡面的boardname和version這兩個內容,然後尋找有沒有對應的dtbo檔案。
如何編譯dts為dtbo檔案請看我之前的日誌。編譯完的 dtbo檔案必須放到 /lib/firmware/ 目錄中才可以。(實際上,我用的3.8.13版系統(可輸入 uname -r 查看系統版本)似乎還有bug,自己寫的dtbo檔案,即便放到指定目錄中,系統還是沒法自動載入。。後面的日誌裡我再解決這個問題。)
最後說一下,我用的dts檔案是在 /lib/firmware/BB-BONE-LCD4-01-00A1.dts 的基礎上改的。(其實基本什麼都沒改,就是把名字和版本號碼改了一下。裡面lcd有關的參數我還不曉得如何改。)
硬體串連
eeprom的電路就不詳述了,電路在SRM裡可以找到。LCD模組的串連必須跟device tree overlay裡描述的相符,所以就按照BB-BONE-LCD4-01-00A1.dts裡寫的引腳來串連了。需要注意的是,經過查閱TI的AM335x手冊,引腳有如下對應關係:
lcd_vsync <-> RS lcd_hsync <-> WR
lcd_pclk <-> RD
lcd_ac_bias_en <-> CS
gpio3_19 <-> RST
ehrpwm1a <-> BL_CTR


剩下的就是電源、地線和16跟並口線了。注意BL_CDD連的是5V。並口線接到BBB的LCD_DATA_[0-16]引腳上(注意從LCD_DATA_10開始,引腳順序就變了)。圖中T開頭的引腳都是與觸摸功能有關的,暫時不連。
BB-BONE-LCD4-01-00A1.dts裡還有5個功能按鍵和1個指示燈,我暫時不需要這些,就不管它們了。
原代碼如下:

/* state the resources this cape uses */exclusive-use =/* the pin header uses */"P8.45",/* lcd: lcd_data0 */"P8.46",/* lcd: lcd_data1 */"P8.43",/* lcd: lcd_data2 */"P8.44",/* lcd: lcd_data3 */"P8.41",/* lcd: lcd_data4 */"P8.42",/* lcd: lcd_data5 */"P8.39",/* lcd: lcd_data6 */"P8.40",/* lcd: lcd_data7 */"P8.37",/* lcd: lcd_data8 */"P8.38",/* lcd: lcd_data9 */"P8.36",/* lcd: lcd_data10 */"P8.34",/* lcd: lcd_data11 */"P8.35",/* lcd: lcd_data12 */"P8.33",/* lcd: lcd_data13 */"P8.31",/* lcd: lcd_data14 */"P8.32",/* lcd: lcd_data15 */"P8.27",/* lcd: lcd_vsync */ //rs"P8.29",/* lcd: lcd_hsync */ //wr"P8.28",/* lcd: lcd_pclk */ //rd"P8.30",/* lcd: lcd_ac_bias_en */ //cs"P9.27",/* lcd: gpio3_19 */ //rst"P9.12",/* led: gpio1_28 */ //led"P9.14",/* pwm: ehrpwm1a */ //bl_ctr"P9.15",/* keys: gpio1_16 */"P9.23",/* keys: gpio1_17 */"P9.16",/* keys: gpio1_19 */"P9.21",/* keys: gpio0_3 *///...





================================================== 本篇先寫這麼多,在後面日誌裡我會繼續寫如何向eeprom裡寫東西,寫入格式是什麼,如何利用sysfs和procfs查錯和控制LCD螢幕等內容。

最後再附上dmesg系統啟動時的資訊中與cape有關的部分, 從中可以驗證很多我剛剛寫的東西。我用###號標註在對應行的後面。
[    0.250231] bone-capemgr bone_capemgr.8: Baseboard: 'A335BNLT,0A5C,3513BBBK2728'
[    0.250272] bone-capemgr bone_capemgr.8: compatible-baseboard=ti,beaglebone-black
[    0.281252] bone-capemgr bone_capemgr.8: slot #0: No cape found###可以看到最多可接4個cape。我的eeprom地址是0x57,是4個允許地址的最後一個,所以載入到了3號slot裡。
[    0.318358] bone-capemgr bone_capemgr.8: slot #1: No cape found
[    0.355467] bone-capemgr bone_capemgr.8: slot #2: No cape found
[    0.385730] bone-capemgr bone_capemgr.8: slot #3: 'Alfred,00A1,TJU,BB-BONE-LCD4-01'###這就是從eeprom裡讀取的未經處理資料
[    0.385899] bone-capemgr bone_capemgr.8: slot #4: specific override
[    0.385940] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 4
[    0.385968] bone-capemgr bone_capemgr.8: slot #4: 'Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G'###預設載入eMMC cape
[    0.386100] bone-capemgr bone_capemgr.8: slot #5: specific override
[    0.386136] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 5
[    0.386164] bone-capemgr bone_capemgr.8: slot #5: 'Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI'###預設載入HDMI cape之一
[    0.386312] bone-capemgr bone_capemgr.8: slot #6: specific override
[    0.386347] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 6
[    0.386375] bone-capemgr bone_capemgr.8: slot #6: 'Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN'###預設載入HDMI cape之二
[    0.386927] bone-capemgr bone_capemgr.8: loader: before slot-3 BB-BONE-LCD4-01:00A1 (prio 0)###從prio優先順序可以看出,cape比預設的兩個優先順序要高。
[    0.386956] bone-capemgr bone_capemgr.8: loader: check slot-3 BB-BONE-LCD4-01:00A1 (prio 0)
[    0.387091] bone-capemgr bone_capemgr.8: loader: before slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[    0.387116] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[    0.387242] bone-capemgr bone_capemgr.8: loader: before slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[    0.387267] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[    0.387328] bone-capemgr bone_capemgr.8: initialized OK.###前面檢測好了要載入哪些cape,並確定了載入順序,下面開始載入
[    0.389325] OneNAND driver initializing
[    0.390678] bone-capemgr bone_capemgr.8: loader: after slot-3 BB-BONE-LCD4-01:00A1 (prio 0)
[    0.390714] bone-capemgr bone_capemgr.8: slot #3: Requesting part number/version based 'BB-BONE-LCD4-01-00A1.dtbo###根據eeprom的資料產生了要載入的dtbo的名字,所以檔案名稱才如此重要。
[    0.390745] bone-capemgr bone_capemgr.8: slot #3: Requesting firmware 'BB-BONE-LCD4-01-00A1.dtbo' for board-name 'Alfred', version '00A1'
[    0.390778] bone-capemgr bone_capemgr.8: slot #3: dtbo 'BB-BONE-LCD4-01-00A1.dtbo' loaded; converting to live tree###讀取完dtbo檔案,把資訊寫入裝置樹中
[    0.391665] bone-capemgr bone_capemgr.8: slot #3: #4 overlays
[    0.392824] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[    0.392876] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[    0.393619] ehrpwm 48302200.ehrpwm: unable to select pin group
[    0.396508] bone-capemgr bone_capemgr.8: loader: before slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[    0.396539] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[    0.396569] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[    0.396905] usbcore: registered new interface driver asix###綁定 BB-BONE-LCD4-01-00A1.dtbo 裡涉及到的各種驅動
[    0.397027] usbcore: registered new interface driver cdc_ether
[    0.397149] usbcore: registered new interface driver smsc95xx
[    0.397239] usbcore: registered new interface driver net1080
[    0.397329] usbcore: registered new interface driver cdc_subset
[    0.397433] usbcore: registered new interface driver zaurus
[    0.397597] usbcore: registered new interface driver cdc_ncm
[    0.398492] usbcore: registered new interface driver cdc_acm
[    0.398510] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[    0.398524] Initializing USB Mass Storage driver...
…… ###綁定了好多驅動,略掉……
[    0.404045] bone-capemgr bone_capemgr.8: slot #3: Applied #4 overlays.###3號slot處理完了,開始處理4號slot
[    0.404071] bone-capemgr bone_capemgr.8: loader: done slot-3 BB-BONE-LCD4-01:00A1 (prio 0)
[    0.404158] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[    0.404203] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[    0.404231] bone-capemgr bone_capemgr.8: loader: after slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[    0.404326] bone-capemgr bone_capemgr.8: slot #5: Requesting firmware 'cape-boneblack-hdmi-00A0.dtbo' for board-name 'Bone-Black-HDMI', version '00A0'
[    0.404369] bone-capemgr bone_capemgr.8: slot #5: dtbo 'cape-boneblack-hdmi-00A0.dtbo' loaded; converting to live tree
[    0.405239] bone-capemgr bone_capemgr.8: slot #5: BB-BONELT-HDMI conflict P8.45 (#3:BB-BONE-LCD4-01)###與3號發生資源衝突,所以載入失敗。
[    0.414850] bone-capemgr bone_capemgr.8: slot #5: Failed verification
[    0.421627] bone-capemgr bone_capemgr.8: loader: failed to load slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[    0.431144] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[    0.431174] bone-capemgr bone_capemgr.8: loader: after slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[    0.431209] bone-capemgr bone_capemgr.8: slot #4: Requesting firmware 'cape-bone-2g-emmc1.dtbo' for board-name 'Bone-LT-eMMC-2G', version '00A0'
[    0.431235] bone-capemgr bone_capemgr.8: slot #4: dtbo 'cape-bone-2g-emmc1.dtbo' loaded; converting to live tree
[    0.432641] bone-capemgr bone_capemgr.8: slot #4: #2 overlays
[    0.433438] bone-capemgr bone_capemgr.8: slot #4: Applied #2 overlays.
[    0.433466] bone-capemgr bone_capemgr.8: loader: done slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[    0.433670] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[    0.433704] bone-capemgr bone_capemgr.8: loader: after slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[    0.433744] bone-capemgr bone_capemgr.8: slot #6: Requesting firmware 'cape-boneblack-hdmin-00A0.dtbo' for board-name 'Bone-Black-HDMIN', version '00A0'
[    0.433780] bone-capemgr bone_capemgr.8: slot #6: dtbo 'cape-boneblack-hdmin-00A0.dtbo' loaded; converting to live tree
[    0.434078] bone-capemgr bone_capemgr.8: slot #6: BB-BONELT-HDMIN conflict P8.45 (#3:BB-BONE-LCD4-01)###同樣與3號衝突,載入失敗
[    0.443794] bone-capemgr bone_capemgr.8: slot #6: Failed verification
[    0.450574] bone-capemgr bone_capemgr.8: loader: failed to load slot-6 BB-BONELT-HDMIN:00A0 (prio 2)





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.