| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> Linux中Device Tree的由来 -> 正文阅读 |
|
[嵌入式]Linux中Device Tree的由来 |
内核代码中,arch文件夹下,是各个架构相关的代码,arm也在里面。 arm子文件夹下,有mach-xxx的目录,就是针对各个芯片类型的,比如mach-imx就是imx系列的芯片。 再里面就是具体的芯片或SOC,比如mach-imx6ul.c,这就是使用iMX6UL或者iMX6uLL的芯片的内容。 最开始,内核里的这部分代码,在内核源码中,存在大量对板级细节信息描述的代码,?board specific函数。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。 这样每款芯片,不同的板子,都要有相应的代码维护。 但这些代码和一些描述硬件信息的静态table,对内核来讲毫无意义,徒增臃肿,应该避免。 否则维护这些代码和merge这些改动,工作量大,容易冲突。 ARM也是个特例,不像Intel芯片架构固定和易于管理,ARM很多应用于嵌入式,而且使用了license IP的方式,让很多厂商加入ARM生态系统,但芯片厂商太多,就有越来越多的ARM平台的代码加入内核,每个厂商的周边硬件的设计又不同,就给内核代码维护带来麻烦。而这些代码中还会有大量重复。 在Linux kernel维护和release中,就出现了在merge windows中,对ARM相关部分的patch的merge,有一些conflicts要处理,虽然用邮件做了详细说明了改动内容和冲突如何结局,但这个pull request还是引起了争议: 2011年3月17日邮件中Linux原话:Gaah. Guys, this whole ARM thing is a f*cking pain in the ass. 于是乎,Open Firmware这个在PowerPC架构中使用的硬件描述语言就进入了视野:Flattened Device?Tree(FDT)。 Device Tree是一种描述硬件的数据结构,它起源于OpenFirmware (OF)。 kernel v2.6.23这个版本开始,drivers目录下多了一个of目录,of表示open firmware,里面存放device tree相关的处理。 2011年3月开始,内核在PowerPC、ARM等体系里正式使用设备树。 ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree。 以ARM为例,加入设备树的版本就是v3.1,在\arch\arm\boot\dts路径下,有各个芯片的dts文件。 在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。 Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被hard code到kernel中): - CPU的数量和类别 -? 内存基地址和大小 -? 总线和桥 -? 外设连接 -? 中断控制器和中断使用情况 -? GPIO控制器和GPIO使用情况 -? Clock控制器和Clock使用情况 它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。 整个Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式,又增加了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux内核。 开源文档中对设备树的描述是,一种描述硬件资源的数据结构,它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立(也就是说*.dtb文件由Bootloader读入内存,之后由内核来解析)。 DTS (device tree source).dts 文件是一种ASCII 文本格式的Device Tree描述,此文本格式非常人性化,适合人类的阅读习惯。基本上,在ARM Linux在,一个.dts 文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts 文件需包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dts 就include这个.dtsi。 设备树的主要优势:对于同一SOC的不同主板,只需更换设备树文件.dtb即可实现不同主板的无差异支持,而无需更换内核文件。 注:要使得3.x之后的内核支持使用设备树,除了内核编译时需要打开相对应的选项外,bootloader也需要支持将设备树的数据结构传给内核。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 10:10:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |