背景:根據自己需求更改官方提供設備樹。
設備樹目錄:內核源碼文件內arch/arm/boot/dts/。
- 複製一份源dts。cp arch/arm/boot/dts/imx7d-colibri-eval-v3.dts arch/arm/boot/dts/imx7d-colibri-eval-my-carrier.dts
- 擴展Makefile,加入對新dts的編譯支持。vi arch/arm/boot/dts/Makefile。
- dts修改完成後,使用make dtbs生成新的imx7d-colibri-eval-my-carrier.dtb文件,以供內核加載。
dtb-$(CONFIG_SOC_IMX7D) += \
imx7d-cl-som-imx7.dtb \
imx7d-colibri-aster.dtb \
imx7d-colibri-emmc-aster.dtb \
imx7d-colibri-emmc-eval-v3.dtb \
imx7d-colibri-eval-v3.dtb \
imx7d-nitrogen7.dtb \
imx7d-sbc-imx7.dtb \
imx7s-colibri-aster.dtb \
imx7s-colibri-eval-v3.dtb \
imx7s-warp.dtb \
imx7d-colibri-eval-my-carrier.dtb
要覆蓋屬性,需要使用&字符和標籤來引用該節點。較晚的設備樹條目將覆蓋較早的條目(條目的順序順序很重要,因此包含順序很重要)。通常,較高的層(例如,載板設備樹)會覆蓋較低的層(例如,SoC設備樹),因爲較高的層一開始就包括較低的層。
例如,對於能夠用作設備或主機(雙角色)的USB控制器,可以使用dr_mode屬性顯式覆蓋默認模式:
&usbdev0{
dr_mode = "host";
};
設備的重要屬性是狀態屬性。它允許激活/停用設備。SoC級設備樹中指定了許多設備,但是默認情況下它們被禁用。通過引用基本節點(使用&字符和標籤),可以通過覆蓋status屬性的任何層來啓用設備。
&uart4{
status = "okay";
};
整個節點可以通過簡單地重新定義它們來覆蓋。與覆蓋屬性一樣,後面的定義會覆蓋前面的定義。
例如,通過簡單地在設備樹中重新定義Vybrids UART2(UART_B)的引腳配置來覆蓋uart2grp節點(此pinctrl規範已在imx7d-colibri.dtsi中定義,但具有CTS / RTS引腳)
&iomuxc {
pinctrl_uart2: uart2grp {
fsl,pins = <
MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x74
MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x14
>;
};
...
};
也可以使用/ delete-property /或/ delete-node /刪除屬性,甚至刪除節點。以下示例刪除載板級設備樹imx6qdl-colibri.dtsi中定義的fsl,uart-has-rtscts屬性:
&uart1 {
/delete-property/fsl,uart-has-rtscts;
};
刪除節點,則使用名稱。
/delete-node/backlight;
設備樹允許使用別名重新排列某些設備類型。例如,這對於RTC很有用,因爲第一個RTC設備被用作系統的主要時間源。應將主要時間源分配給rtc0別名(在本示例中,我們將snvsrtc分配爲主要RTC,即Vybrids內部RTC):
aliases {
rtc0 = &snvsrtc;
rtc1 = &rtc;
};
如果需要其他設備的資源,則使用引用來連接兩個設備。通常,它用於爲設備分配資源,例如中斷,時鐘,GPIO或PWM通道。根據所引用的設備,需要一定數量的參數(單元格)。該數量在父設備的-cells屬性中定義。
GPIO規範需要引用GPIO節點和一個或多個單元(參數)。單元格的數量取決於驅動程序。它可以從設備樹綁定文檔中獲得,也可以通過查看GPIO控制器節點獲得(輸出GPIO的設備標有該gpio-controller
屬性)。該#gpio-cells
屬性定義了預期的單元數量。例如,GPIO控制器在imx7d.dtsi中定義如下:
gpio1: gpio@4004a000 {
compatible = "fsl,imx7d-gpio";
reg = <0x4004a000 0x1000 0x400ff040 0x40>;
gpio-controller;
#gpio-cells = <2>;
...