1. 程式人生 > >Linux裝置樹學習日記(一)裝置樹簡單介紹

Linux裝置樹學習日記(一)裝置樹簡單介紹

一、linux裝置樹簡介

1.    裝置樹是一種描述硬體的資料結構,它起源於openfirmware,採用裝置樹後,許多硬體的細節可以直接通過它傳遞給linux,而不需要在核心中進行大量冗餘編碼。

2.    裝置樹由一系列被命名的節點(Node)和屬性(property)組成,而節點本身可包含於子節點。所謂屬性,其實就是成對出現的名稱和值。在裝置樹中,可描述的資訊包括(原先這些資訊大多被硬編碼在核心中):

(1)    CPU的數量和類別。

(2)    記憶體基地址和大小。

(3)    匯流排和橋。

(4)    外設連線。

(5)    中斷控制器和中斷使用情況。GPIO控制器和GPIO使用情況。

(6)    時鐘控制器和時鐘使用情況。

它基本上就是畫一棵電路板上CPU、匯流排、裝置組成的樹,BootLoader會將這棵樹傳遞給核心,然後核心可以識別這棵樹。並根據它展開出linux核心中的platform_device、i2c_client、spi_device等裝置,而這些裝置用到的記憶體、IRQ等資源,也被傳遞給了核心,核心會將這些資源繫結給展開的相應的裝置。

3.    DTC是將.dts編譯為.dtb的工具。DTC的原始碼位於核心的script/dtc目錄中。在linux核心的arch/arm/boot/dts/Makefile中,描述了當某種SOC被選中後,哪些.dtb檔案會被編譯出來。在linux下,我們可以執行make dtbs單獨編譯裝置樹檔案。DTC除了可以編譯.dts檔案以外,也可以“反彙編”.dtb檔案為.dts檔案,其指令格式為:

./script/dtc/dtc -I dtb -O dtb -o dts xxx.dtsarch/arm/boot/dts/xxx.dtb

4.    檔案.dtb是.dts被DTC編譯後的二進位制格式的裝置樹描述,可由linux核心解析,當然u-boot這樣的BootLoader也是可以識別.dtb的。通常我們在為電路板製作NAND、SD啟動映像時,會為.dtb檔案單獨留下一個很小的區域以存放之,之後BootLoader在引導核心的過程中,會先讀取該.dtb到記憶體。也可以直接把.dtb檔案和zImage繫結在一起做成一個映像檔案,當然核心編譯時要能支援CONFIG_ARM_APPENDED_DTP這個選項,以支援“Use appendeddevice tree blob to zImge”

二、linux裝置樹常用API

a)     #define for_each_child_of_node(parent, child);遍歷parent下的所有子節點。

b)     static inline int of_get_gpio_flags(structdevice_node *np, int index,                 enum of_gpio_flags *flags);獲取對應GPIO口的值

c)     unsigned int irq_of_parse_and_map(structdevice_node *dev, int index);解析中斷,實際上是從.dts中的interrupts屬性裡解析出中斷號,若裝置使用了多箇中斷,index指定中斷的索引號。

d)     struct device_node *of_find_compatible_node(structdevice_node *from,

const char *type, const char *compat);根據相容性,獲得裝置節點。遍歷裝置樹中的裝置節點,看看哪個節點的型別、相容屬性與本函式的輸入引數匹配,在大多數情況下,from、type為NULL,則表示遍歷了所有的節點。

e)     static inline int of_property_read_s32(conststruct device_node *np,

const char *propname, s32 *out_value);讀取裝置節點np的屬性名,為propname,屬性型別為32位整型陣列。

f)      const void *of_get_property(conststruct device_node *np, const char *name,

 int *lenp);在節點node中找到name的屬性並返回它的值。

g)     static inline intof_get_child_count(const struct device_node *np);獲得子節點的數量

如有不當之處請指正,轉載請註明出處。