聊聊Beaglebone Black的cape和device tree overlay和dtc命令【轉】

本文轉載自:https://blog.csdn.net/wyt2013/article/details/16846171node

本文是我早期寫的,語言略混亂。請直接看我最新整理的,適用於初學者的文章《使用BBB的device tree和cape(從新整理版)》linux

咱們知道beagleboard官網上有一些官方的硬件外設,好比lcd顯示屏之類的,他們管這些外設叫作cape。其實這裏是我理解狹隘了,應該說只要是修改了芯片引腳功能,或佔用了空閒的引腳的東西,均可以叫作cape。好比以前咱們提到的開啓某些引腳的AD轉換功能,其實也是給設備添加了一個virtual cape。Beaglebone Black中用一個叫作capemgr的軟件管理全部的cape,不論它是實實在在的擴展板,仍是虛擬的cape。這個軟件的目錄是redis

/sys/devices/bone_capemgr.*/(這裏的*是一個每次系統啓動可能會不同的數字(與啓動順序有關))ide

若是你看過個人博客,也許還會記得咱們加載device tree overlay時打開了一個文件,正是這個目錄下的slots文件。slots文件就是capemgr這個軟件的對外接口。slot這個單詞是「插槽」的意思,看,很形象吧!我要插上一個cape,就向這個「插槽」裏「插入」(echo)相應的設備。echo這個命令的含義是「向標準設備輸出」嘛。另外,.dtbo文件只有放到/lib/firmware目錄下才能被使用。this

還記得咱們第一次打開slots文件看到了什麼嗎?.net

# cat /sys/devices/bone_capemgr.*/slots
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
這裏前4項爲何是空的呢?它們是給那些有EEPROM的實體cape預留的位置。經過實體cape上的開關,能夠達到咱們用 echo something > $SLOTS 語句同樣的效果。不難看出,這樣的實體cape最多隻能插4個。日誌

4和5這兩項則是系統已經加載的兩個virtual cape,由於eMMC和HDMI確實須要佔用一些引腳,因此根據前面的定義,它們也是cape。blog

其實device tree overlay的做用之一是將設備和驅動進行綁定(前提是驅動或驅動模塊已經存在於內核中),只不過相比從前那種從新編譯內核的方式來講,這種方式實在太方便了。接口

 

12.18更新get

關於cat $SLOTS

cat後顯示的內容中,左側的L字母表明是否加載。有時四、5這兩項依然存在,但沒有L字母,則也沒有加載這兩個cape。詳見個人日誌《爲BBB製做專屬本身的cape(二)》中的「系統存在Bug,運行時卸載cape會致使kernel panic」一節。

關於dtc命令
參考個人日誌《使用Beaglebone Black的PRU》前面寫到的「修改系統dtb文件」這一部分操做可知:dtc命令雖然叫作「編譯」,但其做用主要只是轉變一下數據存儲的格式,由人類可閱讀的dts轉成機器識別的dtb或dtbo或者反過來轉換。
實際上由dtb轉換成dts文件後,跟初始dts文件仍是有不一樣的,從這個不一樣也能看出dts文件中什麼內容是不重要的。以BBB自帶的BB-ADC-00A0.dtbo爲例,咱們看一下它轉換回dts文件是什麼樣的。
root@beaglebone:~/tmp# dtc -I dtb -O dts BB-ADC-00A0.dtbo
/dts-v1/;

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
part-number = "BB-ADC";
exclusive-use = "P9.39", "P9.40", "P9.37", "P9.38", "P9.33", "P9.36", "P9.35", "tscadc";

fragment@0 {
target = <0xdeadbeef>;

__overlay__ {
#address-cells = <0x1>;
#size-cells = <0x1>;

tscadc {
compatible = "ti,ti-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <0xdeadbeef>;
interrupts = <0x10>;
ti,hwmods = "adc_tsc";
status = "okay";

adc {
ti,adc-channels = <0x8>;
};
};

helper {
compatible = "bone-iio-helper";
vsense-name = "AIN0", "AIN1", "AIN2", "AIN3", "AIN4", "AIN5", "AIN6", "AIN7";
vsense-scale = <0x1000 0x1000 0x1000 0x1000 0x1000 0x1000 0x1000 0x1000>;
status = "okay";
linux,phandle = <0x1>;
phandle = <0x1>;
};
};
};

__symbols__ {
test_helper = "/fragment@0/__overlay__/helper";
};

__fixups__ {
ocp = "/fragment@0:target:0";
intc = "/fragment@0/__overlay__/tscadc:interrupt-parent:0";
};
};
BB-ADC-00A0.dts原文是這樣的
/*
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/dts-v1/;
/plugin/;

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";

/* identification */
part-number = "BB-ADC";

/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P9.39", /* AIN0 */
"P9.40", /* AIN1 */
"P9.37", /* AIN2 */
"P9.38", /* AIN3 */
"P9.33", /* AIN4 */
"P9.36", /* AIN5 */
"P9.35", /* AIN6 */
/* the hardware IP uses */
"tscadc";

fragment@0 {
target = <&ocp>;
__overlay__ {
/* avoid stupid warning */
#address-cells = <1>;
#size-cells = <1>;

tscadc {
compatible = "ti,ti-tscadc";
reg = <0x44e0d000 0x1000>;

interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

adc {
ti,adc-channels = <0 1 2 3 4 5 6 7>;
};
};

test_helper: helper {
compatible = "bone-iio-helper";
vsense-name = "AIN0", "AIN1", "AIN2", "AIN3", "AIN4", "AIN5", "AIN6", "AIN7";
vsense-scale = <100 100 100 100 100 100 100 100>;
status = "okay";
};
};
};
};
兩者區別請自行比對。
當我想把dts文件轉換成dtbo文件時,出現了錯誤。
root@beaglebone:~/tmp# dtc -I dts -O dtb BB-ADC-00A0.dts
ERROR (phandle_references): Reference to non-existent node or label "ocp"

ERROR (phandle_references): Reference to non-existent node or label "intc"

ERROR: Input tree has errors, aborting (use -f to force output)(加上 -f 也是沒有用的)但若是加上 -@ ,就能夠順利輸出了。這就是device tree overlay和原生device tree的不一樣吧——device tree(好比/boot目錄裏那些dtb文件反編譯出來的dts文件)都是包含從根節點到每一個子節點的所有信息的。而device tree overlay(好比/lib/firmware目錄中的那些)只須要包含要修改的內容便可。至於後綴名dtbo和dtb,彷佛單純是爲了區分兩者,內容格式其實都是同樣的,均可以用dtc命令反編譯成dts文件。

相關文章
相關標籤/搜索