⑴ 如何在linux-3.x內核編譯設備樹
可以讓設備樹文件和內核一起編譯,單獨編譯的化,可以參考下面的文檔:
http://blog.csdn.net/woshigaoyuan/article/details/13996277
⑵ 如何使用dtc編譯設備樹 devicetree
DTS (device tree source)
.dts文件是一種ASCII 文本格式的Device
Tree描述,此文本格式非常人性化,適合人類的閱讀習慣。基本上,在ARM
Linux在,一個.dts文件對應一個ARM的machine,一般放置在內核的arch/arm/boot/dts/目錄。由於一個SoC可能對應多個machine(一個SoC可以對應多個產品和電路板),勢必這些.dts文件需包含許多共同的部分,Linux內核為了簡化,把SoC公用的部分或者多個machine共同的部分一般提煉為.dtsi,類似於C語言的頭文件。其他的machine對應的.dts就include這個.dtsi。譬如,對於VEXPRESS而言,vexpress-v2m.dtsi就被vexpress-v2p-ca9.dts所引用,
vexpress-v2p-ca9.dts有如下一行:
/include/
"vexpress-v2m.dtsi"
當然,和C語言的頭文件類似,.dtsi也可以include其他的.dtsi,譬如幾乎所有的ARM
SoC的.dtsi都引用了skeleton.dtsi。
.dts(或者其include的.dtsi)基本元素即為前文所述的結點和屬性:
[plain] view
plainprint?
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
上述.dts文件並沒有什麼真實的用途,但它基本表徵了一個Device
Tree源文件的結構:
1個root結點"/";
root結點下面含一系列子結點,本例中為"node1" 和
"node2";
結點"node1"下又含有一系列子結點,本例中為"child-node1" 和
"child-node2";
各結點都有一系列屬性。這些屬性可能為空,如"
an-empty-property";可能為字元串,如"a-string-property";可能為字元串數組,如"a-string-list-property";可能為Cells(由u32整數組成),如"second-child-property",可能為二進制數,如"a-byte-data-property"。
下面以一個最簡單的machine為例來看如何寫一個.dts文件。假設此machine的配置如下:
1個雙核ARM
Cortex-A9 32位處理器;
ARM的local bus上的內存映射區域分布了2個串口(分別位於0x101F1000 和
0x101F2000)、GPIO控制器(位於0x101F3000)、SPI控制器(位於0x10170000)、中斷控制器(位於0x10140000)和一個external
bus橋;
External bus橋上又連接了SMC SMC91111
Ethernet(位於0x10100000)、I2C控制器(位於0x10160000)、64MB NOR
Flash(位於0x30000000);
External bus橋上連接的I2C控制器所對應的I2C匯流排上又連接了Maxim
DS1338實時鍾(I2C地址為0x58)。
其對應的.dts文件為:
[plain] view
plainprint?
/ {
compatible = "acme,coyotes-revenge";
#address-cells = <1>;
#size-cells = <1>;
interrupt-parent = <&intc>;cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a9";
reg = <0>;
};
cpu@1 {
compatible = "arm,cortex-a9";
reg = <1>;
};
};serial@101f0000 {
compatible = "arm,pl011";
reg = <0x101f0000 0x1000 >;
interrupts = < 1 0 >;
};serial@101f2000 {
compatible = "arm,pl011";
reg = <0x101f2000 0x1000 >;
interrupts = < 2 0 >;
};gpio@101f3000 {
compatible = "arm,pl061";
reg = <0x101f3000 0x1000
0x101f4000 0x0010>;
interrupts = < 3 0 >;
};intc: interrupt-controller@10140000 {
compatible = "arm,pl190";
reg = <0x10140000 0x1000 >;
interrupt-controller;
#interrupt-cells = <2>;
};spi@10115000 {
compatible = "arm,pl022";
reg = <0x10115000 0x1000 >;
interrupts = < 4 0 >;
};external-bus {
#address-cells = <2>
#size-cells = <1>;
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flashethernet@0,0 {
compatible = "smc,smc91c111";
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};i2c@1,0 {
compatible = "acme,a1234-i2c-bus";
#address-cells = <1>;
#size-cells = <0>;
reg = <1 0 0x1000>;
interrupts = < 6 2 >;
rtc@58 {
compatible = "maxim,ds1338";
reg = <58>;
interrupts = < 7 3 >;
};
};flash@2,0 {
compatible = "samsung,k8f1315ebm", "cfi-flash";
reg = <2 0 0x4000000>;
};
};
};
/ {
compatible = "acme,coyotes-revenge";
#address-cells = <1>;
#size-cells = <1>;
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a9";
reg = <0>;
};
cpu@1 {
compatible = "arm,cortex-a9";
reg = <1>;
};
};
serial@101f0000 {
compatible = "arm,pl011";
reg = <0x101f0000 0x1000 >;
interrupts = < 1 0 >;
};
serial@101f2000 {
compatible = "arm,pl011";
reg = <0x101f2000 0x1000 >;
interrupts = < 2 0 >;
};
gpio@101f3000 {
compatible = "arm,pl061";
reg = <0x101f3000 0x1000
0x101f4000 0x0010>;
interrupts = < 3 0 >;
};
intc: interrupt-controller@10140000 {
compatible = "arm,pl190";
reg = <0x10140000 0x1000 >;
interrupt-controller;
#interrupt-cells = <2>;
};
spi@10115000 {
compatible = "arm,pl022";
reg = <0x10115000 0x1000 >;
interrupts = < 4 0 >;
};
external-bus {
#address-cells = <2>
#size-cells = <1>;
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = "smc,smc91c111";
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};
i2c@1,0 {
compatible = "acme,a1234-i2c-bus";
#address-cells = <1>;
#size-cells = <0>;
reg = <1 0 0x1000>;
interrupts = < 6 2 >;
rtc@58 {
compatible = "maxim,ds1338";
reg = <58>;
interrupts = < 7 3 >;
};
};
flash@2,0 {
compatible = "samsung,k8f1315ebm", "cfi-flash";
reg = <2 0 0x4000000>;
};
};
};
上述.dts文件中,root結點"/"的compatible 屬性compatible =
"acme,coyotes-revenge";定義了系統的名稱,它的組織形式為:<manufacturer>,<model>。Linux內核透過root結點"/"的compatible
屬性即可判斷它啟動的是什麼machine。
在.dts文件的每個設備,都有一個compatible
屬性,compatible屬性用戶驅動和設備的綁定。compatible
屬性是一個字元串的列表,列表中的第一個字元串表徵了結點代表的確切設備,形式為"<manufacturer>,<model>",其後的字元串表徵可兼容的其他設備。可以說前面的是特指,後面的則涵蓋更廣的范圍。如在arch/arm/boot/dts/vexpress-v2m.dtsi中的Flash結點:
[plain] view
plainprint?
flash@0,00000000 {
compatible = "arm,vexpress-flash", "cfi-flash";
reg = <0 0x00000000 0x04000000>,
<1 0x00000000 0x04000000>;
bank-width = <4>;
};
flash@0,00000000 {
compatible = "arm,vexpress-flash", "cfi-flash";
reg = <0 0x00000000 0x04000000>,
<1 0x00000000 0x04000000>;
bank-width = <4>;
};
compatible屬性的第2個字元串"cfi-flash"明顯比第1個字元串"arm,vexpress-flash"涵蓋的范圍更廣。
再比如,Freescale
MPC8349 SoC含一個串口設備,它實現了國家半導體(National Semiconctor)的ns16550
寄存器介面。則MPC8349串口設備的compatible屬性為compatible = "fsl,mpc8349-uart",
"ns16550"。其中,fsl,mpc8349-uart指代了確切的設備, ns16550代表該設備與National Semiconctor
的16550
UART保持了寄存器兼容。
接下來root結點"/"的cpus子結點下面又包含2個cpu子結點,描述了此machine上的2個CPU,並且二者的compatible
屬性為"arm,cortex-a9"。
注意cpus和cpus的2個cpu子結點的命名,它們遵循的組織形式為:<name>[@<unit-address>],<>中的內容是必選項,[]中的則為可選項。name是一個ASCII字元串,用於描述結點對應的設備類型,如3com
Ethernet適配器對應的結點name宜為ethernet,而不是3com509。如果一個結點描述的設備有地址,則應該給出@unit-address。多個相同類型設備結點的name可以一樣,只要unit-address不同即可,如本例中含有cpu@0、cpu@1以及serial@101f0000與serial@101f2000這樣的同名結點。設備的unit-address地址也經常在其對應結點的reg屬性中給出。ePAPR標准給出了結點命名的規范。
⑶ Linux SPI通過設備樹文件添加設備
如上DTS文件片段,SPI Device 節點必須定義在 SPI Master 節點下,其中 compatible 屬性和 reg 屬性,以上 compatible 屬性用於匹配對應的 Driver 程序,reg 屬性用於指定使用的 SPI Master 的編號,SPI 相關設備樹文件識別見下文講解。
匹配設備樹文件在SPI子系統中有兩個地方:在 spi_register_master() 中匹配和在 device register 時通過內核的通知鏈(notifier_block)來調用設備樹匹配相關程序。
在 device register 時,需配置 CONFIG_OF_DYNAMIC 宏以開啟動態匹配才能夠使用設備樹添加設備,該宏在 menuconfig/Device Drivers/Device Tree and Open Firmware support 中開啟,如下圖:
⑷ Jetson Nano 配置40引腳擴展接頭
https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2Fhw_setup_jetson_io.html%23
每個Jetson開發套件均包含40針擴展插頭。許多引腳可以用作GPIO或「特殊功能IO口(SFIO)」,例如I2C,I2S等。40引腳接頭連接器使您可以將Jetson開發人員工具包連接到現成的Raspberry Pi HAT(Hardware Attached on Top),例如Seeed Grove模塊,SparkFun Qwiic產品等。
燒錄系統時,Jetson開發套件上所有I / O的默認配置寫入設備中。要更改L4T 32.3之前的40引腳擴展插頭的引腳配置,您必須使用Pinmux電子表格為相應的平台更新引腳配置,然後將新配置燒錄到開發者套件中。盡管這可能是更新生產系統的適當方法,但開發時仍需要一種更方便的方法來測試不同的引腳配置。
從L4T 32.3版開始,NVIDIA提供了Jetson-IO工具來簡化40針擴展插頭的I / O配置。 Jetson‑IO 是基於Python的工具,可在開發人員工具包上運行並修改Device Tree Blob(DTB)固件,以便開發套件重新啟動後使40針插頭新配置生效。
要啟動Jetson-IO,請在開發人員工具包上輸入以下命令:
啟動Jetson‑IO時,將顯示以下屏幕。此時主屏幕顯示40針接頭當前的配置,並為您提供兩個用於配置I / O的選項:
當您選擇「配置兼容硬體(configure for compatible hardware)」選項時,Jetson‑IO將顯示一些硬體模塊的配置列表。
當前有兩個硬體模塊可供配置:
選擇配置後,Jetson-IO返回主屏幕,主屏幕顯示為針對該配置更新後的40針擴展接頭的圖。
您可以選擇以下操作:
請注意,在更新配置文件之後,您仍然可以將開發人員工具包引導至先前的配置,因為Jetson ‑IO 通過為新配置添加新條目來更新extlinux.conf。先前的配置仍在文件中。引導目標時,引導載入程序使您可以選擇配置(或文件中定義的任何其他配置)。
當您在主屏幕上選擇「配置40針擴展頭」選項時,Jetson-IO將顯示40針頭I / O支持的特殊功能列表。它在括弧中顯示了與功能相關的引腳。
例如,在NVIDIA ®傑特森™納米開發工具包,傑特森-IO顯示的功能列表如下。
有關支持的功能的更多詳細信息,請參閱開發人員套件中的Jetson SoC 技術參考手冊。
您可以根據需要選擇或取消選擇功能。
要接受所選的功能集,請選擇「返回」選項。Jetson‑IO返回主屏幕。它會重新顯示在「 兼容硬體屏幕 」之後顯示的主 屏幕 ,並附加一個條目:
如果您希望從命令行而不是從菜單配置40針擴展頭,NVIDIA提供了一組命令行工具,它們提供相同的功能。以下各節介紹了這些實用程序。
例子
顯示可用硬體模塊配置的列表。
例子
您可以通過為硬體模塊創建設備樹覆蓋(Device Tree overlay)來使用Jetson‑IO支持自定義硬體模塊。以下各節描述了此過程。
要添加對自定義硬體的支持到Jetson‑IO,您必須了解Jetson‑IO如何管理附加硬體。對硬體模塊的支持由設備樹覆蓋文件(.dtbo文件)處理。
硬體模塊的設備樹覆蓋必須定義:
該疊加名稱屬性必須是唯一的名稱,從別人的覆蓋區別。該兼容屬性必須有一個或多個以下的,這取決於Jetson平台的支持。
用戶可以通過輸入以下命令來獲取適用於其Jetson平台的正確兼容字元串。如果您有Jetson Nano開發人員工具包,此命令還將標識PCB版本。
例如,請考慮FE-PI Audio Z V2模塊。目標的/ boot目錄中是名稱與模式匹配的覆蓋文件:
您可以使用fdtmp實用工具檢查覆蓋文件的內容,並查看覆蓋名稱( overlay-name )和兼容屬性( compatible )。例如,在Jetson Nano開發人員工具包上,您可以通過輸入以下命令來顯示這些屬性:
要創建簡單的設備樹覆蓋圖以為Jetson Nano(帶有A02載板和A02模塊)開發人員工具包添加新的自定義屬性,請在目標平台上創建一個名為my-overlay.dts的文件,內容如下:
輸入以下命令以將DTS源文件編譯為覆蓋文件:
將新的覆蓋文件復制到/ boot目錄之後,Jetson‑IO會找到該覆蓋文件並允許您應用它:
如果要為連接到40針擴展接頭連接器的自定義硬體模塊創建覆蓋文件,則最簡單的方法是使用Jetson-IO根據需要配置40針接頭連接器並將配置導出為覆蓋。您可以使用面向菜單的Jetson-IO腳本或關聯的·config-by -...·命令行工具來執行此操作。
例如,要為啟用I2S介面的Jetson Nano(A02)創建覆蓋,請輸入以下命令:
然後,您可以通過輸入此命令將覆蓋圖轉換為設備樹源文件。
您可以根據需要為定製硬體修改生成的設備樹源,並添加硬體模塊所需的任何其他節點和/或屬性。然後,您可以重新編譯設備樹源並將其放置在/ boot /目錄中,以供Jetson‑IO使用:
⑸ 編譯linux內核設備樹文件使用什麼命令
Linux源碼的arch/powerpc/boot/dts/目錄下存放了很多dts文件,可以作為參考文件。另外dtc編譯器在內核專源碼2.6.25版本之後已經被屬包含進去。在2.6.26版本之後,生成blob的簡單規則已經加入makefile,如下命令:
$ make ARCH=powerpc canyonlands.dtb
也可以根據自己的硬體修改好dts文件後,用下面類似命令生成dtb文件。
$ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts > mpc836x_mds.dtb
$ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu
⑹ 怎麼把設備樹燒錄到flash
可以通過碩思閃客把設備樹燒錄到flash。
在碩思閃客菜單中,你可以將下拉菜單應用到程序中,並產生一個閃客菜單,下拉菜單的屬性將會包含在新的閃客菜單中,例如文本、內容、文本類型、鏈接、對象、狀態和提示文本。此外,你可以將樹狀菜單導入到程序中,產生一個閃客菜單,菜單生成器也是如此。
導入魔法菜單,只要點擊界面中的文件:導入魔法菜單文件,就能將魔法菜單導入到閃客菜單中。