linux device tree 摘要

1, dtsi與dts的關係

dtsi相當於c語言的.h頭文件,放置soc共有的內容和各machine共同的內容,

一個.dts文件對應一個ARM的machine,可以include 需要的dtsi文件。

並且dtsi也可以include其他的dtsi文件(好比如c語言的.h也可以include其他.h)。

2, compatible 屬性

在dts 裏邊的每個設備都有一個compatible屬性,

第一個字符串表徵了結點代表的確切設備,                          

格式爲compatible = “<manufacturer>,<model>”,

後面的字符串表徵可兼容的其他設備。可以說前面的是特指,後面的則涵蓋更廣的範圍

一般來說都是隻填第一個字符串,

後邊kernel 會根據你在驅動定義的struct of_device_id進行device 和driver匹配,

進而調用driver 的probe函數,

如對於一個i2c設備:

static const struct of_device_id  your_device_of_match[] = {  
   { .compatible = " manufacturer, model_1 ", },  
   { .compatible = " manufacturer, model_2 ", },  
   { .compatible = " manufacturer, model_3 ", },  
   { .compatible = " manufacturer, model_4 ", },  
   { },  
};  
static struct i2c_driver your_device_driver = {  
    .driver = {  
	        .owner  = THIS_MODULE,  
	        .name   = YOUR_DRIVER_NAME_UP,  
	        .of_match_table = your_device_of_match,  
	    },  
	    .probe    = your_device_i2c_drv_probe,  
	    .remove  = your_device_i2c_drv_remove,  
	    .id_table   = your_device _i2c_drv_id_table,   
};  

可以有多個model_x,是由於一份driver代碼可控制多個device。

3,  節點命名方式:

對於每個節點,其命名方式爲:<name>[@<unit-address>],
其中name爲節點名字,若device有地址,那麼unit-address 需要填寫地址,多個相同類型設備結點的name可以一樣,只要unit-address不同即可,設備的unit-address地址也經常在其對應結點的reg屬性中給出。例如對於2個同類型的i2c設備,name可以一樣,addr不一樣:

name@0xaddr_1 {  
        …..  
        reg = <0xaddr_1>;  
        ……  
}  
name@0xaddr_2 {  
        …..  
        reg = <0xaddr_2>;  
        ……  
} 

4,    編譯

dts最終編譯成dtbo.img文件,
android/build/make/core/Makefile:
 

1.	# dtbo image  
2.	ifdef BOARD_PREBUILT_DTBOIMAGE  
3.	INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img  

若修改了dts/dtsi,可通過make dtboimage 命令重新編譯生成dtbo.img後可用fastboot進行燒錄。

5,    常用的of api

可使用以下api 通過屬性名字獲取定義在dts文件裏邊的屬性值,如:
 

int of_device_is_compatible(const struct device_node *device,const char *compat);  //判斷設備結點的compatible 屬性是否包含compat指定的字符串
int of_property_read_u8_array(const struct device_node *np,  
  
                     const char *propname, u8 *out_values, size_t sz);  
  
int of_property_read_u16_array(const struct device_node *np,  
  
                      const char *propname, u16 *out_values, size_t sz);  
  
	int of_property_read_u32_array(const struct device_node *np,  
	  
	                      const char *propname, u32 *out_values, size_t sz);  
	  
	int of_property_read_u64(const struct device_node *np, const char  
	  
	*propname, u64 *out_value);  

讀取設備結點np的屬性名爲propname,類型爲8、16、32、64位整型數組的屬性。
具體完整的of_api列表位於kernel/msm-xx/include/linux/of.h,裏邊對每個of_api有詳細的說明。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章