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有詳細的說明。