节点语法
根节点
每个设备树文件只有一个根节点, stm32mp157d-atk.dts 和 stm32mp157d-atk.dtsi这两个文件根节点的内容会合并成一个根节点。
- Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的
/proc/device-tree
目录下根据节点名字创建不同文件夹,将设备树文件转化为拥有树状结构的文件夹系统,与linux下一切设备都是文件的理念相符合。
根节点compatible属性
节点compatible属性是为了将设备与驱动联系在一起的。根节点的这个属性也不例外。**"st,stm32mp157d-atk"描述了所使用的硬件设备名字;“st,stm32mp157”**描述了设备所使用的 SOC。
/ {
model = "STMicroelectronics STM32MP157C-DK2 Discovery Board";
compatible = "st,stm32mp157d-atk", "st,stm32mp157";
};
- 15系列分为151,155,157。其中151为最基础的型号。所以很多芯片资源定义都在151的设备树文件里,我们后期的开发需要引用这些设备树文件。
- 例如:i2c1 节点是定义在 stm32mp151.dtsi 文件中的,而 stm32mp151.dtsi 是共有的设备树头文件,其他所有使用到 stm32mp1 这颗 SOC 的板子都会引用 stm32mp151.dtsi 这个文件。
根节点的子结点
aliases 子节点
aliases 节点的主要功能就是定义别名,定义别名的目的就是为了方便访问节点。
aliases{
serial0 = &uart4;
serial1 = &usart3
serial2 = &uart5;
serial3 = &uart7;
}
chosen 子节点
chosen 并不是一个真实的设备,chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。
chosen {
stdout-path = "serial0:115200n8";
};
标准输出路径是serial0,而serial0已经定义为uart4。所以开发板启动后uart4为默认终端
CPU子结点
存放cpu资源,两个核心则拥有两个子节点。
SOC子结点
存放芯片上所有的内部外设,并且兼容属性为simple-bus
。
向根节点追加或者修改内容
修改节点内容或者添加节点数据
&i2c1 {
/* 要追加或修改的内容 */
};
以此种方式在本工程的设备树文件中向**“i2c1: i2c@40012000”**节点添加子结点,而不会影响其他型号的板子正常使用。
SOC外设
SOC(System on Chip,片上系统)是集成了多种功能模块和外设的单一芯片。OC内部外设指的是嵌入在SOC芯片内部的各种外部设备,这些设备在单个芯片上集成,以提供多样化的功能。下面是一些常见的SOC内部外设:
- UART(Universal Asynchronous Receiver-Transmitter):用于串行通信的外设,常用于与外部设备进行通信,如连接调试器、传感器等。
- SPI(Serial Peripheral Interface):用于串行通信的外设,常用于连接外部存储器、传感器、显示屏等。
- I2C(Inter-Integrated Circuit):用于连接多个芯片的串行通信总线,常用于连接各种外部设备,如温度传感器、电容式触摸屏等。
- GPIO(General Purpose Input/Output):通用输入输出端口,可以通过编程控制用于连接和控制各种外部设备。
- DMA(Direct Memory Access):直接内存访问控制器,用于高速数据传输,减轻CPU的负担。
- 定时器/计数器:用于生成精确的时间间隔,通常用于控制任务的执行时间或产生周期性信号。
- 时钟和时钟管理单元:用于生成和分配各种时钟信号,以驱动SOC内部的各个模块。
- 存储控制器:用于连接内部和外部存储设备,如闪存、DRAM等。
- DMA控制器:用于管理数据在内存和外部设备之间的直接传输,提高数据传输效率。
- 以太网控制器:用于网络通信,连接到以太网,实现网络功能。
- USB控制器:用于连接USB设备,实现USB通信和功能。
- GPU(Graphics Processing Unit):图形处理单元,用于图形加速和渲染。
- 加速器:如硬件加密模块、信号处理器等,用于加速特定任务的执行。
- 音频处理器:用于音频信号的输入、输出和处理。
- 视频处理器:用于视频信号的输入、输出和处理,如解码、编码等。
- 片上内存(SRAM、ROM等):用于存储程序代码、数据等。
- 看门狗计时器:用于监控系统运行状态,防止系统死锁。
- 温度传感器、电压传感器:用于监测芯片内部温度和电压等参数。
示例
1 i2c1最初的定义:
//芯片上的内部外设i2c设备。
i2c1: i2c@40012000 {
compatible = "st,stm32mp15-i2c";
reg = <0x40012000 0x400>;
//两个中断类型的名称
interrupt-names = "event", "error";
//定义了两个中断源
//一个为外部中断控制器节点(exti)的第21号中断
//一个为通用中断控制器节点(intc)的GIC——SPI 32号中断
//两个中断都是高电平触发(IRQ_TYPE_LEVEL_HIGH)。
interrupts-extended = <&exti 21 IRQ_TYPE_LEVEL_HIGH>,
<&intc GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
//时钟 由rcc设备节点的“I2C1_K”时钟提供。
clocks = <&rcc I2C1_K>;
//重置
resets = <&rcc I2C1_R>;
#address-cells = <1>;
#size-cells = <0>;
// 定义了两个DMA通道,分别接受"rx"发送"tx"数据。
//通道配置信息:dmamux通道号、起始地址和长度
dmas = <&dmamux1 33 0x400 0x80000001>,
<&dmamux1 34 0x400 0x80000001>;
//定义了通道名称
dma-names = "rx", "tx";
//指定了与该设备相关联的电源域为“pd_core”
power-domains = <&pd_core>;
//指定了syscfg寄存器的配置,具体的配置值为0x4和0x1。
st,syscfg-fmp = <&syscfg 0x4 0x1>;
//表示该设备可以作为唤醒源,可以唤醒系统。
wakeup-source;
status = "disabled";
};
2 对i2c1追加内容:
&i2c1 {
//指定了引脚控制的名称,即在默认模式下使用"default",在睡眠模式下使用"sleep"
pinctrl-names = "default", "sleep";
//不同的工作状态下定义了引脚的功能和电气属性。
pinctrl-0 = <&i2c1_pins_b>;
pinctrl-1 = <&i2c1_pins_sleep_b>;
status = "okay";
//时钟频率
clock-frequency = <100000>;
//子结点,fxls8471芯片。表示 I2C1 上连接的 fxls8471。
fxls8471@1e {
compatible = "fsl,fxls8471";
reg = <0x1e>;
position = <0>;
//指定了中断的父节点,即中断控制器的引用
interrupt-parent = <&gpioh>;
//指定了中断号和中断类型,即中断号为6,类型为下降沿触发。
interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
};
};