DTS学习

1.DTS即Device Tree Source 设备树源码, DeviceTree是一种描述硬件的数据结构

2.如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。

3.dts文件包含dtsi文件,被dtc编译生成dtb二进制文件.

4.Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。

5.device tree的基本单元是node。这些node被组织成树状结构,除了root node,每个node都只有一个parent。一个device tree文件中只能有一个root node。每个node中包含了若干的property/value来描述该node的一些特性。每个node用节点名字(node name)标识,节点名字的格式是node-name@unit-address。如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括@和unit-address。unit-address的具体格式是和设备挂在那个bus上相关。

6.在.dts文件的每个设备,都有一个compatible属性,compatible属性用户驱动和设备的绑定。compatible属性是一个字符串的列表,列表中的第一个字符串表征了结点代表的确切设备,形式为",",其后的字符串表征可兼容的其他设备。可以说前面的是特指,后面的则涵盖更广的范围.

7.[@],<>中的内容是必选项,[]中的则为可选项。name是一个ASCII字符串,用于描述结点对应的设备类型,如果一个结点描述的设备有地址,则应该给出@unit-address。多个相同类型设备结点的name可以一样,只要unit-address不同即可。

8.reg意为region,区域。格式为:reg =<address1 length1 [address2 length2] [address3 length3]>;

9.父类的address-cells和size-cells决定了子类的相关属性要包含多少个cell,如果子节点有特殊需求的话,可以自己再定义,这样就可以摆脱父节点的控制。

10.ranges属性为一个地址转换表。表中的每一行都包含了子地址、父地址、在自地址空间内的区域大小。他们的大小(包含的cell)分别由子节点的address-cells的值、父节点的address-cells的值和子节点的size-cells来决定。

struct of_device_id 该结构体用来匹配设备树文件,其中的.compatible与设备树中内容查找匹配
例如:

static const struct i2c_device_id drv260x_i2c_id[] = {
	{xxxdrv,0},
	{}
};

static const struct of_device_id drv260x_of_match[] = {
	{ .compatible = "ti,drv2604", },
	{ .compatible = "ti,drv2604l", },
	{ .compatible = "ti,drv2605", },
	{ .compatible = "ti,drv2605l", },
	{ }
};


struct i2c_driver  XXX  {
.probe = drv_probe,
.driver = {
    .name = "",
    .of_match_table = 一个of_device_id结构体变量(上面的结构体),//很关键,匹配设备树文件
    ...
  },
.remove = drv_remove,
.id_table = 
};

id_table于of_match_table:前者始驱动模块的id,比如 i2c_table_id 后者是DTS/DTSI相关的id

MODULE_DEVICE_TABLE(i2c,i2c_device_id结构体名) 与设备树文件匹配后注册
MODULE_DEVICE_TABLE(of,of_device_id结构体名) 与设备树文件匹配后注册

利用of_get_named_gpio 得到gpio号
of_property_read_u32 函数获取设备树中的资源

参考:
设备树中ranges属性理解 https://blog.csdn.net/weixin_38239856/article/details/80747880
DTS入门知识 https://blog.csdn.net/u014717231/article/details/53139968
设备树中#address-cells和#size-cells作用 https://blog.csdn.net/weixin_38239856/article/details/80744938
作为uboot到kernel中DTS DTSI DTB等关系 https://blog.csdn.net/su1041168096/article/details/79283414

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值