韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第四十三章Linux设备树(一)

2023-11-13

1)实验平台:正点原子Linux开发板

2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南

关注官方微信号公众号,获取更多资料:正点原子

前面章节中我们多次提到“设备树”这个概念,因为时机未到,所以当时并没有详细的讲解什么是“设备树”,本章我们就来详细的谈一谈设备树。掌握设备树是Linux驱动开发人员必备的技能!因为在新版本的Linux中,ARM相关的驱动全部采用了设备树(也有支持老式驱动的,比较少),最新出的CPU其驱动开发也基本都是基于设备树的,比如ST新出的STM32MP157、NXP的I.MX8系列等。我们所使用的Linux版本为4.1.15,其支持设备树,所以正点原子I.MX6U-ALPHA开发板的所有Linux驱动都是基于设备树的。本章我们就来了解一下设备树的起源、重点学习一下设备树语法。

43.1 什么是设备树?

设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做DTS(Device Tree Source),这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU数量、内存基地址、IIC接口上接了哪些设备、SPI接口上接了哪些设备等等,如图43.1.1所示:

图43.1.1 设备树结构示意图

在图43.1.1中,树的主干就是系统总线,IIC控制器、GPIO控制器、SPI控制器等都是接到系统主线上的分支。IIC控制器有分为IIC1和IIC2两种,其中IIC1上接了FT5206和AT24C02这两个IIC设备,IIC2上只接了MPU6050这个设备。DTS文件的主要功能就是按照图43.1.1所示的结构来描述板子上的设备信息,DTS文件描述设备信息是有相应的语法规则要求的,稍后我们会详细的讲解DTS语法规则。

在3.x版本(具体哪个版本笔者也无从考证)以前的Linux内核中ARM架构并没有采用设备树。在没有设备树的时候Linux是如何描述ARM架构中的板级信息呢?在Linux内核源码中大量的arch/arm/mach-xxx和arch/arm/plat-xxx文件夹,这些文件夹里面的文件就是对应平台下的板级信息。比如在arch/arm/mach-smdk2440.c中有如下内容(有缩减):

示例代码43.1.1 mach-smdk2440.c文件代码段

90staticstruct s3c2410fb_display smdk2440_lcd_cfg __initdata ={

91

92.lcdcon5 = S3C2410_LCDCON5_FRM565 |

93 S3C2410_LCDCON5_INVVLINE |

94 S3C2410_LCDCON5_INVVFRAME |

95 S3C2410_LCDCON5_PWREN |

96 S3C2410_LCDCON5_HWSWP,

......

113};

114

115staticstruct s3c2410fb_mach_info smdk2440_fb_info __initdata ={

116.displays =&smdk2440_lcd_cfg,

117.num_displays =1,

118.default_display =0,

......

133};

134

135staticstruct platform_device *smdk2440_devices[] __initdata ={

136 &s3c_device_ohci,

137&s3c_device_lcd,

138&s3c_device_wdt,

139&s3c_device_i2c0,

140&s3c_device_iis,

141};

上述代码中的结构体变量smdk2440_fb_info就是描述SMDK2440这个开发板上的LCD信息的,结构体指针数组smdk2440_devices描述的SMDK2440这个开发板上的所有平台相关信息。这个仅仅是使用2440这个芯片的SMDK2440开发板下的LCD信息,SMDK2440开发板还有很多的其他外设硬件和平台硬件信息。使用2440这个芯片的板子有很多,每个板子都有描述相应板级信息的文件,这仅仅只是一个2440。随着智能手机的发展,每年新出的ARM架构芯片少说都在数十、数百款,Linux内核下板级信息文件将会成指数级增长!这些板级信息文件都是.c或.h文件,都会被硬编码进Linux内核中,导致Linux内核“虚胖”。就好比你喜欢吃自助餐,然后花了100多到一家宣传看着很不错的自助餐厅,结果你想吃的牛排、海鲜、烤肉基本没多少,全都是一些凉菜、炒面、西瓜、饮料等小吃,相信你此时肯定会脱口而出一句“F*k!”、“骗子!”。同样的,当Linux之父linus看到ARM社区向Linux内核添加了大量“无用”、冗余的板级信息文件,不禁的发出了一句“This whole ARM thing is a f*cking pain in the ass”。从此以后ARM社区就引入了PowerPC等架构已经采用的设备树(Flattened Device Tree),将这些描述板级硬件信息的内容都从Linux内中分离开来,用一个专属的文件格式来描述,这个专属的文件就叫做设备树,文件扩展名为.dts。一个SOC可以作出很多不同的板子,这些不同的板子肯定是有共同的信息,将这些共同的信息提取出来作为一个通用的文件,其他的.dts文件直接引用这个通用文件即可,这个通用文件就是.dtsi文件,类似于C语言中的头文件。一般.dts描述板级信息(也就是开发板上有哪些IIC设备、SPI设备等),.dtsi描述SOC级信息(也就是SOC有几个CPU、主频是多少、各个外设控制器信息等)。

这个就是设备树的由来,简而言之就是,Linux内核中ARM架构下有太多的冗余的垃圾板级信息文件,导致linus震怒,然后ARM社区引入了设备树。

43.2 DTS、DTB和DTC

上一小节说了,设备树源文件扩展名为.dts,但是我们在前面移植Linux的时候却一直在使用.dtb文件,那么DTS和DTB这两个文件是什么关系呢?DTS是设备树源码文件,DTB是将DTS编译以后得到的二进制文件。将.c文件编译为.o需要用到gcc编译器,那么将.dts编译为.dtb需要什么工具呢?需要用到DTC工具!DTC工具源码在Linux内核的scripts/dtc目录下,scripts/dtc/Makefile文件内容如下:

示例代码43.2.1 scripts/dtc/Makefile文件代码段

1 hostprogs-y := dtc

2 always :=$(hostprogs-y)

3

4 dtc-objs:= dtc.o flattree.o fstree.o data.o livetree.o treesource.o

5 srcpos.o checks.o util.o

6 dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o

......

可以看出,DTC工具依赖于dtc.c、flattree.c、fstree.c等文件,最终编译并链接出DTC这个主机文件。如果要编译DTS文件的话只需要进入到Linux源码根目录下,然后执行如下命令:

makeall

或者:

makedtbs

“makeall”命令是编译Linux源码中的所有东西,包括zImage,.ko驱动模块以及设备树,如果只是编译设备树的话建议使用“makedtbs”命令。

基于ARM架构的SOC有很多种,一种SOC又可以制作出很多款板子,每个板子都有一个对应的DTS文件,那么如何确定编译哪一个DTS文件呢?我们就以I.MX6ULL这款芯片对应的板子为例来看一下,打开arch/arm/boot/dts/Makefile,有如下内容:

示例代码43.2.2 arch/arm/boot/dts/Makefile文件代码段

381 dtb-$(CONFIG_SOC_IMX6UL) +=

382 imx6ul-14x14-ddr3-arm2.dtb

383 imx6ul-14x14-ddr3-arm2-emmc.dtb

......

400 dtb-$(CONFIG_SOC_IMX6ULL) +=

401 imx6ull-14x14-ddr3-arm2.dtb

402 imx6ull-14x14-ddr3-arm2-adc.dtb

403 imx6ull-14x14-ddr3-arm2-cs42888.dtb

404 imx6ull-14x14-ddr3-arm2-ecspi.dtb

405 imx6ull-14x14-ddr3-arm2-emmc.dtb

406 imx6ull-14x14-ddr3-arm2-epdc.dtb

407 imx6ull-14x14-ddr3-arm2-flexcan2.dtb

408 imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb

409 imx6ull-14x14-ddr3-arm2-lcdif.dtb

410 imx6ull-14x14-ddr3-arm2-ldo.dtb

411 imx6ull-14x14-ddr3-arm2-qspi.dtb

412 imx6ull-14x14-ddr3-arm2-qspi-all.dtb

413 imx6ull-14x14-ddr3-arm2-tsc.dtb

414 imx6ull-14x14-ddr3-arm2-uart2.dtb

415 imx6ull-14x14-ddr3-arm2-usb.dtb

416 imx6ull-14x14-ddr3-arm2-wm8958.dtb

417 imx6ull-14x14-evk.dtb

418 imx6ull-14x14-evk-btwifi.dtb

419 imx6ull-14x14-evk-emmc.dtb

420 imx6ull-14x14-evk-gpmi-weim.dtb

421 imx6ull-14x14-evk-usb-certi.dtb

422 imx6ull-alientek-emmc.dtb

423 imx6ull-alientek-nand.dtb

424 imx6ull-9x9-evk.dtb

425 imx6ull-9x9-evk-btwifi.dtb

426 imx6ull-9x9-evk-ldo.dtb

427 dtb-$(CONFIG_SOC_IMX6SLL) +=

428 imx6sll-lpddr2-arm2.dtb

429 imx6sll-lpddr3-arm2.dtb

......

可以看出,当选中I.MX6ULL这个SOC以后(CONFIG_SOC_IMX6ULL=y),所有使用到I.MX6ULL这个SOC的板子对应的.dts文件都会被编译为.dtb。如果我们使用I.MX6ULL新做了一个板子,只需要新建一个此板子对应的.dts文件,然后将对应的.dtb文件名添加到dtb-$(CONFIG_SOC_IMX6ULL)下,这样在编译设备树的时候就会将对应的.dts编译为二进制的.dtb文件。

示例代码43.2.2中第422和423行就是我们在给正点原子的I.MX6U-ALPHA开发板移植Linux系统的时候添加的设备树。关于.dtb文件怎么使用这里就不多说了,前面讲解Uboot移植、Linux内核移植的时候已经无数次的提到如何使用.dtb文件了(uboot中使用bootz或bootm命令向Linux内核传递二进制设备树文件(.dtb))。

43.3 DTS语法

虽然我们基本上不会从头到尾重写一个.dts文件,大多时候是直接在SOC厂商提供的.dts文件上进行修改。但是DTS文件语法我们还是需要详细的学习一遍,因为我们肯定需要修改.dts文件。大家不要看到要学习新的语法就觉得会很复杂,DTS语法非常的人性化,是一种ASCII文本文件,不管是阅读还是修改都很方便。

本节我们就以imx6ull-alientek-emmc.dts这个文件为例来讲解一下DTS语法。关于设备树详细的语法规则请参考《Devicetree SpecificationV0.2.pdf》和《Power_ePAPR_APPROVED_v1.12.pdf》这两份文档,此两份文档已经放到了开发板光盘中,路径为:4、参考资料->Devicetree SpecificationV0.2.pdf、4、参考资料->Power_ePAPR_APPROVED_v1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第四十三章Linux设备树(一) 的相关文章

随机推荐

  • 多模型构建的多层级权限管控体系

    在阐述 CloudQuery 权限体系之前 想先跟大家分享下我们团队在客户侧收集到了的一些真实场景与诉求 对特定对象进行操作管控 SQL 命令 对某个字段实现精确动态脱敏 对某一条 SQL 语句进行精确提权 对高危命令进行拦截 实现用户登录
  • Flutter 实现文字向上/下滚动效果(八)

    实现原理 Flutter ListView 定时器 Timer 每隔一段时间通过控制器 scrollController 主动跳转 animateTo 下一条目 可以自定义动画 跳转时间 到达底部时从头开始 循环往复 import dart
  • 学习笔记之什么是持久化和对象关系映射ORM技术

    学习笔记之什么是持久化和对象关系映射ORM技术 by Naven at 2005 09 19 何谓 持久化 持久 Persistence 即把数据 如内存中的对象 保存到可永久保存的存储设备中 如磁盘 持久化的主要应用是将内存中的数据存储在
  • 你认为DAO是否可行?新年计划,卯足干劲,兔必No.1

    文章目录 课前小差 聚沙成塔 社会价值 DAO是什么 国产化 商业化回报 写在最后 课前小差 哈喽 大家好 我是几何心凉 这是一份全新的专栏 唯一得倒CSDN王总的授权 来对于我们每周四的绿萝时间 直达CSDN 直播内容进行总结概括 让大家
  • [mysql]游标和触发器

    目录 游标 或光标 定义 使用过程 示例 总结 触发器 应用场景 定义 使用 创建 查看 删除 示例 一个注意点 优缺点 拓展 MySQL 8 0的新特性 全局变量的持久化 游标 或光标 定义 游标是一种 能够对结果集中的每一条记录进行定位
  • Jetson nano之ROS入门 - - 机器人建模与仿真

    文章目录 前言 一 URDF建模 1 URDF语法详解 a robot b link c joint 2 URDF机器人建模实操 二 Xacro宏优化 1 Xacro宏语法详解 2 Xacro建模实操 三 Rviz与Gazebo仿真 1 G
  • 【人体姿态】Convolutional Pose Machines

    Wei Shih En et al Convolutional Pose Machines CVPR 2016 本论文将深度学习应用于人体姿态分析 同时用卷积图层表达纹理信息和空间信息 目前在2016年的MPII竞赛中名列前茅 作者在git
  • 51单片机之串口通讯应用实例(逻辑分析仪调试)

    硬件 STC89C52RC 开发工具 Keil uVision4 前言 8051是一款很经典的 历史悠久的单片机 作为一款入门级的单片机8051受到很多初学者的欢迎 89c52是8051系列的成员之一 拥有8K字节程序存储空间 512字节随
  • 基于Python Django Mysql数据库 的电商系统实现

    基于Python Django的电商系统实现 最近需要基于Django实现一个电商系统 目前已实现了基本功能 整个系统结构相对简单 没有进行前后端分离 使用的django的最简单的Template模板前后端交互模式 这个项目属于入门级项目
  • 环保行业如何开发废品回收微信小程序

    废品回收是近年来受到越来越多人关注的环保行动 为了推动废品回收的普及和方便 我们可以利用微信小程序进行制作 方便人们随时随地参与废品回收 首先 我们需要注册并登录乔拓云账号 并进入后台 乔拓云是一个提供微信小程序制作平台的服务商 非常适合我
  • php user.ini详解

    0x00 前言 本篇主要是讲解分析一下user ini相关的内容 因为这个知识点涉及到文件上传的绕过 0x01 正文 user ini 文件是PHP的配置文件 用于自定义PHP的配置选项 该文件通常位于PHP安装目录的根目录下 或者在特定的
  • 2. 依赖管理和自动配置

    文章目录 2 1 依赖管理 2 1 1 什么是依赖管理 2 1 2 修改自动仲裁 默认版本号 2 2 starter 场景启动器 2 2 1 starter 场景启动器基本介绍 2 2 2 官方提供的 starter 2 2 2 1 地址
  • PyTorch基础入门六:PyTorch搭建卷积神经网络实现MNIST手写数字识别

    1 卷积神经网络 CNN 简介 关于什么是卷积神经网络 CNN 请自行查阅资料进行学习 如果是初学者 这里推荐一下台湾的李宏毅的深度学习课程 链接就不给了 这些资料网站上随处可见 值得一提的是 CNN虽然在图像处理的领域具有不可阻挡的势头
  • ps2020无法显示最近打开

    首选项 常规 选择 自动显示主屏幕
  • 关于BeanUtils.copyProperties() 用法及区别

    这两个类在不同的包下面 而这两个类的copyProperties 方法里面传递的参数赋值是相反的 例如 a b为对象BeanUtils copyProperties a b BeanUtils是org springframework bea
  • FakeMsdMiner挖矿病毒分析报告

    近日 亚信安全截获新型挖矿病毒FakeMsdMiner 该病毒利用永恒之蓝 永恒浪漫等NSA漏洞进行攻击传播 该病毒具有远控功能 可以获取系统敏感信息 其通过修改HOST文件方式截获其他挖矿病毒的成果 由于该病毒的挖矿程序伪装成微软系统服务
  • [note] 深度学习 tensorflow 笔记(3) cnn 卷积神经网络

    假设我们想要辨识一张图片里面是不是有猫咪的存在 这只猫咪可以在图片的任何位置 什么办法才能辨别这个图片里面有没有猫呢 一个很简单的想法就是 将图片分成一些子图片的集合 逐个辨别子图片里面有没有猫咪 的确 卷积神经网络就是这样做的 但是 分割
  • Android高德地图自定义Mark并实现聚合效果

    Android高德地图自定义Mark并实现聚合效果 起因 公司本来项目里面用到了高德地图 然后最近老板看见别人的APP里面有个聚合的这个功能 老板 这个效果能不能实现 我也要 没有办法因为以前没有做过高德地图点聚合这个东西 然后只能勉强的答
  • Brocade FOS下载 博科光纤交换机固件升级

    百度网盘 https pan baidu com s 1lCAsjoDG3rMXs7uYoJETWA 输入码 7nv4 1 BT下载 比如用迅雷 17F8E2FAC8CD08C682B3D2A5CC294B48B1DA2ED6 7313C1
  • 韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第四十三章Linux设备树(一)

    1 实验平台 正点原子Linux开发板 2 摘自 正点原子I MX6U嵌入式Linux驱动开发指南 关注官方微信号公众号 获取更多资料 正点原子 前面章节中我们多次提到 设备树 这个概念 因为时机未到 所以当时并没有详细的讲解什么是 设备树