什麼是Device Tree?
目前Raspberry Pi 3 的kernel 核心為 4.4.y, 只可以使用 Device Tree 來描述 Internal SoC 及 External (Board level) 的硬體資源.
Device Tree 就是把 Platform Device 架構中用來描述硬體資源的部份給抽出來, 因為Platform Device 的檔案是用C code去描述的, 但概念上硬體資源的描述應和程式無關也與Linux版本無關. 用C 去描述很慘, 因為只要重新定義硬體資源都要重新編譯核心, 很浪費時間. 再來, 要去描述硬體資源,如果不熟悉C的語法, 也很難去寫 ,因為C語法不對會導致編譯失敗。
Device Tree架構, 解決了上述這些問題, 不用懂C也能定義硬體資源, 如此硬體工程師也可以做了,因為pin 腳拉那根做什麼功能, 硬體工程師最清楚 ,不然做軟體,寫code的人就要自己去對線路圖 (也不是不行, 但如果有對的人做掉, 豈不更快!)
硬體資源: 包含 SoC-level (.dtsi)及 board level (.dts)
- 描述CPU, RAM size
- 描述 Memory-mapped 上的元件, PWM、UART、I2C、SPI等晶片內部元件的描述, 如暫存器位址及大小, 中斷號碼、DMA,, pinctrl
- 描述外部連接裝置, 如裝置規格, 以flash來說,包含 page size, flash size等資訊, 通常寫device driver會從這裡取得裝置資訊. 外部裝置通常使用 device tree overlay (產生.dtbo)的方式而不要直接修改.dts.
Device Tree
1. 不用重新 compile source code 即可以更改系統的 configuration
2. 當硬體只有小小的更改,只需要 dts 檔小改, 然後再重新編譯出dtb即可。
3. 可以重複使用已存在的 dts 檔在其他地方,也可以覆蓋過去定義的功能
4. 移除 C code ,使得硬體的描述架構更清楚。
實測:
(1) 加入
MCP3008 ADC device到 device tree 中, 會自動掛載 .compatible="mcp3008" 的驅動程式.
> dtc -@ -I dts -O dtb -o mcp300x.dtbo mcp300x.dts
> sudo dtoverlay ./mcp300x.dtbo
(2) 讀取ADC channel 0
> cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw