《設備樹 — 基礎知識(一)》


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)

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM