最近要學習設備樹,在網上找了很多資料,找出幾篇寫的比較好的博客分享一下:
https://blog.csdn.net/smcdef/article/details/77387975
https://blog.csdn.net/dzw19911024/article/details/82115101
https://blog.csdn.net/huanting_123/article/details/90142745
https://blog.csdn.net/woshidahuaidan2011/article/details/52948732
本篇文章總結一些比較特殊的情況,雖然有些在上邊這些博客里有提到,但是還是通過一些實例進行具體的分析比較具有說服力。
為了驗證自己寫的設備樹,首先要編譯自己寫的設備樹,使用dtc工具編譯設備,dtc工具的使用方法是:dtc -I dts -O dtb -o xxx.dtb xxx.dts,即可生成dts文件對應的dtb文件了,-I 指輸入文件格式,-O指輸出文件格式,-o指輸出文件名。
於是我寫了一個最簡單的dts文件,只包含一個根節點:
1 / { 2 3 };
好了,實際上這是一個坑,因為這個文件怎么編都編譯不過去。就這個問題困擾了我大半天,早上弄到下午才解決,中間走了很多彎路,然后在一個偶然的機會看到了一個別的設備樹文件是可以編譯過去的,對比一下發現能編譯過去的設備樹文件最開始寫了一行:/dts-v1/; 將這行加進去就能編譯通過了,dts文件改為:
1 /dts-v1/; 2 / { 3 4 };
這才是最簡單的設備樹。找這個問題真的是廢了很大的神,因為編譯的時候報錯信息只有:
Error: test.dts:1.1-2 syntax error
FATAL ERROR: Unable to parse input tree
我只知道文件第一行語法錯誤,鬼知道是什么錯誤。查看編譯器代碼發現“/dts-v1/;”這句還必須寫,而且必須寫成這個樣子,寫成“/dts-v2/;”都不行。而且根節點也必須寫,根節點還不能有名字。編譯之后生成的二進制文件及分析如下圖 :
其實前40個字節就是struct fdt_header結構體,該結構體在內核代碼scripts/dtc/libfdt/fdt.h中定義了。注意在dt_struct區域中第一個[00 00 00 01]表示的是一個節點的起始,接下來應該是節點的名字,由於根節點是沒有名字的,因此后面跟了個[00]表示\0,即根節點名的結束符(雖然沒有名字但是有結束符),后面的[00 00 00]是為了按4字節對齊。
接下來再分析一個比較典型的設備樹案例,代碼如下:
1 /dts-v1/; 2 / { 3 node@0 { 4 a-string-property = "A string"; 5 a-string-list-property = "first string", "second string"; 6 a-byte-data-property = [01 02 03 04]; 7 8 chile-node@0 { 9 first-child-property; 10 second-child-property = <1>; 11 a-reference-to-something = <&node1>; 12 }; 13 }; 14 15 node:node@1 { 16 an-cmpty-property; 17 a-cell-property = <1 2 3 4>; 18 child-node@0 { 19 20 }; 21 }; 22 };
分析圖下圖:
最后聲明一下,本文只是對一些實際案例進行分析,關於設備數的原理解析等請看文章開始推薦的4篇博客。