1.設備樹的引入
在沒有引入設備樹之前,在內核中充斥的很多板卡硬件描述代碼。而且很多都是重復的。對於修改以及維護都很麻煩。因此引入了設備樹。
https://www.cnblogs.com/downey-blog/p/10486568.html
2.什么是設備樹
Device Tree是一種描述硬件的數據結構,在Linux 2.6中,ARM架構的板極硬件細節過多地被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,許多硬件的細節可以直接透過它傳遞給Linux,而不再需要在kernel中進行大量的冗余編碼。
在Device Tree中,可描述的信息包括(原先這些信息大多被hard code到kernel中):
CPU的數量和類別 內存基地址和大小 總線和橋 外設連接 中斷控制器和中斷使用情況 GPIO控制器和GPIO使用情況 Clock控制器和Clock使用情況
Bootloader會將這棵樹傳遞給內核,然后內核可以識別這棵樹,並根據它展開出Linux內核中的platform_device、i2c_client、spi_device等設備,而這些設備用到的內存、IRQ等資源,也被傳遞給了內核,內核會將這些資源綁定給展開的相應的設備。
3.設備樹的優點
a、對於傳統字符驅動的編寫有兩種方式:
一是在驅動程序中,直接寫死硬件資源,如:GPIO、寄存器地址、中斷號等,使得硬件改動時,必須修改驅動程序。
二是采用總線驅動platform模型,將硬件資源與驅動軟件分離,在platform_device中描述硬件資源,arch/arm/mach-xxx對應的文件,便是以platform_device描述各自CPU對應的硬件資源;在platform_driver中分配/設置/注冊 file_operations結構體, 並從platform_device獲得硬件資源。這種編寫方式使得驅動易於擴展,硬件改動時只需修改platform_device或者platform_driver,這就導致linux內核產生大量的冗余代碼。
b、 使用設備樹的優點在於,在設備樹dts文件指定硬件資源,dts被編譯為dtb文件, 在啟動單板時,U-boot會將dtb文件傳給內核,使得驅動程序與硬件分離,我們只需要修改dts文件,便能實現需求。這就是設備樹易於擴展,硬件有變動時不需要重新編譯內核或驅動程序,只需要提供不一樣的dtb文件。
4.編譯設備樹
設備樹文件的格式為dts,包含的頭文件格式為dtsi,dts文件是一種人可以看懂的編碼格式。但是uboot和linux不能直接識別,他們只能識別二進制文件,所以需要把dts文件編譯成dtb文件。dtb文件是一種可以被kernel和uboot識別的二進制文件。把dts編譯成dtb文件的工具是dtc。Linux源碼目錄下scripts/dtc目錄包含dtc工具的源碼。在Linux的scripts/dtc目錄下除了提供dtc工具外,也可以自己安裝dtc工具,linux下執行:sudo apt-get install device-tree-compiler安裝dtc工具。其中還提供了一個fdtdump的工具,可以反編譯dtb文件。dts和dtb文件的轉換如圖所示。
dtc工具的使用方法是:dtc –I dts –O dtb –o xxx.dtb xxx.dts,即可生成dts文件對應的dtb文件了。
在編譯linux內核時。也可以直接make dtbs生成dtb文件。
5.設備樹怎么傳遞給內核
Bootloader需要將設備樹在內存中的地址傳給內核。在ARM中通過bootm或bootz命令來進行傳遞。bootm [kernel_addr] [initrd_address] [dtb_address],其中kernel_addr為內核鏡像的地址,initrd為initrd的地址,dtb_address為dtb所在的地址。若initrd_address為空,則用“-”來代替。
Linux設備樹語法詳解 - Abnor - 博客園 (cnblogs.com)