Juggernaut 发表于 2024-4-3 23:27

《原子嵌入式Linux驱动开发详解与实战》阅读体验4-设备树

<div class='showpostmsg'><p>&nbsp;</p>

<p><strong><span style="font-size:16px;">设备树简单理解就是将硬件相关数据(如几个SPI,每个SPI控制器的寄存器地址等等)统一按设备树的结构独立于内核进行配置和修改,这里需要了解的就是设备树语法知识。有了设备树文件后,如何让内核代码读取这些信息,进行板级初始化,Linux的做法是编译成DTB文件,然后在内核启动时进行解析,逐一获取硬件数据。</span></strong></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">为什么要引入设备树,《原子嵌入式Linux驱动开发详解与实战》举了个很有意思的案例,大概的意思就是之前Linus对ARM社区合并进来的各类驱动都进主线比较头疼,因为各类设备的各种驱动merger后,直接导致Kernel日趋臃肿,而且臃肿的速度越来越快。目前的RTOS大部分都是这种,把各种BSP驱动加进main line,然后用特定的宏确定是否需要编译。</span></p>

<div style="text-align: center;"></div>

<p><span style="font-size:16px;">同样的,当 Linux 之父 linus 看到 ARM 社区向 Linux 内核添加了大量&ldquo;无用&rdquo;、冗余的板级信息文件,不禁的发出了一句&ldquo;This whole ARM thing is a fcking pain in the ass&rdquo;。从此以后 ARM 社区就引入了 PowerPC 等架构已经采用的设备树(Flattened Device Tree),将这些描述板级硬件信息的内容都从 Linux 内中分离开来,用一个专属的文件格式来描述,这个专属的文件就叫做设备树,文件扩展名为.dts。 一个 SOC 可以作出很多不同的板子,这些不同的板子肯定是有共同的信息, 将这些共同的信息提取出来作为一个通用的文件,其他的.dts 文件直接引用这个通用文件即可,这个通用文件就是.dtsi 文件,类似于 C 语言中的头文件。一般.dts 描述板级信息(也就是开发板上有哪些 IIC 设备、 SPI 设备等), .dtsi 描述 SOC 级信息(也就是 SOC 有几个 CPU、主频是多少、各个外设控制器信息等)。</span></p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p><span style="font-size:16px;"><strong>DTS、DTB、DTC的关系&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><br />
1、DTS是设备树的源文件,.dts相当于DTS源码文件;</span></p>

<p><span style="font-size:16px;">设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键&mdash;值对。</span></p>

<div style="text-align: center;"></div>

<div><span style="font-size:16px;">/是根节点,每个设备树文件只有一个根节点</span>,<span style="font-size:16px;"> aliases、cpus 和intc是三个子节点</span>。</div>

<div>&nbsp;</div>

<p><span style="font-size:16px;">2、DTB是DTS编译后得到的二进制文件;</span></p>

<p><span style="font-size:16px;">通过make dtbs编译所有的dts文件</span>。</p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">3、DTC是DTS的编译工具,将DTS文件编译成DTB文件,源码在内核的scripts/dtc目录下面,scripts/dtc/Makefile 文件内容:</span></p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p><span style="font-size:16px;">最后来一个/proc/device-tree的信息:</span></p>

<pre>
<code>ubuntu@bionic-dev64:/proc/device-tree$ ls
'#address-cells'               mmc@30b60000
alias_create_phandles         model
aliases                         name
anatop@30360000               ocotp-ctrl@30350000
backlight-mipi                  pcie@0x33800000
bt-rfkill                     pinctrl@30330000
busfreq                         pmu
caam@30900000                   power-domains
caam_secvio                     psci
caam-sm@00100000                pwm@30660000
caam-snvs@30370000            pwm@30670000
chosen                        pwm@30680000
clock-controller@30380000       pwm@30690000
clocks                        regulator-usdhc2-vqmmc
compatible                      regulator-vref-0v9
cpus                            regulator-vref-1v8
csi1_bridge@32e20000            regulator-vref-2v5
ddr_pmu@3d800000                regulator-vref-3v3
display-gpr@32e28000            regulator-vref-5v
display-subsystem               regulator-wlan-vmmc
dma_cap                         reserved-memory
dma-controller@302b0000         sai@30010000
dma-controller@302c0000         sai@30020000
dma-controller@30bd0000         sai@30030000
ecspi@30820000                  sai@30050000
ecspi@30830000                  sai@30060000
ecspi@30840000                  serial@30860000
ethernet@30be0000               serial@30880000
flexspi@30bb0000                serial@30890000
gpc@303a0000                  serial@30a60000
gpio@30200000                  '#size-cells'
gpio@30210000                   snvs@30370000
gpio@30220000                   sound-wm8960
gpio@30230000                   spdif@30090000
gpio@30240000                   src@30390000
gpu@38000000                  __symbols__
i2c@30a20000                  thermal-zones
i2c@30a30000                  timer
i2c@30a40000                  timer@306a0000
i2c@30a50000                  tmu@0x30260000
imx_ion                         usb@32e40000
imx_rpmsg                     usb@32e50000
interrupt-controller@38800000   usbmisc@32e40200
interrupt-parent                usbmisc@32e50200
iomuxc-gpr@30340000             usbphynop1
lcdif@32E00000                  usbphynop2
memory@40000000               vpu_g1@38300000
micfil@30080000               vpu_g2@38310000
mipi-cmds-ltk080a60a004t      vpu_h1@38320000
mipi_csi@32e30000               wdog@30280000
mipi_dsi@32E10000               wdog@30290000
mmc@30b40000                  wdog@302a0000
mmc@30b50000
</code></pre>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2024-4-6 10:04

<p>这个每个设备树文件只有一个根节点,&nbsp;aliases、cpus 和intc是三个子节点,不是太好理解</p>

Juggernaut 发表于 2024-4-6 14:55

Jacktang 发表于 2024-4-6 10:04
这个每个设备树文件只有一个根节点,&nbsp;aliases、cpus 和intc是三个子节点,不是太好理解

<p>根节点一个 唯一性,跟main()一样</p>

beyond_笑谈 发表于 2024-4-7 13:16

<p>ARM应该是只有一个根节点和根目录,子节点不止三个</p>

chejm 发表于 2024-4-8 21:18

<p>楼主分享的linux设备树技术点内容非常详实,易懂,值得收藏学习,感谢楼主</p>
页: [1]
查看完整版本: 《原子嵌入式Linux驱动开发详解与实战》阅读体验4-设备树