[DTS]设备树实践

2024-06-22 09:08
文章标签 实践 设备 dts

本文主要是介绍[DTS]设备树实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下内容以RK3288作为讲解

kernel\arch\arm\boot\dts\rk3288.dts

(1) 头文件

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/pinctrl/rockchip.h>
#include <dt-bindings/clock/rk3288-cru.h>
#include <dt-bindings/power/rk3288-power.h>
#include <dt-bindings/thermal/thermal.h>
#include <dt-bindings/power/rk3288-power.h>
#include <dt-bindings/soc/rockchip,boot-mode.h>

头文件里面定义了dts文件中使用的宏,比如下面:

interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>;

GIC_SPIIRQ_TYPE_LEVEL_HIGH都是定义在头文件中的。

(2) 根节点

/ {#address-cells = <2>;#size-cells = <2>;compatible = "rockchip,rk3288";interrupt-parent = <&gic>;........
}
  • #address-cells和#size-cells决定子节点的reg属性值为
    < address1 length1 address2 length2>

  • compatible用来匹配machine_desc

  • interrupt-parent表示根节点所使用的中断控制器,如果子节点没有该属性,这和父节点共用。

(3) aliases(别名)

	aliases {ethernet0 = &gmac;i2c0 = &i2c0;i2c1 = &i2c1;i2c2 = &i2c2;i2c3 = &i2c3;i2c4 = &i2c4;i2c5 = &i2c5;mshc0 = &emmc;mshc1 = &sdmmc;mshc2 = &sdio0;mshc3 = &sdio1;serial0 = &uart0;serial1 = &uart1;serial2 = &uart2;serial3 = &uart3;serial4 = &uart4;spi0 = &spi0;spi1 = &spi1;spi2 = &spi2;};

定义节点别名

(4) arm-pmu(电源管理单元)

arm-pmu {compatible = "arm,cortex-a12-pmu";interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>;interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
};

这个节点的属性和属性值该如何定义?

  1. 到kernel\Documentation\devicetree\bindings\arm\pmu.txt查看文档说明,文档中给出了该节点的属性及说明。
  2. compatible属性,文档中给出了选项
"apm,potenza-pmu"
"arm,armv8-pmuv3"
"arm,cortex-a73-pmu"
"arm,cortex-a72-pmu"
"arm,cortex-a57-pmu"
"arm,cortex-a53-pmu"
"arm,cortex-a35-pmu"
"arm,cortex-a17-pmu"
"arm,cortex-a15-pmu"
"arm,cortex-a12-pmu"
"arm,cortex-a9-pmu"
"arm,cortex-a8-pmu"
"arm,cortex-a7-pmu"
"arm,cortex-a5-pmu"
"arm,arm11mpcore-pmu"
"arm,arm1176-pmu"
"arm,arm1136-pmu"
"brcm,vulcan-pmu"
"cavium,thunder-pmu"
"qcom,scorpion-pmu"
"qcom,scorpion-mp-pmu"
"qcom,krait-pmu"

然后根据cpu使用的arm核心版本来决定值,比如RK3288使用cortex-a12,所以选择"arm,cortex-a12-pmu"

  1. interrupts属性,文档中给出的解释是(1 combined interrupt or 1 per core)一个组合中断或一个核心一个中断。因为RK3288是4核的,所以interrupts组合了四个中断。然后每个中断对应的三个值。

为什么是三个值,每个值对应的含义是什么?

  1. 为什么是三个值,这跟中断控制器有关。上面说过子节点没有指定interrupt-parent属性,则和父节点共用,所以我们可以找到对应的中断控制器的定义。并找到它的compatible属性。
compatible = "arm,gic-400";

从上面的属性值可以找到中断控制器的类型为GIC (Generic Interrupt Controller),所以可以找到对应的说明文档kernel\Documentation\devicetree\bindings\interrupt-controller\arm,gic.txt

文档中说明GIC的**#interrupt-cells属性值应为3**,所以每个中断源对应三个值。
然后三个值对应的含义是什么,文档中也有解释。
1st cell:中断类型,0表示SPI中断,1表示PPI中断
2nd cell:该中断类型中的中断号,SPI中断的范围是[0-987], PPI中断范围是[0-15]
3rd cell : 标识, bit[3:0](1:上升沿触发 2:下降沿触发(SPI无效) 4:高电平触发 8:低电平触发(SPI无效) ) ; bit[15:8] (PPI中断掩码)

  1. <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>含义
    中断类型: SPI(GIC_SPI定义在arm-gic.h中),SPI表示该中断是所有cpu core共享的
    中断号: 151, RK3288 datasheet中给出的值是从0~159,该值具体如何定义还不清楚。
    标识: 高电平,RK3288 datasheet中说“Input interrupt level is fixed , only high-level sensitive”(输入中断仅高电平有效)

  2. interrupt-affinity属性用来关联中断和cpu core, 这个属性是和interrupts中的值一一对应的。即:
    <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH> --------> cpu0
    <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH> --------> cpu1
    <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH> --------> cpu2
    <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH> --------> cpu3

当超过一个SPI时interrupt-affinity属性必须出现

(5) sdmmc(SDIO)

sdmmc: dwmmc@ff0c0000 {compatible = "rockchip,rk3288-dw-mshc";max-frequency = <150000000>;clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";fifo-depth = <0x100>;interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;reg = <0x0 0xff0c0000 0x0 0x4000>;resets = <&cru SRST_MMC0>;reset-names = "reset";status = "disabled";
};
  1. 文档说明
    kernel\Documentation\devicetree\bindings\mmc\rockchip-dw-mshc.txt
    kernel\Documentation\devicetree\bindings\mmc\synopsy-dw-mshc.txt
    kernel\Documentation\devicetree\bindings\mmc\mmc.txt
    上面的文档对该节点中的属性都做了说明。

  2. max-frequency: 最大时钟频率,查看datasheet
    在这里插入图片描述

  3. clocks: 指定时钟单元和时钟阀门,这个要和clock-name一一对应的。这里指定了4个属性值,对应到clock-name也是四个属性值。

biu: bus interface unit(总线接口单元)
ciu: card interface unit(卡接口单元)
cru: clock reset unit(时钟复位单元)

  1. clock-names: 时钟名,和clocks一一对应
  2. fifo-depth: 输入输出(rx/tx)缓存的大小
  3. interrupts: 中断
  4. reg: 基地址和最大偏移量,为什么要用四个值(cell)呢?
    因为父节点#address-cells = <2> #size-cells = <2>, 主要是为了适配所有子节点,所以父节点多定义了一些cell。
    8)resets: 指定复位单元和复位说明符(指示哪个外设复位)。RK3288时钟单元和复位单元集成在同一个模块上(cru)。
  5. reset-names: 使用resets属性必须要有该属性,属性值必须是"reset"。
  6. status: 外设状态,两个取值: disabled和okay 。

(6) spi

spi0: spi@ff110000 {compatible = "rockchip,rk3288-spi", "rockchip,rk3066-spi";clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>;clock-names = "spiclk", "apb_pclk";dmas = <&dmac_peri 11>, <&dmac_peri 12>;dma-names = "tx", "rx";interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;pinctrl-names = "default";pinctrl-0 = <&spi0_clk &spi0_tx &spi0_rx &spi0_cs0>;reg = <0x0 0xff110000 0x0 0x1000>;#address-cells = <1>;#size-cells = <0>;status = "disabled";
};
  1. dmas: 指定spi总线中MISO, MOSI所使用的DMA通道。
    在这里插入图片描述
  2. pinctrl-names: 引脚配置名称(引脚默认状态),属性值可以为"default"或"sleep"。
  3. pinctrl-0: 引脚引用列表,这里主要是spi的引脚。每个引用点都必须是引脚控制器下的子节点。
  4. #address-cells和#size-cells主要是为了挂接在spi上的设备准备的。

总结:
(1) 上面的讲解主要是语法实践和如何来查找说明文档来进行配置。对于做二次开发的人来说主要是看芯片原厂给的文档和查看Documention\devicetree下的文档。当然也可以看datasheet, 只是没太大必要,而且很多芯片厂家不会提供完整的datasheet.
(2) 如果是芯片原厂工程师,主要是根据datasheet和Documention\devicetree下的文档来配置。有时候还要自定义属性。
(3) 属性值得配置一定要和驱动匹配。

欢迎大家关注我的微信公众号!!

这篇关于[DTS]设备树实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083855

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

【HarmonyOS】-TaskPool和Worker的对比实践

ArkTS提供了TaskPool与Worker两种多线程并发方案,下面我们将从其工作原理、使用效果对比两种方案的差异,进而选择适用于ArkTS图片编辑场景的并发方案。 TaskPool与Worker工作原理 TaskPool与Worker两种多线程并发能力均是基于 Actor并发模型实现的。Worker主、子线程通过收发消息进行通信;TaskPool基于Worker做了更多场景化的功能封装,例