1. 程式人生 > >linux裝置樹筆記__dts基本概念及語法

linux裝置樹筆記__dts基本概念及語法

  1. ARM Device Tree起源於OpenFirmware (OF),在過去的Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥著大量的垃圾程式碼,相當多數的程式碼只是在描述板級細節,而這些板級細節對於核心來講,不過是垃圾,如板上的platform裝置、resource、i2c_board_info、spi_board_info以及各種硬體的platform_data。為了改變這種局面,Linux社群的大牛們參考了PowerPC等體系架構中使用的Flattened Device Tree(FDT),也採用了Device Tree結構,許多硬體的細節可以直接透過它傳遞給Linux,而不再需要在kernel中進行大量的冗餘編碼。
  2. Device Tree是一種描述硬體的資料結構,由一系列被命名的結點(node)和屬性(property)組成,而結點本身可包含子結點。所謂屬性,其實就是成對出現的name和value。在Device Tree中,可描述的資訊包括(原先這些資訊大多被hard code到kernel中):CPU的數量和類別,記憶體基地址和大小,匯流排和橋,外設連線,中斷控制器和中斷使用情況,GPIO控制器和GPIO使用情況,Clock控制器和Clock使用情況。
  3. 通常由.dts檔案以文字方式對系統裝置樹進行描述,經過Device Tree Compiler(dtc)將dts檔案轉換成二進位制檔案binary device tree blob(
    dtb).dtb檔案可由Linux核心解析,有了device tree就可以在不改動Linux核心的情況下,對不同的平臺實現無差異的支援,只需更換相應的dts檔案,即可滿足,當然這樣會增加核心的體積。

裝置樹的儲存格式:

簡單的說,裝置樹是一種描述硬體配置的樹形資料結構, 有且僅有一個根節點[4]。它包含了有關CPU、實體記憶體、匯流排、串列埠、PHY以及其他外圍裝置資訊等。該樹繼承了Open Firmware IEEE 1275裝置樹的定義。作業系統能夠在啟動時對此結構進行語法分析,以此配置核心,載入相應的驅動。 
  U-Boot需要將扁平裝置樹在記憶體地址傳給核心。該樹主要由三大部分組成:頭(Header)、結構塊(Structure block)、字串塊(Strings block)。在記憶體中分配圖如下:

  1.  ------------------------------
  2. base -> | struct boot_param_header |
  3.         ------------------------------
  4.         | (alignment gap) (*) |
  5.         ------------------------------
  6.         | memory reserve map |
  7.         ------------------------------
  8.         | (alignment gap) |
  9.         ------------------------------
  10.         | |
  11.         | device-tree structure |
  12.         | |
  13.         ------------------------------
  14.         | (alignment gap) |
  15.         ------------------------------
  16.         | |
  17.         | device-tree strings |
  18.         | |
  19. -----> ------------------------------
  20. |
  21. |
    1. --- (base + totalsize)
    1. <1> 頭(header)
    2. 頭主要描述裝置樹的一些基本資訊,例如裝置樹大小,結構塊偏移地址,字串塊偏移地址等。偏移地址是相對於裝置樹頭的起始地址計算的。
    3. struct boot_param_header {
    4.     __be32 magic;                //裝置樹魔數,固定為0xd00dfeed
    5.     __be32 totalsize;            //整個裝置樹的大小
    6.     __be32 off_dt_struct;        //儲存結構塊在整個裝置樹中的偏移
    7.     __be32 off_dt_strings;        //儲存的字串塊在裝置樹中的偏移
    8.     __be32 off_mem_rsvmap;        //保留記憶體區,該區保留了不能被核心動態分配的記憶體空間
    9.     __be32 version;            //裝置樹版本
    10.     __be32 last_comp_version;    //向下相容版本號
    11.     __be32 boot_cpuid_phys;    //為在多核處理器中用於啟動的主cpu的物理id
    12.     __be32 dt_strings_size;    //字串塊大小
    13.     __be32 dt_struct_size;     //結構塊大小
    14. };

    1. <2> 結構塊(struct block)

    1. 裝置樹結構塊是一個線性化的結構體,是裝置樹的主體,以節點node的形式儲存了目標單板上的裝置資訊。
    2. 在結構塊中以巨集OF_DT_BEGIN_NODE標誌一個節點的開始,以巨集OF_DT_END_NODE標識一個節點的結束,整個結構塊以巨集OF_DT_END結束。一個節點主要由以下幾部分組成。
    3. (1)節點開始標誌:一般為OF_DT_BEGIN_NODE。
    4. (2)節點路徑或者節點的單元名(version<3以節點路徑表示,version>=0x10以節點單元名錶示)
    5. (3)填充欄位(對齊到四位元組)
    6. (4)節點屬性。每個屬性以巨集OF_DT_PROP開始,後面依次為屬性值的位元組長度(4位元組)、屬性名稱在字串塊中的偏移量(4位元組)、屬性值和填充(對齊到四位元組)。
    7. (5)如果存在子節點,則定義子節點。
    8. (6)節點結束標誌OF_DT_END_NODE。

    1. <3>字串塊

    1. 通過節點的定義知道節點都有若干屬性,而不同的節點的屬性又有大量相同的屬性名稱,因此將這些屬性名稱提取出一張表,當節點需要應用某個屬性名稱時直接在屬性名欄位儲存該屬性名稱在字串塊中的偏移量。

    1. <4> 裝置樹原始碼 DTS 表示

    1. 裝置樹原始碼檔案(.dts)以可讀可編輯的文字形式描述系統硬體配置裝置樹,支援 C/C++方式的註釋,該結構有一個唯一的根節點“/,每個節點都有自己的名字並可以包含多個子節點。裝置樹的資料格式遵循了 Open Firmware IEEE standard 1275。這個裝置樹中有很多節點,每個節點都指定了節點單元名稱。每一個屬性後面都給出相應的值。以雙引號引出的內容為 ASCII 字串,以尖括號給出的是 32 位的16進位制值。這個樹結構是啟動 Linux 核心所需節點和屬性簡化後的集合,包括了根節點的基本模式資訊、CPU 和實體記憶體佈局,它還包括通過/chosen 節點傳遞給核心的命令列引數資訊。

    1. <5> machine_desc結構

    1. 核心提供了一個重要的結構體struct machine_desc ,這個結構體在核心移植中起到相當重要的作用,核心通過machine_desc結構體來控制系統體系架構相關部分的初始化。machine_desc結構體通過MACHINE_START巨集來初始化,在程式碼中, 通過在start_kernel->setup_arch中呼叫setup_machine_fdt來獲取。
    2. struct machine_desc {
    3.     unsigned int nr; /* architecture number */
    4.     const char *name; /* architecture name */
    5.     unsigned long atag_offset; /* tagged list (relative) */
    6.     const char *const *dt_compat; /* array of device tree* 'compatible' strings */
    7.     unsigned int nr_irqs; /* number of IRQs */
    8. #ifdef CONFIG_ZONE_DMA
    9.     phys_addr_t dma_zone_size; /* size of DMA-able area */
    10. #endif
    11.     unsigned int video_start; /* start of video RAM */
    12.     unsigned int video_end; /* end of video RAM */
    13.     unsigned char reserve_lp0 :1; /* never has lp0 */
    14.     unsigned char reserve_lp1 :1; /* never has lp1 */
    15.     unsigned char reserve_lp2 :1; /* never has lp2 */
    16.     enum reboot_mode reboot_mode; /* default restart mode */
    17.     struct smp_operations *smp; /* SMP operations */
    18.     bool (*smp_init)(void);
    19.     void (*fixup)(struct tag *, char **,struct meminfo *);
    20.     void (*init_meminfo)(void);
    21.     void (*reserve)(void);/* reserve mem blocks */
    22.     void (*map_io)(void);/* IO mapping function */
    23.     void (*init_early)(void);
    24.     void (*init_irq)(void);
    25.     void (*init_time)(void);
    26.     void (*init_machine)(void);
    27.     void (*init_late)(void);
    28. #ifdef CONFIG_MULTI_IRQ_HANDLER
    29.     void (*handle_irq)(struct pt_regs *);
    30. #endif
    31.     void (*restart)(enum reboot_mode, const char *);
    32. };

    1. <6>裝置節點結構體

    1. struct device_node {
    2.     const char *name;    //裝置name
    3.     const char *type; //裝置型別
    4. 相關推薦

      linux裝置筆記__dts基本概念語法

      ARM Device Tree起源於OpenFirmware (OF),在過去的Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥著大量的垃圾程式碼,相當多數的程式碼只是在描述板級細節,而這些板級細節對於核心來講,不過是垃圾,如板上的platform裝置、r

      linux裝置筆記__基於msm8x10的基本分析

      由文章,linux裝置樹筆記__dts基本概念及語法,我們知道了基本概念,知道了大概的裝置樹節點及其屬性,而節點下的屬性大多是自定義,除了保留的幾個屬性,大多從.dts是無法知道其用途的,這個就需要看驅動是如何解析屬性值的了,這點也可作技術細節的部分隱藏。 在原始碼的ms

      Linux 02 Linux基本概念操作

      調用 manual 如何 滾動 示例 函數 script 部分 ctrl+ 基本echo "hello word" 輸出 hello wordtouch file 創建文件名為file 常用快捷鍵TAB:在忘記命令時,可以用來補全命令Ctrl+c:強制終止

      基本概念存儲結構)

      表示 com 鏈式 結構定義 comment pen next rac 存儲 樹的定義—-遞歸(兩者相聯系) 根節點:唯一 節點的度:節點擁有的子樹數。度為0—>稱為終端節點或葉節點 樹的度:樹內各節點的度的最大值 內部節點:除根節點外的節

      Linux學習第三節課-指令基本概念部分指令用法

      版本 orm otto ip add 命令解釋 bashrc 取消 margin init 3 Linux學習第三節課十四、交互式接口交互式接口:啟動終端後,在終端設備附加一個交互式應用程序,要麽是圖形化接口GUI,要麽是命令行接口CLI。十五、Shell相關概念1.She

      Linux學習第四節課-文件管理基本概念相關部分指令

      sys 工作 mic ros ech num adding windows系統 bre Linux學習第四節課------------------------------------------

      linux信號基本概念如何產生信號

      arch track point 原型 lock signal函數 操作系統 get 如果 linux信號基本概念及如何產生信號摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:

      【資料結構與演算法】之基本概念常用操作的Java實現(二叉為例) --- 第十二篇

      樹是一種非線性資料結構,這種資料結構要比線性資料結構複雜的多,因此分為三篇部落格進行講解: 第一篇:樹的基本概念及常用操作的Java實現(二叉樹為例) 第二篇:二叉查詢樹 第三篇:紅黑樹 本文目錄: 1、基本概念 1.1  什麼是樹 1.2  樹的

      linux基本概念操作

      在linux中,最重要的就是命令,這就包過了2個過程,輸入和輸出 tab鍵補全文字、命令、目錄、引數等 Ctrl+c強行終止當前操作或程式(不會使終端退出) Ctrl+s暫停當前程式,暫停後按下任意鍵恢復執行 Ctrl+z將程式放到後臺執行,恢復到前臺為命令fg

      linux 裝置節點引用

      說了這麼半天,跟引入裝置樹有什麼關係呢?華清教學使用的開發板(A8/A9)都使用DM9000網絡卡晶片。DM9000驅動是開源的,在主線核心原始碼中就有。我們每次基於A8/A9板子移植的時候,DM9000驅動並沒有修改過,僅僅是選配了下,主要的工作是在板級檔案中添加了裝置資訊。DM9000驅動使用的是plat

      java資料結構與演算法之基本概念二叉(BinaryTree)的設計與實現

      關聯文章:   樹博文總算趕上這周釋出了,上篇我們聊完了遞迴,到現在相隔算挺久了,因為樹的內容確實不少,博主寫起來也比較費時費腦,一篇也無法涵蓋樹所有內容,所以後續還會用2篇左右的博文來分析其他內容大家就持續關注吧,而本篇主要了解的知識點如下(還是蠻多

      linux執行緒基本概念執行緒控制

      文章目錄 1.初識執行緒 1)執行緒的概念 2)程序與執行緒的關係 3)程序的多個執行緒共享 4)執行緒的優點 5)執行緒的缺點 6)執行緒異常情況 2.執行緒控制

      tiny4412學習(四)之移植linux-裝置(1)裝置基礎知識GPIO中斷

      #include <linux/init.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/gpio.h> #include <linux/of.

      二叉基本概念性質

      二叉樹基本概念: 在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉 堆。二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的

      Spring基礎筆記(一)--基本概念模組

      Spring基礎筆記 基本概念 Spring是什麼? Spring開源的、輕量級的JavaSE(Java標準版本)/JavaEE(Java企業版本)開發應用框架,其目的是簡化應用程式開發;

      《Linux4.0裝置驅動開發詳解》筆記--第十八章:ARM Linux裝置

      18.1 ARM裝置樹簡介 裝置舒適一種描述印鑑的資料結構,它起源於OpenFirmware(OF) 採用裝置樹前後對比: 採用裝置樹之前:ARM架構的板極硬體細節過多的被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx中

      Elasticsearch基本概念核心配置文件詳解

      last log4j 強烈 內存 文檔 size oca 機制 集群   Elasticsearch5.X,下列的是Elasticsearch2.X系類配置,其實很多配置都是相互兼容的 1. 配置文件 config/elasticsearch.yml 主配置文件

      TCP/IP詳解學習筆記(1)-基本概念【轉】

      網絡號 最大的 net 容易 學習 ip地址 其他 title 編寫 轉自:http://blog.csdn.net/goodboy1881/article/details/665041 為什麽會有TCP/IP協議 在世界上各地,各種各樣的電腦運行著各自不同的操作系統為大家

      DNS基本概念操作詳解----------------轉載

      dns介紹 DNS基本概念及操作詳解目錄:1.DNS協議2.DNS查詢 2.1遞歸查詢 2.2跌代查詢 2.3反向查詢3.域維護 3.1全量AXFR傳輸 3.2增量IXFR傳輸 3.3通過NOTIFY 3.4動態更新4.DNS安全 在很多人看來,DNS只是為外部提供DNS解析服務(我以前也是這麽認為

      mycat基本概念讀寫分離一

      heartbeat sha linux系統中 mys ren ack ima text 雙master mycat基本概念及讀寫分離一