“Clock device tree configuration - Bootloader specif”的版本间的差异
Zhouyuebiao(讨论 | 贡献) (创建页面,内容为“== Article purpose == This article describes the specific '''RCC''' internal peripheral configuration done by the Boot chains overview…”) |
|||
(未显示同一用户的11个中间版本) | |||
第1行: | 第1行: | ||
== Article purpose == | == Article purpose == | ||
− | + | 本文介绍了由 [[Boot chains overview|first stage bootloader]] 执行的特定[[RCC internal peripheral|'''RCC''' internal peripheral]] 配置: | |
− | * [[TF-A overview|TF-A]] | + | * [[TF-A overview|TF-A]]用于可信启动链 |
− | * [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]] | + | * [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]对于基本启动链 |
− | {{Warning| | + | {{Warning|本文介绍了如何在启动时在 [[RCC_internal_peripheral|RCC]] 中配置时钟树。<br/>然后,您可以参考[[Clock device tree configuration|clock device tree configuration]] 文章来了解如何在Linux中导出每个内部外围设备时钟树<sup>®</sup> OS from the [[RCC_internal_peripheral|RCC]] 时钟树。}} |
− | + | 配置使用 [[Device tree|device tree]] 机制执行,该机制提供了 [[RCC_internal_peripheral|RCC]] 外围设备的硬件描述。 | |
− | + | 此时钟树仅在引导链FSBL的设备树中使用; 所以在TF-A设备树中为OpenSTLinux正式交付(或在SPL中仅用于DDR调优工具)。 | |
− | + | 即使 [[U-Boot_overview|U-Boot]] 设备树中也存在时钟树信息,该SSBL在引导过程中都不会使用它。 | |
== DT bindings documentation == | == DT bindings documentation == | ||
− | + | 引导加载程序时钟设备树绑定对应于FSBL的clk-stm32mp1驱动程序使用的供应商时钟DT绑定 ([[TF-A overview|TF-A]] 或 [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]), 它基于: | |
− | * | + | * [[Clock_device_tree_configuration]]中描述的绑定 |
− | * | + | * [[#DT configuration]]中描述的引导加载程序特定属性 |
− | + | 这个绑定文档解释了如何为 bootloader 端的时钟编写设备树文件: | |
− | * [[TF-A overview|TF-A]]: ''tf-a/docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt"<ref name="st,stm32mp1-rcc.txt"> {{CodeSource | TF-A | docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt}} [[TF-A overview|TF-A]] | + | * [[TF-A overview|TF-A]]: ''tf-a/docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt"<ref name="st,stm32mp1-rcc.txt"> {{CodeSource | TF-A | docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt}} [[TF-A overview|TF-A]] 时钟绑定信息文件</ref> |
− | * [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]: ''doc/device-tree-bindings/clock/st,stm32mp1.txt''<ref name="st,stm32mp1.txt">{{CodeSource | U-Boot | doc/device-tree-bindings/clock/st,stm32mp1.txt}} [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]] | + | * [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]: ''doc/device-tree-bindings/clock/st,stm32mp1.txt''<ref name="st,stm32mp1.txt">{{CodeSource | U-Boot | doc/device-tree-bindings/clock/st,stm32mp1.txt}} [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]] 时钟绑定信息文件</ref> |
== DT configuration == | == DT configuration == | ||
− | + | 该硬件描述是 '''STM32 microprocessor''' 设备树文件 (扩展名为''.dtsi'' ) 和 '''board''' 设备树文件 (''.dts'' extension)的组合。 有关设备树文件拆分的说明,请参阅 [[Device tree]]。 | |
− | '''STM32CubeMX''' | + | '''STM32CubeMX''' 可用于生成板设备树。有关详细信息,请参阅[[#How_to_configure_the_DT_using_STM32CubeMX|How to configure the DT using STM32CubeMX]]。 |
=== DT configuration (STM32 level) === | === DT configuration (STM32 level) === | ||
− | + | STM32MP1时钟节点位于 ''stm32mp157c.dtsi''<ref name="stm32mp157_pin_dtsi">中{{CodeSource | TF-A | fdts/stm32mp157c.dtsi}} (for [[TF-A overview|TF-A]]), {{CodeSource | U-Boot| arch/arm/dts/stm32mp157c.dtsi }} (for [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]): STM32MP157C 设备树文件</ref> (有关详细信息,请参阅[[Device tree]] ): | |
− | * | + | * 固定时钟定义在 [[#clock node|clock node]] |
− | * [[RCC_internal_peripheral|RCC]] | + | * [[RCC_internal_peripheral|RCC]] 节点,用于[[#STM32MP1 clock node]]: 时钟生成和分配。 |
/ { | / { | ||
第60行: | 第60行: | ||
}; | }; | ||
− | + | 有关Linux<sup>®</sup>内核常见的绑定,请参考 [[Clock device tree configuration|clock device tree configuration]] 。 | |
=== DT configuration (board level) === | === DT configuration (board level) === | ||
==== Clock node ==== | ==== Clock node ==== | ||
− | + | 时钟树也基于时钟节点中的五个固定时钟。它们用于定义相关ST32MP1振荡器的状态: | |
* clk-lsi | * clk-lsi | ||
* clk-lse | * clk-lse | ||
第70行: | 第70行: | ||
* clk-hse | * clk-hse | ||
* clk-csi | * clk-csi | ||
− | + | 详细信息请参考[[Clock device tree configuration|clock device tree configuration]]。 | |
− | + | 在引导时,时钟树初始化执行以下任务: | |
− | * | + | * 启用设备树中存在的且未禁用的振荡器(状态为“ disabled”的节点), |
− | * | + | * 如果节点不存在或被禁用,则禁用HSI振荡器(HSI始终由ROM代码激活)。 |
− | + | 此信息位于以下文件中: | |
* STM32MP157C-EV: | * STM32MP157C-EV: | ||
** [[TF-A overview|TF-A]]: ''fdts/stm32mp157c-ed1.dts''<ref name="stm32mp157c-ed1">{{CodeSource | TF-A | fdts/stm32mp157c-ed1.dts}} STM32MP157C-EV device tree file for [[TF-A overview|TF-A]]</ref> | ** [[TF-A overview|TF-A]]: ''fdts/stm32mp157c-ed1.dts''<ref name="stm32mp157c-ed1">{{CodeSource | TF-A | fdts/stm32mp157c-ed1.dts}} STM32MP157C-EV device tree file for [[TF-A overview|TF-A]]</ref> | ||
第86行: | 第86行: | ||
===== Optional properties for "clk-lse" and "clk-hse" external oscillators ===== | ===== Optional properties for "clk-lse" and "clk-hse" external oscillators ===== | ||
− | + | 对于外部振荡器HSE和LSE,默认时钟配置是外部晶体/陶瓷谐振器。 | |
− | + | 支持四个可选字段: | |
− | * "st,bypass" | + | * "st,bypass" 配置外部模拟时钟源 (set HSEBYP, LSEBYP), |
− | * "st,digbypass" | + | * "st,digbypass" 配置外部数字时钟源 (set DIGBYP and HSEBYP, LSEBYP), |
− | * "st,css" | + | * "st,css" 启动时钟安全系统 (HSECSSON, LSECSSON), |
− | * "st,drive" (LSE only) | + | * "st,drive" (LSE only) 包含振荡器的驱动器值 (请参阅文件“stm32mp1-clksrc.h”中定义的LSEDRV_<ref name="stm32mp1-clksrc">{{CodeSource | TF-A | include/dt-bindings/clock/stm32mp1-clksrc.h}} (for [[TF-A overview|TF-A]]), {{CodeSource | U-Boot | include/dt-bindings/clock/stm32mp1-clksrc.h}} (for [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]): STM32MP1 DT绑定时钟源文件</ref>). |
===== DT configuration for HSE ===== | ===== DT configuration for HSE ===== | ||
− | + | HSE可以在OSC_IN上接受数字或模拟的外部晶体/陶瓷或外部时钟源:用户需要根据硬件设置在设备树中选择正确的频率和正确的配置。 | |
− | + | 所有ST板均使用数字外部时钟配置 (因此,设备树中包含 = st,digbypass). | |
− | + | 例如,在相同的24MHz频率下,我们有3种配置: | |
[[File:Hse config.jpg|800px|none|]] | [[File:Hse config.jpg|800px|none|]] | ||
− | * | + | * 数字外部时钟 = st,digbypass |
/ { | / { | ||
clocks { | clocks { | ||
第115行: | 第115行: | ||
}; | }; | ||
− | * | + | * 模拟外部时钟 = st,bypass |
/ { | / { | ||
clocks { | clocks { | ||
第126行: | 第126行: | ||
}; | }; | ||
− | * | + | * 晶体/陶瓷谐振器配置 |
/ { | / { | ||
clocks { | clocks { | ||
第138行: | 第138行: | ||
===== DT configuration for LSE ===== | ===== DT configuration for LSE ===== | ||
− | + | 下面是一个带有 32768 kHz 晶体谐振器的LSE板上文件示例,该驱动器设置为中高电平,并具有激活的时钟安全系统。 | |
/ { | / { | ||
第152行: | 第152行: | ||
===== Optional property for "clk-hsi" internal oscillator ===== | ===== Optional property for "clk-hsi" internal oscillator ===== | ||
− | + | 对于STM32MP15设备,HSI时钟频率在内部固定为64 MHz。 | |
− | + | 在设备树中,clk-hsi是HSIDIV分频器之后的时钟 (有关clk_hsi的更多信息,请参见 [[STM32MP15 resources|reference manual]]中的RCC章节)。<br/> | |
− | + | 因此,该固定时钟的频率用于计算时钟树初始化的预期HSIDIV。 | |
− | + | 以下是HSIDIV的示例 = 1/1: | |
/ { | / { | ||
第168行: | 第168行: | ||
}; | }; | ||
− | + | 以下是HSIDIV的示例 = 1/2: | |
/ { | / { | ||
clocks { | clocks { | ||
第180行: | 第180行: | ||
===== Clock node example ===== | ===== Clock node example ===== | ||
− | + | 时钟节点的示例包括: | |
− | * | + | * 所有振荡器打开(HSE, HSI, LSE, LSI, CSI) |
− | * | + | * 64MHZ时的HSI (HSIDIV = 1/1) |
− | * | + | * 使用24MHz数字外部时钟的HSE |
− | * | + | * LSE使用外部晶体a 32.768kHz(典型频率) |
− | + | 我们重点介绍定制部件: | |
/ { | / { | ||
clocks { | clocks { | ||
第222行: | 第222行: | ||
}; | }; | ||
− | + | 因此,基于SoC设备树“ stm32mp157c.dtsi”的最终电路板设备树为: | |
− | |||
#include "stm32mp157c.dtsi" | #include "stm32mp157c.dtsi" | ||
&clk_hse { | &clk_hse { | ||
第238行: | 第237行: | ||
}; | }; | ||
− | + | 它是TF-A用于STM32MP157C-EV <ref name="stm32mp157c-ed1"/>的配置 | |
==== STM32MP1 clock node ==== | ==== STM32MP1 clock node ==== | ||
− | + | 有关如何在时钟说明符中指定单元数的信息,请参考[[Clock device tree configuration|clock device tree configuration]] 。 | |
− | + | 引导加载程序执行全局时钟初始化,如下所述。与给定电路板相关的信息可以在[[#clock_node|clock node]]中列出的板特定设备树文件中找到。 | |
− | + | 引导加载程序使用[[RCC_internal_peripheral|RCC]]节点的其他属性 ("st,stm32mp1-rcc" 兼容): | |
− | * secure-status: | + | * secure-status: 与RCC_TZCR寄存器中的TZEN位配置有关,允许限制RCC和PWR寄存器的写访问 |
− | * st,clksrc: | + | * st,clksrc: 时钟源配置阵列 |
− | * st,clkdiv: | + | * st,clkdiv: 时钟分频器配置阵列 |
− | * st,pll: | + | * st,pll: 特定PLL配置 |
− | * st,pkcs: | + | * st,pkcs: 外围内核时钟分布配置阵列。 |
− | + | 所有可用的时钟都在''stm32mp1-clks.h''<ref name="stm32mp1-clks">{{CodeSource | TF-A | include/dt-bindings/clock/stm32mp1-clks.h}} (for [[TF-A overview|TF-A]]), {{CodeSource | U-Boot | include/dt-bindings/clock/stm32mp1-clks.h}} (for [[U-Boot_overview#SPL:_FSBL_for_basic_boot|U-Boot SPL]]):STM32MP1 DT绑定时钟标识符文件</ref> 并且可以在设备树源中使用。 | |
===== Defining clock source distribution with st,clksrc property ===== | ===== Defining clock source distribution with st,clksrc property ===== | ||
− | + | 此属性可用于配置时钟分配树。使用时,它必须描述整个分发树。 | |
− | + | STM32MP15设备有九个时钟源选择器。它们必须按以下顺序配置:MPU、AXI、MCU、PLL12、PLL3、PLL4、RTC、MCO1和MCO2。 | |
− | + | 时钟源配置值由位于 ''stm32mp1-clksrc.h''<ref name="stm32mp1-clksrc"></ref>中的CLK_ <NAME> _ <SOURCE>宏定义。 | |
− | + | 例如: | |
<pre> | <pre> | ||
st,clksrc = < | st,clksrc = < | ||
第277行: | 第276行: | ||
===== Defining clock dividers with st,clkdiv property ===== | ===== Defining clock dividers with st,clkdiv property ===== | ||
− | + | 此属性可用于配置时钟主分频器的值。 使用时,它必须描述整个时钟分频器树。 | |
− | + | STM32MP15器件有11个分频器值。 必须按照以下顺序进行配置:MPU,AXI,MCU,APB1,APB2,APB3,APB4,APB5,RTC,MCO1和MCO2。 | |
− | + | 每个分频器值都使用 [[RCC_internal_peripheral|RCC]] 关联寄存器RCC_xxxDIVR中定义的DIV编码。 在大多数情况下,该值如下: | |
* 0x0: not divided | * 0x0: not divided | ||
* 0x1: division by 2 | * 0x1: division by 2 | ||
第288行: | 第287行: | ||
* ... | * ... | ||
− | + | 请注意,RTC MCO1和MCO2的编码不同 | |
* 0x0: not divided | * 0x0: not divided | ||
* 0x1: division by 2 | * 0x1: division by 2 | ||
第295行: | 第294行: | ||
* ... | * ... | ||
− | + | 示例: | |
<pre> | <pre> | ||
st,clkdiv = < | st,clkdiv = < | ||
第313行: | 第312行: | ||
===== Defining peripheral PLL frequencies with st,pll property ===== | ===== Defining peripheral PLL frequencies with st,pll property ===== | ||
− | + | 此属性可用于配置PLL频率。 | |
− | + | PLL1至PLL4的PLL子节点 (有关详细信息,请参见 [[STM32MP15 resources|reference manual]] ) 与从0到3(st,pll@0 to st,pll@3)的索引相关联。当关联节点不存在时,PLLx关闭。 | |
− | ''' | + | '''对于 {{EcosystemRelease | revision=1.2.0 | range=and after}}''', TF-A会自动选择最适合平台的工作点(请参考 [[How to change the CPU frequency]]), 因此不再需要PLL1节点。 |
− | + | 下面是每个PLL节点的可用属性: | |
− | * | + | * cfg按以下顺序包含PLL配置参数:DIVM,DIVN,DIVP,DIVQ,DIVR,output. |
− | :: DIVx | + | :: DIVx 值定义为[[RCC_internal_peripheral|RCC]]: |
:::* 0x0: bypass (division by 1) | :::* 0x0: bypass (division by 1) | ||
:::* 0x1: division by 2 | :::* 0x1: division by 2 | ||
第328行: | 第327行: | ||
:::* ... | :::* ... | ||
− | :: | + | :: 输出包含每个输出值的位字段 (1:ON / 0:OFF) |
:::* BIT(0) → output P : DIVPEN | :::* BIT(0) → output P : DIVPEN | ||
:::* BIT(1) → output Q : DIVQEN | :::* BIT(1) → output Q : DIVQEN | ||
第334行: | 第333行: | ||
:::Note: PQR(p,q,r) macro can be used to build this value with p, q, r = 0 or 1. | :::Note: PQR(p,q,r) macro can be used to build this value with p, q, r = 0 or 1. | ||
− | * frac: | + | * frac: 乘法因子的小数部分 (可选,当缺少PLL时,它处于整数模式). |
− | * csg | + | * csg 包含时钟扩展发生器参数(可选),顺序如下:MOD_PER,INC_STEP和SSCG_MODE。 |
:: MOD_PER: modulation period adjustment | :: MOD_PER: modulation period adjustment | ||
:: INC_STEP: modulation depth adjustment | :: INC_STEP: modulation depth adjustment | ||
− | :: SSCG_MODE: | + | :: SSCG_MODE: 扩频时钟发生器模式,在''stm32mp1-clksrc.h''<ref name="stm32mp1-clksrc"></ref>中定义: |
:::* SSCG_MODE_CENTER_SPREAD = 0 | :::* SSCG_MODE_CENTER_SPREAD = 0 | ||
:::* SSCG_MODE_DOWN_SPREAD = 1 | :::* SSCG_MODE_DOWN_SPREAD = 1 | ||
第363行: | 第362行: | ||
===== Defining peripheral kernel clock tree distribution with st,pkcs property ===== | ===== Defining peripheral kernel clock tree distribution with st,pkcs property ===== | ||
− | + | 此属性可用于配置外围内核时钟选择。 | |
+ | |||
− | + | 它是由''stm32mp1-clksrc.h''<ref name="stm32mp1-clksrc"></ref> 头文件中的CLK_<KERNEL-CLOCK>_<PARENT-CLOCK>宏定义的外围内核时钟源标识符的列表。 | |
− | + | st,pkcs可能没有列出所有的内核时钟。无需具体订单。 | |
Example: | Example: | ||
第383行: | 第383行: | ||
===== HSI and CSI clocks calibration ===== | ===== HSI and CSI clocks calibration ===== | ||
− | The [[How_to_activate_HSI_and_CSI_oscillators_calibration|calibration]] | + | The [[How_to_activate_HSI_and_CSI_oscillators_calibration|calibration]] 是一个可选功能,可以从设备树中启用。 允许通过多种方式请求HSI或CSI时钟校准: |
− | + | * SiP SMC 服务 | |
− | * SiP SMC | + | * 每X秒定期校准一次 |
− | * | + | * MCU引发的中断 |
− | * | ||
− | + | 此功能要求为校准序列分配硬件计时器。 | |
− | + | 必须使用“mcu_sev”名称定义专用中断,以便在检测到MCU引发的中断时开始校准。 | |
− | * st,hsi-cal: | + | * st,hsi-cal: 用于启用HSI时钟校准功能。 |
− | * st,csi-cal; | + | * st,csi-cal; 用于启用CSI时钟校准功能。 |
− | * st,cal-sec: | + | * st,cal-sec: 用于启用来自安全监视器的指定时间间隔的定期校准。 时间间隔必须以秒为单位。如果未指定,则仅对每个传入请求进行校准。 |
− | + | 示例: | |
<pre> | <pre> | ||
&rcc { | &rcc { | ||
第410行: | 第409行: | ||
==How to configure the DT using STM32CubeMX== | ==How to configure the DT using STM32CubeMX== | ||
− | The [[STM32CubeMX]] | + | The [[STM32CubeMX]] 工具可用于配置STM32MPU设备并获取相应的 [[Device_tree#STM32|platform configuration device tree]] 文件。 |
− | + | STM32CubeMX可能不支持上述[[#DT bindings documentation|DT bindings documentation]] 段中描述的所有属性。 <br />如果是,该工具将在生成的设备树中插入“用户部分”。<br /> 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 | |
− | + | 有关详细信息,请参阅 [[STM32CubeMX]] 用户手册。 | |
==References== | ==References== | ||
− | + | 有关其他信息,请参阅以下链接 | |
<references /> | <references /> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
2020年11月4日 (三) 17:38的最新版本
目录
- 1 Article purpose
- 2 DT bindings documentation
-
3 DT configuration
- 3.1 DT configuration (STM32 level)
-
3.2 DT configuration (board level)
- 3.2.1 Clock node
-
3.2.2 STM32MP1 clock node
- 3.2.2.1 Defining clock source distribution with st,clksrc property
- 3.2.2.2 Defining clock dividers with st,clkdiv property
- 3.2.2.3 Defining peripheral PLL frequencies with st,pll property
- 3.2.2.4 Defining peripheral kernel clock tree distribution with st,pkcs property
- 3.2.2.5 HSI and CSI clocks calibration
- 4 How to configure the DT using STM32CubeMX
- 5 References
Article purpose
本文介绍了由 first stage bootloader 执行的特定RCC internal peripheral 配置:
- TF-A用于可信启动链
- U-Boot SPL对于基本启动链
本文介绍了如何在启动时在 RCC 中配置时钟树。 然后,您可以参考clock device tree configuration 文章来了解如何在Linux中导出每个内部外围设备时钟树® OS from the RCC 时钟树。 |
配置使用 device tree 机制执行,该机制提供了 RCC 外围设备的硬件描述。
此时钟树仅在引导链FSBL的设备树中使用; 所以在TF-A设备树中为OpenSTLinux正式交付(或在SPL中仅用于DDR调优工具)。
即使 U-Boot 设备树中也存在时钟树信息,该SSBL在引导过程中都不会使用它。
DT bindings documentation
引导加载程序时钟设备树绑定对应于FSBL的clk-stm32mp1驱动程序使用的供应商时钟DT绑定 (TF-A 或 U-Boot SPL), 它基于:
- Clock_device_tree_configuration中描述的绑定
- #DT configuration中描述的引导加载程序特定属性
这个绑定文档解释了如何为 bootloader 端的时钟编写设备树文件:
- TF-A: tf-a/docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt"[1]
- U-Boot SPL: doc/device-tree-bindings/clock/st,stm32mp1.txt[2]
DT configuration
该硬件描述是 STM32 microprocessor 设备树文件 (扩展名为.dtsi ) 和 board 设备树文件 (.dts extension)的组合。 有关设备树文件拆分的说明,请参阅 Device tree。
STM32CubeMX 可用于生成板设备树。有关详细信息,请参阅How to configure the DT using STM32CubeMX。
DT configuration (STM32 level)
STM32MP1时钟节点位于 stm32mp157c.dtsi[3] (有关详细信息,请参阅Device tree ):
- 固定时钟定义在 clock node
- RCC 节点,用于#STM32MP1 clock node: 时钟生成和分配。
/ { ... clocks { clk_hse: clk-hse { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <24000000>; }; ... }; ... soc { ... rcc: rcc@50000000 { compatible = "st,stm32mp1-rcc", "syscon"; reg = <0x50000000 0x1000>; #clock-cells = <1>; #reset-cells = <1>; interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; }; ... }; };
有关Linux®内核常见的绑定,请参考 clock device tree configuration 。
DT configuration (board level)
Clock node
时钟树也基于时钟节点中的五个固定时钟。它们用于定义相关ST32MP1振荡器的状态:
- clk-lsi
- clk-lse
- clk-hsi
- clk-hse
- clk-csi
详细信息请参考clock device tree configuration。
在引导时,时钟树初始化执行以下任务:
- 启用设备树中存在的且未禁用的振荡器(状态为“ disabled”的节点),
- 如果节点不存在或被禁用,则禁用HSI振荡器(HSI始终由ROM代码激活)。
此信息位于以下文件中:
- STM32MP157C-EV:
- TF-A: fdts/stm32mp157c-ed1.dts[4]
- U-Boot SPL: arch/arm/dts/stm32mp157c-ed1-u-boot.dtsi[5]
- STM32MP157X-DK:
- TF-A: fdts/stm32mp157a-dk1.dts[6].
- U-Boot SPL: arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi[7].
Optional properties for "clk-lse" and "clk-hse" external oscillators
对于外部振荡器HSE和LSE,默认时钟配置是外部晶体/陶瓷谐振器。
支持四个可选字段:
- "st,bypass" 配置外部模拟时钟源 (set HSEBYP, LSEBYP),
- "st,digbypass" 配置外部数字时钟源 (set DIGBYP and HSEBYP, LSEBYP),
- "st,css" 启动时钟安全系统 (HSECSSON, LSECSSON),
- "st,drive" (LSE only) 包含振荡器的驱动器值 (请参阅文件“stm32mp1-clksrc.h”中定义的LSEDRV_[8]).
DT configuration for HSE
HSE可以在OSC_IN上接受数字或模拟的外部晶体/陶瓷或外部时钟源:用户需要根据硬件设置在设备树中选择正确的频率和正确的配置。
所有ST板均使用数字外部时钟配置 (因此,设备树中包含 = st,digbypass).
例如,在相同的24MHz频率下,我们有3种配置:
- 数字外部时钟 = st,digbypass
/ { clocks { clk_hse: clk-hse { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <24000000>; st,digbypass; }; };
- 模拟外部时钟 = st,bypass
/ { clocks { clk_hse: clk-hse { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <24000000>; st,bypass; }; };
- 晶体/陶瓷谐振器配置
/ {
clocks {
clk_hse: clk-hse {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <24000000>;
};
};
DT configuration for LSE
下面是一个带有 32768 kHz 晶体谐振器的LSE板上文件示例,该驱动器设置为中高电平,并具有激活的时钟安全系统。
/ { clocks { clk_lse: clk-lse { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <32768>; st,css; st,drive = <LSEDRV_MEDIUM_HIGH>; }; };
Optional property for "clk-hsi" internal oscillator
对于STM32MP15设备,HSI时钟频率在内部固定为64 MHz。
在设备树中,clk-hsi是HSIDIV分频器之后的时钟 (有关clk_hsi的更多信息,请参见 reference manual中的RCC章节)。
因此,该固定时钟的频率用于计算时钟树初始化的预期HSIDIV。
以下是HSIDIV的示例 = 1/1:
/ {
clocks {
clk_hsi: clk-hsi {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <64000000>;
};
};
以下是HSIDIV的示例 = 1/2:
/ {
clocks {
clk_hsi: clk-hsi {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <32000000>;
};
};
Clock node example
时钟节点的示例包括:
- 所有振荡器打开(HSE, HSI, LSE, LSI, CSI)
- 64MHZ时的HSI (HSIDIV = 1/1)
- 使用24MHz数字外部时钟的HSE
- LSE使用外部晶体a 32.768kHz(典型频率)
我们重点介绍定制部件:
/ { clocks { clk_hse: clk-hse { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <24000000>; st,digbypass; }; clk_hsi: clk-hsi { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <64000000>; }; clk_lse: clk-lse { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <32768>; }; clk_lsi: clk-lsi { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <32000>; }; clk_csi: clk-csi { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <4000000>; }; }; };
因此,基于SoC设备树“ stm32mp157c.dtsi”的最终电路板设备树为:
#include "stm32mp157c.dtsi" &clk_hse { clock-frequency = <24000000>; st,digbypass; }; &clk_hsi { clock-frequency = <64000000>; }; &clk_lse { clock-frequency = <32768>; };
它是TF-A用于STM32MP157C-EV [4]的配置
STM32MP1 clock node
有关如何在时钟说明符中指定单元数的信息,请参考clock device tree configuration 。
引导加载程序执行全局时钟初始化,如下所述。与给定电路板相关的信息可以在clock node中列出的板特定设备树文件中找到。
引导加载程序使用RCC节点的其他属性 ("st,stm32mp1-rcc" 兼容):
- secure-status: 与RCC_TZCR寄存器中的TZEN位配置有关,允许限制RCC和PWR寄存器的写访问
- st,clksrc: 时钟源配置阵列
- st,clkdiv: 时钟分频器配置阵列
- st,pll: 特定PLL配置
- st,pkcs: 外围内核时钟分布配置阵列。
所有可用的时钟都在stm32mp1-clks.h[9] 并且可以在设备树源中使用。
Defining clock source distribution with st,clksrc property
此属性可用于配置时钟分配树。使用时,它必须描述整个分发树。
STM32MP15设备有九个时钟源选择器。它们必须按以下顺序配置:MPU、AXI、MCU、PLL12、PLL3、PLL4、RTC、MCO1和MCO2。
时钟源配置值由位于 stm32mp1-clksrc.h[8]中的CLK_ <NAME> _ <SOURCE>宏定义。
例如:
st,clksrc = < CLK_MPU_PLL1P CLK_AXI_PLL2P CLK_MCU_PLL3P CLK_PLL12_HSE CLK_PLL3_HSE CLK_PLL4_HSE CLK_RTC_LSE CLK_MCO1_DISABLED CLK_MCO2_DISABLED >;
Defining clock dividers with st,clkdiv property
此属性可用于配置时钟主分频器的值。 使用时,它必须描述整个时钟分频器树。
STM32MP15器件有11个分频器值。 必须按照以下顺序进行配置:MPU,AXI,MCU,APB1,APB2,APB3,APB4,APB5,RTC,MCO1和MCO2。
每个分频器值都使用 RCC 关联寄存器RCC_xxxDIVR中定义的DIV编码。 在大多数情况下,该值如下:
- 0x0: not divided
- 0x1: division by 2
- 0x2: division by 4
- 0x3: division by 8
- ...
请注意,RTC MCO1和MCO2的编码不同
- 0x0: not divided
- 0x1: division by 2
- 0x2: division by 3
- 0x3: division by 4
- ...
示例:
st,clkdiv = < 1 /*MPU*/ 0 /*AXI*/ 0 /*MCU*/ 1 /*APB1*/ 1 /*APB2*/ 1 /*APB3*/ 1 /*APB4*/ 2 /*APB5*/ 23 /*RTC*/ 0 /*MCO1*/ 0 /*MCO2*/ >;
Defining peripheral PLL frequencies with st,pll property
此属性可用于配置PLL频率。
PLL1至PLL4的PLL子节点 (有关详细信息,请参见 reference manual ) 与从0到3(st,pll@0 to st,pll@3)的索引相关联。当关联节点不存在时,PLLx关闭。
对于 ecosystem release ≥ v1.2.0{{#set:Ecosystem release=revision of a previous flow 1.2.0}} , TF-A会自动选择最适合平台的工作点(请参考 如何更改CPU频率), 因此不再需要PLL1节点。
下面是每个PLL节点的可用属性:
- cfg按以下顺序包含PLL配置参数:DIVM,DIVN,DIVP,DIVQ,DIVR,output.
- DIVx 值定义为RCC:
- 0x0: bypass (division by 1)
- 0x1: division by 2
- 0x2: division by 3
- 0x3: division by 4
- ...
- DIVx 值定义为RCC:
- 输出包含每个输出值的位字段 (1:ON / 0:OFF)
- BIT(0) → output P : DIVPEN
- BIT(1) → output Q : DIVQEN
- BIT(2) → output R : DIVREN
- Note: PQR(p,q,r) macro can be used to build this value with p, q, r = 0 or 1.
- 输出包含每个输出值的位字段 (1:ON / 0:OFF)
- frac: 乘法因子的小数部分 (可选,当缺少PLL时,它处于整数模式).
- csg 包含时钟扩展发生器参数(可选),顺序如下:MOD_PER,INC_STEP和SSCG_MODE。
- MOD_PER: modulation period adjustment
- INC_STEP: modulation depth adjustment
- SSCG_MODE: 扩频时钟发生器模式,在stm32mp1-clksrc.h[8]中定义:
- SSCG_MODE_CENTER_SPREAD = 0
- SSCG_MODE_DOWN_SPREAD = 1
Example:
st,pll@0 { cfg = < 1 53 0 0 0 1 >; frac = < 0x810 >; }; st,pll@1 { cfg = < 1 43 1 0 0 PQR(0,1,1) >; csg = < 10 20 1 >; }; st,pll@2 { cfg = < 2 85 3 13 3 0 >; csg = < 10 20 SSCG_MODE_CENTER_SPREAD >; }; st,pll@3 { cfg = < 2 78 4 7 9 3 >; };
Defining peripheral kernel clock tree distribution with st,pkcs property
此属性可用于配置外围内核时钟选择。
它是由stm32mp1-clksrc.h[8] 头文件中的CLK_<KERNEL-CLOCK>_<PARENT-CLOCK>宏定义的外围内核时钟源标识符的列表。
st,pkcs可能没有列出所有的内核时钟。无需具体订单。
Example:
st,pkcs = < CLK_STGEN_HSE CLK_CKPER_HSI CLK_USBPHY_PLL2P CLK_DSI_PLL2Q CLK_I2C46_HSI CLK_UART1_HSI CLK_UART24_HSI >;
HSI and CSI clocks calibration
The calibration 是一个可选功能,可以从设备树中启用。 允许通过多种方式请求HSI或CSI时钟校准:
- SiP SMC 服务
- 每X秒定期校准一次
- MCU引发的中断
此功能要求为校准序列分配硬件计时器。
必须使用“mcu_sev”名称定义专用中断,以便在检测到MCU引发的中断时开始校准。
- st,hsi-cal: 用于启用HSI时钟校准功能。
- st,csi-cal; 用于启用CSI时钟校准功能。
- st,cal-sec: 用于启用来自安全监视器的指定时间间隔的定期校准。 时间间隔必须以秒为单位。如果未指定,则仅对每个传入请求进行校准。
示例:
&rcc { st,hsi-cal; st,csi-cal; st,cal-sec = <15>; secure-interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "mcu_sev", "wakeup"; };
How to configure the DT using STM32CubeMX
The STM32CubeMX 工具可用于配置STM32MPU设备并获取相应的 platform configuration device tree 文件。
STM32CubeMX可能不支持上述DT bindings documentation 段中描述的所有属性。
如果是,该工具将在生成的设备树中插入“用户部分”。
然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。
有关详细信息,请参阅 STM32CubeMX 用户手册。
References
有关其他信息,请参阅以下链接
- ↑ docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt| |}} docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt TF-A 时钟绑定信息文件
- ↑ doc/device-tree-bindings/clock/st,stm32mp1.txt| |}} doc/device-tree-bindings/clock/st,stm32mp1.txt U-Boot SPL 时钟绑定信息文件
- ↑ 中fdts/stm32mp157c.dtsi| |}} fdts/stm32mp157c.dtsi (for TF-A), arch/arm/dts/stm32mp157c.dtsi | |}} arch/arm/dts/stm32mp157c.dtsi (for U-Boot SPL): STM32MP157C 设备树文件
- ↑ 4.04.1 fdts/stm32mp157c-ed1.dts| |}} fdts/stm32mp157c-ed1.dts STM32MP157C-EV device tree file for TF-A
- ↑ arch/arm/dts/stm32mp157c-ed1-u-boot.dtsi| |}} arch/arm/dts/stm32mp157c-ed1-u-boot.dtsi STM32MP157C-EV device tree file for U-Boot SPL
- ↑ fdts/stm32mp157a-dk1.dts| |}} fdts/stm32mp157a-dk1.dts STM32MP157A-DK device tree file for TF-A
- ↑ arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi| |}} arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi STM32MP157A-DK device tree file for U-Boot SPL
- ↑ 8.08.18.28.3 include/dt-bindings/clock/stm32mp1-clksrc.h| |}} include/dt-bindings/clock/stm32mp1-clksrc.h (for TF-A), include/dt-bindings/clock/stm32mp1-clksrc.h| |}} include/dt-bindings/clock/stm32mp1-clksrc.h (for U-Boot SPL): STM32MP1 DT绑定时钟源文件
- ↑ include/dt-bindings/clock/stm32mp1-clks.h| |}} include/dt-bindings/clock/stm32mp1-clks.h (for TF-A), include/dt-bindings/clock/stm32mp1-clks.h| |}} include/dt-bindings/clock/stm32mp1-clks.h (for U-Boot SPL):STM32MP1 DT绑定时钟标识符文件