网站加速cdn自己做,dw怎么设计网页,网易企业邮箱登录登录入口网页版,别人抄袭网站设计怎么办书接上回#xff1a;Linux驱动开发—设备树基本概念#xff0c;语法详解-CSDN博客 文章目录 使用设备树描述中断使用设备树描述CPU节点CPU 节点缓存节点总结 使用设备树描述时钟总结 使用设备树描述GPIO示例设备树节点逐行解析GPIO 单元 使用设备树描述中断
在NXP 官方中截…书接上回Linux驱动开发—设备树基本概念语法详解-CSDN博客 文章目录 使用设备树描述中断使用设备树描述CPU节点CPU 节点缓存节点总结 使用设备树描述时钟总结 使用设备树描述GPIO示例设备树节点逐行解析GPIO 单元 使用设备树描述中断
在NXP 官方中截取部分设备树源码分析为例。
gpio5d0a0000 {compatible fsl,imx8qm-gpio\0fsl,imx35-gpio;reg 0x00 0x5d0a0000 0x00 0x10000;interrupts 0x00 0x8a 0x04;gpio-controller;#gpio-cells 0x02;power-domains 0x10e;interrupt-controller;#interrupt-cells 0x02;linux,phandle 0xea;phandle 0xea;
};分析中断信息主要关注以下几种字段;
interrupts: 定义与此GPIO控制器相关的中断属性。
0x00: 中断类型。0x8a: 中断号。0x04: 中断触发类型通常表示上升沿触发。
interrupt-controller: 表示这是一个中断控制器节点。interrupt-controller 属性是一个布尔属性用于标识该节点是一个中断控制器。它不需要赋值只要在节点中声明即可。操作系统在解析设备树时会识别该节点为一个中断控制器从而应用相应的处理逻辑。
#interrupt-cells: 定义中断描述的单元数量这里为2。在设备树中每个中断源都需要一个描述用于向操作系统传达如何配置和处理该中断源。
中断也可能是多级引用—中断控制器的级联如下源码所示 interrupt-controller51a00000 {compatible arm,gic-v3;reg 0x00 0x51a00000 0x00 0x10000 0x00 0x51b00000 0x00 0xc0000 0x00 0x52000000 0x00 0x2000 0x00 0x52010000 0x00 0x1000 0x00 0x52020000 0x00 0x20000;#interrupt-cells 0x03;interrupt-controller;interrupts 0x01 0x09 0x3f04;interrupt-parent 0x01;linux,phandle 0x01;phandle 0x01;};mu5d1c0000 {compatible fsl,imx8-mu;reg 0x00 0x5d1c0000 0x00 0x10000;interrupts 0x00 0xb1 0x04;interrupt-parent 0x01;fsl,scu_ap_mu_id 0x00;status okay;};interrupt-parent: 指向父中断控制器的引用值为0x01。
interrupts: 定义与此消息单元相关的中断属性。
0x00: 中断类型。0xb1: 中断号。0x04: 中断触发类型通常表示上升沿触发。
interrupt-controller: 表示这是一个中断控制器节点。
#interrupt-cells: 定义中断描述的单元数量这里为3。表示每个中断描述需要三个单元。
第一个单元中断类型或源。第二个单元中断号。第三个单元中断触发类型或标志。
使用设备树描述CPU节点
每个CPU节点包含了描述该CPU核心的属性例如兼容性、寄存器地址、时钟频率等。以NXP IMX8QM为例 cpus {#address-cells 0x02;#size-cells 0x00;idle-states {entry-method psci;cpu-sleep {compatible arm,idle-state;arm,psci-suspend-param 0x00;entry-latency-us 0x2bc;exit-latency-us 0xfa;min-residency-us 0x3e8;};cluster-sleep {compatible arm,idle-state;arm,psci-suspend-param 0x1000000;entry-latency-us 0x3e8;exit-latency-us 0x2bc;min-residency-us 0xa8c;wakeup-latency-us 0x5dc;};};cpu0 {device_type cpu;compatible arm,cortex-a53;reg 0x00 0x00;enable-method psci;next-level-cache 0x02;operating-points 0x124f80 0x00 0x10d880 0x00 0xdbba0 0x00 0x927c0 0x00;clocks 0x03 0x01;clock-latency 0xee6c;#cooling-cells 0x02;linux,phandle 0x6e;phandle 0x6e;};cpu1 {device_type cpu;compatible arm,cortex-a53;reg 0x00 0x01;enable-method psci;next-level-cache 0x02;};cpu2 {device_type cpu;compatible arm,cortex-a53;reg 0x00 0x02;enable-method psci;next-level-cache 0x02;};cpu3 {device_type cpu;compatible arm,cortex-a53;reg 0x00 0x03;enable-method psci;next-level-cache 0x02;};l2-cache0 {compatible cache;linux,phandle 0x02;phandle 0x02;};cpu100 {device_type cpu;compatible arm,cortex-a72\0arm,armv8;reg 0x00 0x100;enable-method psci;next-level-cache 0x04;operating-points 0x185a60 0x00 0x13c680 0x00 0x101d00 0x00 0x927c0 0x00;clocks 0x03 0x03;clock-latency 0xee6c;#cooling-cells 0x02;linux,phandle 0x05;phandle 0x05;};cpu101 {device_type cpu;compatible arm,cortex-a72\0arm,armv8;reg 0x00 0x101;enable-method psci;next-level-cache 0x04;linux,phandle 0x06;phandle 0x06;};l2-cache1 {compatible cache;linux,phandle 0x04;phandle 0x04;};};
CPU 节点
cpus节点里面包含物理CPU布局也就是CPU的布局全部在此节点下描述
注有些设备树中描述大小核CPU必须要用cpu-map使用Cluster描述同一类型CPU但是NXP中没有使用这种命名命名方式但是也将大小核心分开描述了
第一个簇 (Cluster) 的 CPU 节点
cpu0 到 cpu3: 定义四个 Cortex-A53 CPU核心。
device_type: 设备类型为cpu。compatible: 兼容属性标识为 arm,cortex-a53。reg: CPU的地址单元分别为 0x00 0x00, 0x00 0x01, 0x00 0x02, 0x00 0x03。enable-method: 启用方法为 psci。next-level-cache: 下一层缓存的引用值为 0x02。operating-points: 操作点包含频率和电压对。clocks: 时钟源。clock-latency: 时钟延迟值为 0xee6c。#cooling-cells: 冷却单元的数量值为 0x02。linux,phandle 和 phandle: 句柄用于唯一标识该节点。
第二个簇 (Cluster) 的 CPU 节点 cpu100 {device_type cpu;compatible arm,cortex-a72\0arm,armv8;reg 0x00 0x100;enable-method psci;next-level-cache 0x04;operating-points 0x185a60 0x00 0x13c680 0x00 0x101d00 0x00 0x927c0 0x00;clocks 0x03 0x03;clock-latency 0xee6c;#cooling-cells 0x02;linux,phandle 0x05;phandle 0x05;};cpu101 {device_type cpu;compatible arm,cortex-a72\0arm,armv8;reg 0x00 0x101;enable-method psci;next-level-cache 0x04;linux,phandle 0x06;phandle 0x06;};cpu100 和 cpu101: 定义两个 Cortex-A72 CPU核心。
device_type: 设备类型为cpu。compatible: 兼容属性标识为 arm,cortex-a72 和 arm,armv8。reg: CPU的地址单元分别为 0x00 0x100 和 0x00 0x101。enable-method: 启用方法为 psci。next-level-cache: 下一层缓存的引用值为 0x04。operating-points: 操作点包含频率和电压对。clocks: 时钟源。clock-latency: 时钟延迟值为 0xee6c。#cooling-cells: 冷却单元的数量值为 0x02。linux,phandle 和 phandle: 句柄用于唯一标识该节点。
缓存节点 l2-cache0 {compatible cache;linux,phandle 0x02;phandle 0x02;};l2-cache1 {compatible cache;linux,phandle 0x04;phandle 0x04;};
l2-cache0 和 l2-cache1: 定义两个二级缓存L2缓存。
compatible: 兼容属性标识为 cache。linux,phandle 和 phandle: 句柄用于唯一标识该节点。
总结
这段设备树描述了一个含有两个簇Cluster的多核系统其中第一个簇包含四个Cortex-A53 CPU核心第二个簇包含两个Cortex-A72 CPU核心。每个CPU节点包含兼容性、寄存器地址、启用方法、时钟、操作点等属性。还定义了两个二级缓存节点并描述了系统的空闲状态。这样操作系统可以根据设备树信息正确地初始化和管理各个CPU核心及其相关硬件。
使用设备树描述时钟
例如下方NXP源码
prg560c0000 {compatible fsl,imx8qm-prg;reg 0x00 0x560c0000 0x00 0x10000;clocks 0x03 0x144 0x03 0x13b;clock-names apb\0rtram;power-domains 0x0f;status okay;linux,phandle 0x79;phandle 0x79;};时钟属性
clocks 0x03 0x141 0x03 0x138;
clock-names apb\0rtram;clocks: 指定设备所需的时钟源。
0x03 0x141: 时钟控制器索引为 0x03中的时钟索引 0x141。0x03 0x138: 时钟控制器索引为 0x03中的时钟索引 0x138。
clock-names: 为时钟源命名。
apb\0rtram: 两个时钟源的名称分别是 apb 和 rtram。
下一个例子
i2c56226000 节点描述了一个 I2C 控制器的硬件信息重点关注时钟相关的属性
i2c56226000 {compatible fsl,imx8qm-lpi2c;reg 0x00 0x56226000 0x00 0x1000;interrupts 0x08 0x04;interrupt-parent 0x8a;clocks 0x03 0x1d3 0x03 0x2f6;clock-names per\0ipg;assigned-clocks 0x03 0x1d3;assigned-clock-rates 0x16e3600;power-domains 0x8b;status okay;#address-cells 0x01;#size-cells 0x00;pinctrl-names default;pinctrl-0 0x8c;clock-frequency 0x186a0;};
时钟属性解析
clocks 0x03 0x1d3 0x03 0x2f6;
clock-names per\0ipg;
assigned-clocks 0x03 0x1d3;
assigned-clock-rates 0x16e3600;clocks 属性指定了该 I2C 控制器所依赖的时钟源。
0x03 0x1d3 和 0x03 0x2f6
0x03 是时钟控制器的引用即时钟控制器节点。0x1d3 和 0x2f6 是时钟控制器中不同的时钟索引。
这表示该 I2C 控制器需要两个时钟源分别位于时钟控制器 0x03 的 0x1d3 和 0x2f6 索引处。
assigned-clocks 属性指定要配置的时钟源。在这个例子中是 0x03 0x1d3即 per 时钟。
assigned-clock-rates 属性定义了该时钟的频率这里是 0x16e3600即 24MHz。
总结
在驱动开发过程中不需要过多关注如何在设备树中编写时钟信息而是更应该关注如何在驱动代码中获取和解析这些时钟信息。时钟信息的具体内容和配置通常由硬件工程师或系统工程师来编写和验证。驱动开发者通过设备树提供的接口和 Linux 内核的时钟管理 API 来操作时钟而不需要深入了解时钟的硬件实现细节。这种分工可以提高开发效率和代码的可维护性。
使用设备树描述GPIO
使用设备树描述一个 GPIO 控制器时需要定义该控制器的基本属性如兼容性、寄存器地址、中断、GPIO 单元的数量等。以NXP源码为例
gpio5d0a0000 {compatible fsl,imx8qm-gpio, fsl,imx35-gpio;reg 0x00 0x5d0a0000 0x00 0x10000;interrupts 0x00 0x8a 0x04;gpio-controller;#gpio-cells 2;power-domains 0x10e;interrupt-controller;#interrupt-cells 2;linux,phandle 0xea;phandle 0xea;
};
使用设备树描述一个 GPIO 控制器时需要定义该控制器的基本属性如兼容性、寄存器地址、中断、GPIO 单元的数量等。以下是一个描述 GPIO 控制器的示例
示例设备树节点
gpio5d0a0000 {compatible fsl,imx8qm-gpio, fsl,imx35-gpio;reg 0x00 0x5d0a0000 0x00 0x10000;interrupts 0x00 0x8a 0x04;gpio-controller;#gpio-cells 2;power-domains 0x10e;interrupt-controller;#interrupt-cells 2;linux,phandle 0xea;phandle 0xea;
};逐行解析 节点名称和地址 gpio5d0a0000 {gpio5d0a0000表示 GPIO 控制器节点其地址为 0x5d0a0000。 兼容性 compatible fsl,imx8qm-gpio, fsl,imx35-gpio;compatible 属性表示设备兼容的驱动优先级从左到右。 寄存器地址 reg 0x00 0x5d0a0000 0x00 0x10000;reg 属性定义设备的寄存器地址范围。这里表示起始地址 0x5d0a0000大小为 0x10000 字节。 中断 interrupts 0x00 0x8a 0x04;interrupts 属性定义设备使用的中断。0x00 表示中断类型0x8a 是中断号0x04 是中断触发方式。 GPIO 控制器标志 gpio-controller;
#gpio-cells 2;gpio-controller 属性表示这是一个 GPIO 控制器。#gpio-cells 属性定义每个 GPIO 描述的单元数这里为 2。 电源域 power-domains 0x10e;power-domains 属性指定该设备所属的电源域。 中断控制器标志 interrupt-controller;
#interrupt-cells 2;interrupt-controller 属性表示这是一个中断控制器。#interrupt-cells 属性定义每个中断描述的单元数这里为 2。 phandle linux,phandle 0xea;
phandle 0xea;linux,phandle 和 phandle 属性是节点的唯一标识符用于引用该节点。
GPIO 单元
在设备树中#gpio-cells 属性用于定义 GPIO 控制器节点中的 GPIO 单元cells的数量和结构。这些单元描述了 GPIO 控制器的每个 GPIO 引脚的特性和配置。在具体应用中GPIO 单元通常用于描述某个设备连接到的特定 GPIO 引脚及其配置方式。
常见的单元包括
GPIO 引脚编号GPIO 控制器中引脚的编号。标志flags通常表示 GPIO 的输入/输出方向、上拉/下拉配置等。
在这个例子中#gpio-cells 2; 表示每个 GPIO 引脚用两个单元来描述。
具体使用示例**—万年不变的点一个LED灯**
假设有一个LED灯连接到某个 GPIO 引脚可以这么描述这个LED灯
led {compatible led_dev;gpios gpio1 5 0;
};这里gpios 属性定义了一个连接到 GPIO 控制器的 GPIO 引脚使用了三个参数
GPIO 控制器的 phandlegpio1 是一个指向 GPIO 控制器节点的引用。指定哪个 GPIO 控制器负责管理该引脚。GPIO 引脚编号5 表示 GPIO 控制器中的第 5 号引脚。标志flags0 表示无特殊标志通常用于表示 GPIO 引脚的配置如输入/输出方向等。标志的具体定义依赖于平台和 GPIO 控制器的实现。 文章转载自: http://www.morning.frpfk.cn.gov.cn.frpfk.cn http://www.morning.rckdq.cn.gov.cn.rckdq.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.fwwkr.cn.gov.cn.fwwkr.cn http://www.morning.qtsks.cn.gov.cn.qtsks.cn http://www.morning.shxmr.cn.gov.cn.shxmr.cn http://www.morning.rkdzm.cn.gov.cn.rkdzm.cn http://www.morning.wjlbb.cn.gov.cn.wjlbb.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.dmlsk.cn.gov.cn.dmlsk.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.rqhdt.cn.gov.cn.rqhdt.cn http://www.morning.jkftn.cn.gov.cn.jkftn.cn http://www.morning.mywmb.cn.gov.cn.mywmb.cn http://www.morning.qhrlb.cn.gov.cn.qhrlb.cn http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn http://www.morning.zymgs.cn.gov.cn.zymgs.cn http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.wmfr.cn.gov.cn.wmfr.cn http://www.morning.gfrjs.cn.gov.cn.gfrjs.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.wqgr.cn.gov.cn.wqgr.cn http://www.morning.bxfy.cn.gov.cn.bxfy.cn http://www.morning.rsnn.cn.gov.cn.rsnn.cn http://www.morning.mghgl.cn.gov.cn.mghgl.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.xnkb.cn.gov.cn.xnkb.cn http://www.morning.rrdch.cn.gov.cn.rrdch.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.jwfkk.cn.gov.cn.jwfkk.cn http://www.morning.ffksr.cn.gov.cn.ffksr.cn http://www.morning.xykst.cn.gov.cn.xykst.cn http://www.morning.znqxt.cn.gov.cn.znqxt.cn http://www.morning.xqspn.cn.gov.cn.xqspn.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.snrbl.cn.gov.cn.snrbl.cn http://www.morning.gswfs.cn.gov.cn.gswfs.cn http://www.morning.nwynx.cn.gov.cn.nwynx.cn http://www.morning.nwjd.cn.gov.cn.nwjd.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.hslgq.cn.gov.cn.hslgq.cn http://www.morning.brlcj.cn.gov.cn.brlcj.cn http://www.morning.lcwhn.cn.gov.cn.lcwhn.cn http://www.morning.rckdq.cn.gov.cn.rckdq.cn http://www.morning.rdbj.cn.gov.cn.rdbj.cn http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn http://www.morning.hxftm.cn.gov.cn.hxftm.cn http://www.morning.fglxh.cn.gov.cn.fglxh.cn http://www.morning.knnhd.cn.gov.cn.knnhd.cn http://www.morning.tqsmc.cn.gov.cn.tqsmc.cn http://www.morning.qbwyd.cn.gov.cn.qbwyd.cn http://www.morning.jynzb.cn.gov.cn.jynzb.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.zbkwj.cn.gov.cn.zbkwj.cn http://www.morning.zjcmr.cn.gov.cn.zjcmr.cn http://www.morning.dpruuode.cn.gov.cn.dpruuode.cn http://www.morning.dqpnd.cn.gov.cn.dqpnd.cn http://www.morning.mhlsx.cn.gov.cn.mhlsx.cn http://www.morning.gkgb.cn.gov.cn.gkgb.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.jzsgn.cn.gov.cn.jzsgn.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.nqypf.cn.gov.cn.nqypf.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.nnwnl.cn.gov.cn.nnwnl.cn http://www.morning.trffl.cn.gov.cn.trffl.cn http://www.morning.rszyf.cn.gov.cn.rszyf.cn http://www.morning.qqrlz.cn.gov.cn.qqrlz.cn http://www.morning.gqbks.cn.gov.cn.gqbks.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn http://www.morning.hotlads.com.gov.cn.hotlads.com http://www.morning.ktntj.cn.gov.cn.ktntj.cn http://www.morning.wglhz.cn.gov.cn.wglhz.cn