基于linux5.15.5的IMX 参考手册 --- 2
Posted chocolate2018
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于linux5.15.5的IMX 参考手册 --- 2相关的知识,希望对你有一定的参考价值。
基于linux5.15.5的IMX 参考手册 — 2
2.3引导映像
2.3.1介绍
对于i.MX 6和i.MX 7,引导映像只使用U-Boot引导加载程序。对于i.MX 8系列中的SoC,引导映像更加复杂,包括U-Boot以及成功引导所需的各种固件。本章介绍i.MX 8系列引导加载程序的附加组件。
对于i.MX 7ULP,引导分区需要Arm Cortex M-4 SDK闪存,因为Arm Cortex M-4引导U-Boot引导加载程序,但是其他带有Arm Cortex M-4内核的i.MX 6和i.MX 7不需要这个来成功引导。
i.MX 8引导加载程序是使用imx-mkimage工具创建的,imx-mkimage在代码aurora forum/和所有i.MX 8系列需要Arm可信的固件在imx-atf在代码aurora forum/
使用imx-mkimage工具创建引导分区的方法请参考《i.MX Linux用户指南》。这个执行工具需要以下组件。
对于i.MX 8M Quad, i.MX 8M Mini和i.MX 8M Nano,需要以下固件:
•Synopys DDR固件。
•签名HDMI固件-集成了DCSS驱动程序。HDMI固件仅适用于i.MX 8M Quad。
•Arm可信固件- bl31-soc。
对于i.MX 8QuadMax,需要以下固件:
•系统控制器固件(SCFW)
•Arm可信固件- bl31-soc
•用于B0的SECO固件容器映像(ahab-container.img)
对于i.MX 8QuadXPlus, i.MX 8DualX和i.M 8DualXLite,需要以下固件:
•系统控制器固件(SCFW)
•Arm可信固件- bl31-soc
•SECO固件容器映像(ahab-container.img)
所有的i.MX系列都需要Arm信任的固件和U-boot。另外,支持OP-TEE的i.MX SoC(所有i.MX 6, 7和8M系列)在OP-TEE启动时需要从构建optee_ox创建tee.bin。
像Xen这样的类型1虚拟机监控程序是引导加载程序的一部分。但是,Type 2管理程序(如jailhouse和kvm)则不是。
2.4 Anatop 调节器驱动器
2.4.1介绍
Anatop调节器驱动器提供低电平控制电源调节器,并选择电压电平。该设备驱动程序利用调节器核心驱动程序访问Anatop硬件控制寄存器,仅在i.MX 6和i.MX 7上支持。
2.4.2硬件操作
模具上的电源管理单元简化了外部电源接口,并允许模具以适当的方式配置电源。电力系统由输入电源及其特性、综合的电力转换和控制元件以及最终的负荷互连和要求组成。
利用7个LDO调节器,外部供应的数量大大减少。如果忽略备用硬币和USB输入,那么外部电源的数量就减少到两个。这个外部电源总数中缺少所需的外部电源来驱动所需的内存接口。这将根据所选择的外部内存类型而改变。如果它们的I/O电压需要不同于上面所提供的,那么其他电源也可能需要为不同的I/O电源段提供电压。
可以绕过一些内部稳压器,使外部PMIC直接供电,以减少功率数,如VDD_SOC和VDD_ARM。
2.4.3软件操作
Anatop调节器客户端驱动程序通过重新配置Anatop硬件控制寄存器来执行操作。这是通过调用带有所需寄存器设置的调节器核心api来实现的。
2.4.4驱动特性
Anatop调节器驱动器是基于调节器核心驱动器的。可以在这里找到为调节器控制提供的服务列表。
•打开/关闭所有电压调节器。
•设置所有电压调节器的值。
•获取所有电压调节器的电流值。
2.4.5驱动接口详细信息
通过调节器核心驱动的API提供对Anatop调节器的访问。Anatop调节器驱动器提供以下调节器控制:
•7个 LDO调节器
所有的调节器功能都通过设置适当的Anatop硬件寄存器值来处理。这是通过调用调节器核心api来访问Anatop硬件寄存器来完成的。
2.4.6调节器api
该稳压器电源架构旨在为Linux内核中的电压和电流稳压器提供一个通用接口。它旨在为客户端或消费者驱动器提供电压和电流控制,并通过sysfs接口向用户空间应用程序提供状态信息。其目的是让系统动态控制稳压器输出,以节省电力和延长电池寿命。这适用于电压调节器(电压输出是可控的)和电流汇(电流输出是可控的)。
欲了解更多详情,请访问opensource.wolfsonmicro.com/node/15
在这个框架下,大部分的power操作可以通过以下统一的API调用来完成:
•regulator_get用于查找和获取一个调节器的引用:
- struct regulator *regulator_get(struct device *dev, const char *id);
•regulator_put用于释放调节器源:
- void regulator_put(struct regulator *regulator, struct device *dev);
•regulator_enable用于使能调节器输出:
- int regulator_enable(struct regulator *regulator);
•regulator_disable用于禁用调节器输出:
- int regulator_disable(struct regulator *regulator);
•regulator_is_enabled是调节器输出使能:
- int regulator_is_enabled(struct regulator *regulator);
•regulator_set_voltage用于设置调节器输出电压:
- int regulator_set_voltage(struct regulator *regulator, int uV);
•regulator_get_voltage用于获得调节器输出电压:
- int regulator_get_voltage(struct regulator *regulator);
利用7个LDO调节器,外部供应的数量大大减少。如果忽略备用币和USB输入,那么外部电源的数量就减少到两个。这个外部电源总数中缺少所需的外部电源来驱动所需的内存接口。这将根据所选择的外部内存类型而改变。如果它们的I/O电压需要不同于上面所提供的,那么其他电源也可能需要为不同的I/O电源段提供电压。
可以绕过一些内部稳压器,使外部PMIC直接供电,以减少功率数,如VDD_SOC和VDD_ARM。
2.4.3软件操作
Anatop调节器客户端驱动程序通过重新配置Anatop硬件控制寄存器来执行操作。这是通过调用带有所需寄存器设置的调节器核心api来实现的。
要了解更多的api和细节,请参阅Linux内核中的调节器核心源代码:drivers/regulator/core.c。
2.4.7源代码结构
Anatop调节器驱动位于drivers/regulator目录中:
Anatop调节器在arch/arm/boot/dts中每个soc特定的dts文件中注册。
2.4.8菜单配置选项
在菜单配置中启用以下模块:
•设备驱动>电压和电流调节器支持> Anatop调节器支持。
•系统类型>飞思卡尔i.MX片上ANATOP LDO调节器
2.5电源管理
2.5.1低电平电源管理(PM)
2.5.1.1介绍
这里找到的信息描述了控制低功耗模式的低功耗电源管理(PM)驱动程序。
下面描述了如何处理每个受支持的i.MX家族的电源管理之间的差异。
下表列出了不同低功耗模式的详细时钟信息。
有关低功耗模式的详细信息,请参见与SoC相关的应用程序处理器参考手册。
2.5.1.2软件操作
i.MX 6和i.MX 7电源管理驱动程序将低功耗模式映射到内核电源管理状态,如下所示:
•待机映射到STOP模式,这提供了显著的节能,因为系统中的所有块都进入低功耗状态,除了Arm®核心,它仍然是带电的,内存被放置在自我刷新模式以保留其内容。
•Mem(挂起到RAM)映射到休眠模式,这提供了最显著的节能,因为系统中的所有块都进入低功耗状态,除了内存,它被放置在自我刷新模式以保留其内容。如果DTB ocrams节点中定义了“fsl,enable-lpsr”,则mem将被映射到LPSR模式,而不是休眠模式,并且系统中除LPSR、SNVS和DRAM电源域外的所有块都进入断电状态。
•系统空闲映射到等待模式。
•If Arm Cortex®-M4处理器在内核进入standby/mem模式之前与Arm Cortex-A处理器一起活动,如果Arm Cortex-M4处理器没有进入低功耗空闲模式,Arm Cortex-A处理器会触发SoC进入WAIT模式,而不是STOP模式,以确保Arm Cortex-M4处理器可以继续运行。
i.MX 6和i.MX 7电源管理驱动进入和退出低功耗模式的操作步骤如下:
- 允许Cortex-A平台发出深度睡眠模式请求。
- 如果是停止或休眠模式:
•程序i.MX 6 CCM_CLPCR或i.MX 7 GPC_LPCR_A7_BSC和GPC_SLPCR寄存器设置低功率控制寄存器。
•如果是休眠模式,当pdn_req断言时请求关闭CPU电源。
•当断言pdn_req时,请求关闭嵌入式内存外设电源。
•程序GPC掩码寄存器以解除唤醒中断的掩码。
3.调用cpu_do_idle来执行WFI挂起指令以进入等待模式。 - 在IRAM中执行imx6_suspend或imx7_suspend。
- 在休眠模式下,保存Arm上下文,将DDR pad的驱动强度调整为“low”,以减少DDR pad的功耗泄漏。停止模式执行WFI等待指令。
- 产生唤醒中断并退出低功耗模式。在休眠模式下,恢复Arm核心和DDR驱动强度。
在休眠模式下,i.MX 6和i.MX 7可以断言PMIC_STBY_REQ引脚到PMIC并请求电压变化。
U-Boot或机器特定层(MSL)通常根据i.MX 6和i.MX 7数据表将备用电压设置为STOP模式。
在i.MX 8M Family中,电源管理驱动程序使用以下模式。
•RUN Mode:运行模式下,quadal - a53处理器核心处于活动状态,处于运行状态。有些部分可以关闭,以节省电力。
•IDLE模式:CPU在没有线程运行且所有高速设备处于空闲状态时自动进入的模式。CPU可以进入电源门控状态,但L2数据保留,DRAM和总线时钟减少,大多数内部逻辑是时钟门控,但仍然供电。
•SUSPEND Mode:这种模式被定义为最省电的模式,所有的时钟都关闭,所有不必要的电源都关闭。Cortex-A53 CPU平台全电源门控。所有可以断电的内部数字逻辑和模拟电路都将关闭。
•SNVS模式:也称为RTC模式。在这种模式下,只有SNVS域的电源是开着的,以保持RTC和SNVS逻辑是活的。
关于i.MX 8和i.MX 8X:
•低功耗模式管理不受专用硬件块控制。
•所有低功耗模式均采用软件方法在系统控制器固件(SCFW)中实现。
•SCFW在系统挂起时,将clusters/CPUs断电。
2.5.1.3源代码结构
下表显示了电源管理驱动程序源文件。
2.5.1.4菜单配置选项
在菜单配置中启用CONFIG_PM: CONFIG_PM构建对电源管理的支持。默认情况下,该选项为Y
在menuconfig中,该选项在: Power management options > Power Management support。
在菜单配置中启用CONFIG_SUSPEND。CONFIG_SUSPEND构建支持挂起。在menuconfig中,该选项在: Power management options > Suspend to RAM and standby
2.5.1.5编程接口
在cpu_idle中查找每个SoC,如源代码结构表所示,并搜索lpm。这将是低功耗模式的API。这实现了将系统置于WAIT和STOP模式所需的所有步骤。
2.5.2 PMIC PF调节器
2.5.2.1介绍
PF100/200/300是PMIC芯片。
PF200/PF3000是在PF100的基础上,变化不大,因为它们共享同一个PF100驱动。PF100稳压器驱动器提供电源稳压器的低电平控制,电压等级的选择,稳压器的使能/使能。该设备驱动程序利用PF100调节器驱动程序访问PF100硬件控制寄存器。PF100稳压器驱动器以稳压器核心驱动器为基础,连接到核心I2C总线上。
PF8100/8200 PMIC是专为i.MX 8和i.MX 8X系列设计的,由于是系统级设备,它由系统控制器固件(SCFW)控制。SCFW为Linux触摸创建一些特定的电源资源,例如“SC_R_BOARD_R0”。
2.5.2.2硬件操作
PMIC PF稳压器为应用处理器和外围设备提供参考电压和电源电压。
包括4个降压(可达6个独立输出)和1个升压(升压)转换器。降压变换器为处理器核心和其他低电压电路(如存储器)提供电源。提供动态电压调节,允许对处理器核心和/或其他电路的供电轨进行控制调整。
线性稳压器直接由电池或开关提供,包括I/O和外设、音频、相机、BT、WLAN等的供应。命名约定暗示典型的或可能的用例应用,但切换器和调节器可能被用于指定功能指导方针内的其他系统电源需求。
PF100唯一的上电事件是PWRON为高,唯一的下电事件是PWRON为低。i.MX 6的PMIC_ON_REQ引脚由i.MX 6的SNVS块控制,与PF100的PWRON引脚连接,控制PF100的开/关,使系统断电。
2.5.2.3软件操作
PMIC PF调节器客户端驱动程序通过重新配置PMIC硬件控制寄存器来执行操作。
一些PMIC电源管理操作依赖于系统设计和配置。例如,如果系统由PMIC以外的电源供电,那么关闭或调整PMIC稳压器不会产生任何影响。
相反,如果系统由PMIC供电,那么使用电源管理驱动器和调节器客户端驱动器的任何更改都可能影响整个系统的运行或稳定性。
2.5.2.4驱动特性
PMIC PF稳压器驱动器是以稳压器核心驱动器为基础的。它为PMIC组件的调节器控制提供以下服务:
•打开/关闭所有稳压器。
•设置所有稳压器的值。
•获得所有电压调节器的电流值。
2.5.2.5调节器api
该稳压器电源架构旨在为Linux内核中的电压和电流稳压器提供一个通用接口。
它旨在为客户端或消费者驱动器提供电压和电流控制,并通过sysfs接口向用户空间应用程序提供状态信息。其目的是让系统动态控制稳压器输出,以节省电力和延长电池寿命。这适用于电压调节器(电压输出是可控的)和电流汇(电流输出是可控的)。
更多详细信息,请参见opensource.wolfsonmicro.com/node/15
在这个框架下,大部分的power操作可以通过以下统一的API调用来完成:
•regulator_get是一个统一的API调用,用于查找和获取一个调节器的引用:
Struct regulator *regulator_get(Struct device *dev, const char *id)
•regulator_put是一个统一的API调用来释放调节器源:
void regulator_put(struct regulator *regulator, struct device *dev);
•regulator_enable是一个统一的API调用,使能调节器输出:
int regulator_enable(struct regulator *regulator);
•regulator_disable是一个统一的API调用来禁用调节器输出:
int regulator_disable(struct regulator *regulator);
•regulator_is_enabled是调节器输出使能:
int regulator_disable(struct regulator *regulator);
•regulator_set_voltage是一个统一的API调用来设置调节器输出电压:
int regulator_set_voltage(struct regulator *regulator, int uV);
•regulator_get_voltage是一个统一的API调用来获得调节器输出电压:
int regulator_get_voltage(struct regulator *regulator);
你可以在Linux内核的调节器核心源代码中找到更多的api和细节:drivers/regulator/core.c
2.5.2.6驱动架构
下图显示了PMIC PF调节器驱动器的基本结构。
2.5.2.7驱动接口详细信息
通过调节器核心驱动的API提供对PFUZE100调节器的访问。
PFUZE100调节器驱动器提供以下调节器控制:
•4个buck开关稳压器在正常模式下(最多6个独立导轨):SW1AB、SW1C、SW2、SW3A、SW3B和SW4。
•Buck开关可以通过预先指定的寄存器(PFUZE100_SWxSTANDBY)编程到备用状态。
•6个线性调节器:VGEN1, VGEN2, VGEN3, VGEN4, VGEN5和VGEN6。
•1个LDO/Switch供应,用于在i.MX处理器上支持VSNVS。
•1低电流,高精度,DDR参考电压。
1个Boost调节器,支持USB OTG。
根据硬件设计,PFUZE100的大部分电源轨道已经被正确编程。因此,您无法找到使用PFUZE100调节器的内核。PFUZE100调节器驱动器实现了这些调节器,当PFUZE100的默认值不能满足他们的硬件设计时,客户可以自由使用。
2.5.2.8源代码结构
PFUZE调节器驱动器位于驱动器/调节器目录中:
没有与PMIC相关的单板文件。一些PFUZE驱动程序代码被移到了U-Boot中,比如备用电压设置。部分代码由DTS文件实现。在Uboot源中搜索PFUZE100,在设备树中搜索pfuze。在arch/arm/boot/dts中的i.MX 6和i.MX7中的dtsi文件,在arch/arm64/boot/dts中搜索i.MX 8M。
2.5.2.9菜单配置选项
在菜单配置中启用以下模块:
Device Drivers > Voltage and Current regulator support > Freescale PFUZE100/200/3000 regulator driver.
2.5.3 CPU频率缩放 (CPUFREQ)
2.5.3.1介绍
CPU频率缩放设备驱动程序允许实时更改CPU的时钟速度。一旦改变CPU频率,必要电源的电压就会改变为设备树脚本(DTS)中定义的电压值。
这种方法可以降低功耗(从而节约电池功耗),因为随着时钟速度的降低,CPU消耗的功耗也会减少。
2.5.3.2软件操作
CPUFREQ设备驱动程序设计用于动态改变CPU频率和电压。
如果DTS中没有定义频率,CPUFREQ驱动程序将CPU频率更改为阵列中最近的更高的频率。频率使用时钟框架API控制,而电压使用调节器API设置。阵列中CPU的频率与启动CPU的频率相同。交互式CPU调频器,不能手动更改。要手动更改CPU频率,可以使用用户空间CPU频率调节器。默认情况下,使用保守的CPU频率调控器。
有关驱动程序中实现的函数的更多信息,请参阅API文档。
查看以KHz为单位的CPU频率修改值(第一列的值为频率值),可以使用以下命令:
cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
要将CPU频率更改为使用上述命令给出的值(例如,792 MHz),请使用以下命令:
echo 792000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
频率792000是千赫,也就是792兆赫。
使用这个命令可以检查的最大频率:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
使用如下命令查看当前CPU频率(以KHz为单位):
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
使用以下命令查看可用的调控器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
使用如下命令修改为交互式CPU调频器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
2.5.3.3源代码结构
下表显示了以下目录中可用的源文件和头。
有关CPU频率工作点设置,请参阅i.MX 6和i.MX7的arch/arm/boot/dts中的SoC对应dtsi文件,以及i.MX 8、i.MX 8X和i.MX 8M的arch/arm64/boot/dts中的SoC对应dtsi文件。
2.5.3.4菜单配置选项
这个模块提供了以下Linux内核配置:
•CONFIG_CPU_FREQ;在menuconfig中,这个选项位于下面:
—CPU Power Management > CPU Frequency scaling
•可以选择以下选项:
—CPU调频
—CPU频率转换统计信息
-默认CPU调频器(保守)(交互式)
-性能调节器
-省电调速器
-用于用户空间频率缩放的用户空间调控器
-交互式CPU频率策略调控器
-保守型CPU频率调节器
-Schedutil CPU频率调节器
-i.MX CPU的CPU频率驱动程序
2.5.4动态总线频率
2.5.4.1介绍
为了提高功耗,总线频率驱动程序可以动态管理i.MX 6、i.MX 7和i.MX 8M系列的各种系统频率。
频率变化对上层是透明的,不需要驱动程序或中间件的干预。根据外围设备的活动和CPU负载,总线频率驱动程序在24MHz和其最大频率之间改变DDR频率。类似地,AHB频率在24 MHz和其最大频率之间变化。
2.5.4.2操作
总线频率驱动程序是Linux BSP电源管理模块的一部分。这个驱动程序的主要目的是根据外围设备活动和CPU负载来调整系统时钟(如AHB、DDR、AXI等)的各种工作频率。
2.5.4.3软件操作
总线频率取决于设备驱动程序对其操作的请求和释放。驱动程序将调用总线频率api来请求或释放他们想要的总线设定点。总线频率将根据当前请求的外围设备将系统频率设置为最高频率设定点。
启用总线频率驱动,使用如下命令:
echo 1 > /sys/bus/platform/drivers/imx_busfreq/soc\\:busfreq/enable
禁用总线频率驱动,使用以下命令:
echo 0 > /sys/bus/platform/drivers/imx_busfreq/soc\\:busfreq/enable
如果Arm Cortex-M4处理器与Arm Cortex-A处理器同时存在,Arm Cortex-M4处理器也会请求或释放总线频率高设定值。这意味着Arm Cortex-A处理器将Arm Cortex-M4处理器作为其高速设备之一。
setpoint模式的作用如下:
•当大多数需要更高频率以获得良好性能的外围设备处于活动状态时,使用高频设定点模式。例如,视频回放和图形处理。
•“音频回放设定值”模式用于音频回放模式。
•当系统空闲等待用户输入(显示关闭)时,使用低频设定点模式。对于i.MX 8M,当没有外设要求高模式或音频模式时使用该模式。
下表解释了每个系列的软件设定值。
2.5.4.4源代码结构
下表列出了源文件和头文件。
总线频率模式在i.MX 6和i.MX 7的arch/arm/boot/dts和i.MX 8M的arch/arm64/boot/dts中的SoC dtsi文件中定义。
2.5.4.5菜单配置选项
此驱动程序没有菜单配置选项。支持总线频率驱动的SoC包括并默认启用总线频率驱动。
2.5.5电池充电
2.5.5.1介绍
i.MX 6 SABRE SD板的充电器max8903支持电池充电。
2.5.5.2软件操作
一个也没有。
2.5.5.3源代码结构
电池充电源基于drivers/power/supply/sabresd_battery.c
2.5.5.4菜单配置选项
在菜单配置中启用以下模块:
Device Drivers > Power supply class support > Sabresd Board Battery DC-DC Charger for USB and Adapter Power。
以上是关于基于linux5.15.5的IMX 参考手册 --- 2的主要内容,如果未能解决你的问题,请参考以下文章