DTS学习

1. 定义

        dts:device tree source,设备树源码。硬件信息都会写在dts文件中。dts文件一般放在内核的arch/arm/boot/dts目录

        dtsi:device tree source include 对于一些相同的dts配置可以抽象到dtsi文件中,然后以类似于c语言头文件的方式include到dts文件中,当dts和dtsi同时设置一个节点时,dts中的配置会覆盖dtsi中的配置。

                *因此一般我们都对dtsi作更改,以不影响原本配置

        dtc:devcie tree complier编译dts的工具

        dtb:device tree blob dts经dtc编译后得到dtb文件,dtb再通过BootLoader引导程序加载到内核。bootloader在引导linux内核的时候回将.dtb的地址告知内核,之后内核会展开devicetree并创建和注册相关的设备。

        node:节点。正常情况下所有的dts和dtsi文件都含有且只含有一个根节点(name是)"/"。dtc会对dts的node进行合并,最终生成的dtb中只有一个root node。节点名字的格式:node-name@unit-address;如果node没有reg属性则不能包括unit-address

        compatible:一个特殊的属性,通过这个属性可以定义系统的名称;设备树中每一个代表了一个设备的节点都要有一个compatible属性。系统初始化时,会初始化platform总线上的设备,根据设备节点compatible属性和驱动中of_match_table对应的值来匹配。

2. 加载

        通过dtc将适合人类阅读的dts转换成适合机器处理的dtb文件。系统启动的时候可以通过firmware和BootLoader将保存到flash中的dtb拷贝到内存。

        设备树由一系列被命名的结点node和属性property组成,结点本身包含子结点。属性是指成对出现的name和value。在device tree中可以描述的信息包括:cpu数量和类别、内存基地址和大小、总线和桥、外设链接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况。

3. 一些例子

<span style="font-size:14px;">static struct of_device_idgpio_keys_of_match[ ] = {         {.compatible = "gpio-keys", },

        {},

};

static struct platform_drivergpio_keys_device_driver = {
       .probe           = gpio_keys_probe,
       .remove        = gpio_keys_remove,
       .driver          = {
              .name    ="gpio-keys",
              .owner   = THIS_MODULE,
              .pm = &gpio_keys_pm_ops,
              .of_match_table= of_match_ptr(gpio_keys_of_match),
       }
};

个人理解:driver结构体里定义了几个函数接口,包含probe函数和remove函数,以及driver本身的结构。.probe表示匹配成功后会运行gpio_keys_device_driver;driver本身的定义里,name定义了驱动的名字。在前面有compatible属性的匹配,owner是所属者(一般为THE_MODULE).

以上理解基于先对platform_device和platform_driver的直观匹配,即使用plaform_device_register和platform_driver_register来注册的老办法。事实上引入了device tree后,匹配方式发生了变化。它不再是通过name字段来匹配,而是通过compitable属性进行匹配且不区分大小写。

宏of_match_ptr:当使用设备树时,使用id_table进行匹配,否则为空

4. platform和dt

【总结】设备树对platform平台设备驱动带来的变化_风雨无阻-CSDN博客

*太强了吧,万能的of函数 

        总结:通过driver中我们定义的of_device_id类型的结构体里面的compatible名字和设备树节点的compatible来决定是否执行Probe函数。我们其实并没有初始化platform_device,这是内核加载设备树的时候完成的。设备树在加载之后,内核会把设备树节点转换成platform_device格式,同时把名字放在of_node这个地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值