基于linux5.15.5的IMX 参考手册 --- 1

基于linux5.15.5的IMX 参考手册 — 1
第一章 介绍
1.1概述
i.MX family Linux Board Support Package (BSP)支持i.MX应用处理器上的Linux操作系统。
该软件包的目的是支持i.MX集成电路家族及其相关平台上的Linux操作系统。它提供了必要的软件来连接标准的开源Linux内核到i.MX硬件。其目标是使i.MX客户能够快速构建基于使用Linux操作系统的i.MX设备的产品。
BSP不是一个平台或产品参考实现。它不包含产品所需的所有特定于产品的驱动程序、独立于硬件的软件栈、图形用户界面(GUI)组件、Java虚拟机(JVM)和应用程序。其中一些是作为基础内核的一部分以原始的开源形式提供的。
BSP不用于硅验证。虽然它可以在这方面发挥作用,但BSP功能和在BSP上运行的测试没有足够的覆盖率来取代传统的硅验证测试套件。
1.1.1软件基础
i.MX BSP基于Linux内核的5.15.5版本,从Linux内核官方网站(www.kernel.org)获取。通过NXP提供的特性进行了增强。
在Linux上使用菜单配置改变配置与Yocto项目环境,使用bitbake如下:
bitbake linux-imx -c menuconfig
1.1.2特性
下表描述了BSP对特定平台支持的特性。
表1. BSP支持功能
基于linux5.15.5的IMX 参考手册 --- 1_第1张图片
基于linux5.15.5的IMX 参考手册 --- 1_第2张图片
第2章 系统
2.1机器特定层(MSL)
2.1.1介绍
特定于机器的层(MSL)为Linux内核提供了以下依赖于机器的组件。
•中断,包括GPIO和EDIO(仅在某些平台上)
•计时器
•内存映射
•通用输入/输出(GPIO),包括某些平台上的IOMUX
•时钟
•共享外围总线仲裁器(SPBA)
•智能直接内存访问(SDMA)
2.1.2中断(操作)
本节介绍设备中断的硬件和软件操作。
2.1.2.1中断硬件操作
中断控制器控制所有内部和外部中断源并确定其优先级。默认情况下,所有中断都具有相同的优先级。
通过配置中断控制器的寄存器,可以启用或禁用每个中断源。
GIC中有三种类型的中断:PPI、SGI和SPI。
•PPI是每个CPU的专用外围中断。它只能由每个CPU处理。
•SGI是软件生成的中断。它可以由软件操作触发,也只能由每个CPU处理。
•SPI是共享的外围中断,通常是SoC平台的外部中断源。它可以由所有CPU处理。
2.1.2.2中断软件操作
对于具有i.MX 6和i.MX 7 SOC的GIC-400的基于Arm体系结构的处理器,正常中断和快速中断是两种不同的异常类型。对于i.MX 6和i.MX 7平台,可以将异常向量地址配置为从低地址(0x0)或高地址(0xFFFF0000)开始。在Arm体系结构上运行的Linux操作系统实现选择高矢量地址模型。
对于具有i.MX 8 SOC的GIC-500的基于Arm体系结构的处理器,异常向量地址定义为VBAR_ELn + offset。偏移量取决于发生中断异常的异常级别。Documentation/arm/Interrupts对arm中断体系结构进行了描述。
软件提供了一个特定于处理器的中断结构,其中包含irqchip结构中定义的回调函数,并导出一个初始化函数,该函数在系统启动期间调用。
基于linux5.15.5的IMX 参考手册 --- 1_第3张图片
2.1.2.3中断功能
中断实现支持以下特性:
•Interrupt控制器中断禁用和启用

在标准Arm中断源代码中定义的Linux中断架构所需的功能
2.1.2.4中断源代码结构
中断模块位于drivers/irqchip。
下表列出了中断的源文件。
基于linux5.15.5的IMX 参考手册 --- 1_第4张图片
2.1.2.5中断编程接口
特定于机器的中断实现导出单个函数。这个函数初始化中断控制器硬件,并从每个中断源注册中断启用和禁用的功能。这是通过irqdesc类型的全局结构irq_desc完成的。初始化之后,驱动程序可以通过request_irq()函数使用中断来注册特定于设备的中断处理程序。
除了中断控制器支持的本机中断线之外,中断的数量也得到了扩展,以支持GPIO中断和(在某些平台上)EDIO中断。这允许驱动程序使用运行Linux操作系统的Arm设备支持的标准中断接口,比如request_irq()和free_irq()函数。
2.1.3计时器
Linux内核依赖底层硬件来提供对系统计时器(生成周期性中断)和动态计时器(调度事件)的支持。
系统定时器中断发生后,它会做以下操作:
•更新系统正常运行时间
•更新一天的时间
•如果当前进程耗尽了它的时间片,则重新调度一个新进程
•运行任何已过期的动态计时器
•更新资源使用情况和处理器时间统计
下表描述了使用的不同计时器。
基于linux5.15.5的IMX 参考手册 --- 1_第5张图片
2.1.3.1定时器软件操作
定时器软件实现提供了初始化功能,以正确的时钟源、中断模式和中断间隔对GPT进行初始化。
然后定时器注册它的中断服务程序并开始计时。中断服务程序需要为操作系统提供服务,目的在上一节定时器中提到。另一个函数提供了作为最后一个计时器中断所经过的时间。
2.1.3.2定时器功能
定时器实现支持以下特性:
•Linux操作系统提供系统定时器和动态定时器所需功能。
•i.MX6和i.MX 7每10毫秒产生一次中断,i.MX 8每4毫秒产生一次中断。它基于CONFIG_HZ_XXX。
2.1.3.3定时器源代码结构
基于linux5.15.5的IMX 参考手册 --- 1_第6张图片
2.1.3.4定时器编程接口
定时器模块利用四个硬件定时器,实现时钟源和时钟事件对象。
这是用struct clocksource类型的clocksource_mxc结构和struct clockevent_device类型的clockevent_mxc结构完成的。这两种结构都提供了读取当前计时器值和调度下一个计时器事件所需的例程。该模块实现了一个定时器中断例程,该例程为Linux操作系统提供定时器事件服务,目的在本章的开始部分提到。
2.1.4内存映射
设备驱动程序需要一个预定义的虚拟到物理内存映射表来访问设备寄存器,因为Linux内核是在启用了内存管理单元(MMU)的虚拟地址空间下运行的。
2.1.4.1 Memory Map硬件操作
MMU作为Arm核心的一部分,提供由页表定义的虚拟到物理地址映射。要了解更多信息,请参阅Arm Limited的《Arm技术参考手册》(TRM)。
2.1.4.2 Memory Map特性
Memory Map实现程序Memory Map模块为所有I/O模块创建物理到虚拟内存映射。
2.1.5 IOMUX
高度集成处理器的引脚数量有限,可用于多种用途。IOMUX模块控制一个引脚的使用,这样相同的引脚可以被配置为不同的用途,并且可以被不同的模块使用。这是一种在满足不同客户需求的同时减少引脚数量的常用方法。没有IOMUX硬件模块的平台可以通过GPIO模块进行引脚muxing。
IOMUX模块提供多路复用控制,因此每个引脚可以配置为功能引脚或GPIO引脚。功能引脚可以细分为主功能引脚或备用功能引脚。引脚操作由特定的硬件模块控制。一个GPIO引脚,由用户通过软件进行控制,通过GPIO模块进行进一步配置。例如,TXD1引脚可能具有以下功能:
• TXD1-内部UART1传输数据。这是这个引脚的主要功能.
• UART2 DTR- 备用模式 3
• LCDC_CLS- 备用模式 4
• GPIO4[22]- 备用模式 5
• SLCDC_DATA[8]- 备用模式 6
如果在系统集成级别选择硬件模式,则此引脚仅用于此目的,不能通过软件更改。否则,IOMUX模块需要配置为服务于由系统(板)设计指定的特定目的。如果引脚连接的是外部UART收发器,因此需要作为UART数据传输信号,则需要将其配置为主要功能。如果引脚连接到外部以太网控制器来中断Arm内核,那么应该配置为GPIO输入引脚,使能中断。再次提醒,软件并不能控制一个引脚应该具有的功能。该软件只根据系统设计配置pin的使用情况。
2.1.5.1 IOMUX硬件操作
下面的讨论仅适用于具有IOMUX硬件模块的处理器。本节将简要介绍IOMUX控制器寄存器。详细信息请参见IC参考手册中的引脚复用部分。
•SW_MUX_CTL -选择引脚的主要或备用功能。在适用的情况下,还启用环回模式。
•SW_SELECT_INPUT -控制引脚输入路径。只有当多个pad驱动相同的内部时才需要这个寄存器端口。

•SW_PAD_CTL -控制pad的回转速率,驱动器强度,上拉/下拉电阻等。
2.1.5.2 IOMUX软件操作
IOMUX软件实现提供了一个API来设置引脚功能和pad特性。
2.1.5.3 IOMUX特性
IOMUX实现程序IOMUX模块来配置硬件支持的引脚。
2.1.5.4 IOMUX源代码结构
下表列出了IOMUX模块的源文件。这些文件在drivers/ printrl /freescale文件夹中。
基于linux5.15.5的IMX 参考手册 --- 1_第7张图片
2.1.5.5 IOMUX编程接口
请参阅pinctl绑定文档Documentation/devicetree/bindings/pinctrl/fsl
• imx-pinctrl.txt
• imx6q-pinctrl.txt
• imx6dl-pinctrl.txt
• imx6sll-pinctrl.txt
• imx6sx-pinctrl.txt
• imx6ul-pinctrl.txt
• imx7d-pinctrl.txt
• imx7ulp-pinctrl.txt
• imx8qm-pinctrl.txt
• imx8qxp-pinctrl.txt
• imx8mq-pinctrl.txt
• imx8mm-pinctrl.txt
• imx8mn-pinctrl.txt
2.1.5.6 IOMUX通过GPIO模块控制
对于多用途引脚,GPIO控制器提供多路复用控制,使每个引脚可以配置为功能引脚或GPIO引脚。功能引脚的操作由特定的硬件模块控制,功能引脚的操作可分为主功能和一个备用功能。如果配置为GPIO引脚,则用户通过软件对引脚进行控制,再通过GPIO模块进行配置。此外,对于GPIO引脚还有一些特殊的配置(例如基于A_IN、B_IN、C_IN或DATA寄存器的输出,但基于A_OUT或B_OUT的输入)。
下面的讨论适用于那些通过通用输入/输出(GPIO)模块控制引脚muxing的平台。
如果硬件模式选择在系统集成级别,此引脚只用于该目的,不能通过软件更改。否则,需要正确配置GPIO模块,以服务于系统(板)设计指定的特定目的。如果此引脚连接到外部UART收发器,则应将其配置为主引脚,如果该引脚连接到外部以太网控制器中断核心,则应配置为GPIO输入引脚,使能中断。这个软件没有控制一个引脚应该有什么功能。根据系统设计,该软件仅为该使用配置一个pin。
2.1.5.6.1 GPIO硬件操作
GPIO控制器模块分为MUX控制子模块和PULLUP控制子模块。以下部分将简要介绍硬件操作。详细信息请参见设备相关文档。
2.1.5.6.1.1控制多路复用技术
GPIO In Use寄存器控制GPIO模块中的多路复用器。
这些寄存器中的设置可以选择一个引脚是用于外围功能还是用于其GPIO功能。每个GPIO端口专用一个32位通用寄存器。这些寄存器可用于GPIO的IOMUX块的软件控制。
2.1.5.6.1.2 上拉控制
GPIO模块对每个GPIO端口都有一个上拉控制寄存器(PUEN)来控制该端口的每个引脚。
2.1.5.6.2 GPIO软件操作(通用)
GPIO软件实现提供了一个API来设置引脚功能和pad特性。
2.1.5.6.3 GPIO的实现
GPIO实现程序通过GPIO模块对硬件支持的引脚进行配置。
2.1.6通用输入输出(GPIO)
GPIO模块提供了通用引脚,可以配置为输入或输出。当配置为输出时,可以通过写入内部寄存器来控制引脚状态(高或低)。当配置为输入时,可以从内部寄存器读取引脚输入状态。
2.1.6.1 GPIO软件操作
通用输入输出(GPIO)模块提供了一个API来配置i.MX处理器的外部引脚和一个控制GPIO中断的中心位置。
应该调用GPIO实用函数来配置引脚,而不是直接访问GPIO寄存器。GPIO中断实现包括ISR (interrupt service routine)注册/取消注册、中断发生后ISR调度等功能。所有驱动特有的GPIO设置函数都应该在MSL层的设备初始化过程中实现,以提供更好的可移植性和可维护性。该GPIO中断会在系统启动时自动初始化。
如果一个引脚被IOMUX配置为GPIO,它的状态也应该被设置,因为它不是由专用的硬件模块初始化的。设置pad上拉、下拉、回转速率等,也可能需要有pad控制功能。
2.1.6.1.1 GPIO接口
GPIO API列出了GPIO实现支持的特性。
GPIO实现支持以下特性:
•一个注册中断服务程序到GPIO中断的API。这是因为NR_IRQS定义的中断数量得到了扩展,以容纳所有可能产生中断的GPIO引脚。
•请求和释放IOMUX引脚功能。如果一个引脚被用作GPIO,则会提供另一组请求/自由函数调用。在修改引脚状态之前,用户应该检查请求调用的返回值,看看引脚是否已经被保留。当不需要引脚时,应该调用自由函数。更多细节请参见API文档。
•IOMUX和GPIO函数调用的参数传递一致。在这个实现中,iomux_pins的枚举同样用于IOMUX和GPIO调用,用户不需要找出一个引脚在GPIO模块中的位位置。
•对公共驱动程序(如以太网和UART驱动程序)进行最小的更改,因为注册中断不需要特殊的GPIO函数调用。
2.1.6.2 GPIO的特性
该GPIO实现支持以下特性:
•实现GPIO硬件模块的访问功能
•提供控制GPIO信号方向和GPIO中断的方法
2.1.6.3 GPIO模块源代码结构
GPIO模块的所有源代码都在GPIO框架中,在以下文件中,位于本章开始的目录中:
在这里插入图片描述
2.1.6.4 GPIO编程接口
更多信息请参见Linux源代码目录下的Documentation/gpio/gpio.txt。
2.1.7时钟
Linux时钟框架依赖于底层硬件来提供对时钟树管理的支持。
不同的时钟硬件说明如下表所示。
基于linux5.15.5的IMX 参考手册 --- 1_第8张图片
2.1.7.1时钟软件操作
时钟软件实现提供初始化功能,根据硬件时钟类型和设置初始化时钟树,然后提供时钟操作回调来操作硬件时钟模块。
2.1.7.2时钟功能
根据不同的时钟类型,时钟实现支持以下特性:
•准备/取消准备时钟。
•启用/禁用时钟。
•获取/设置时钟速率。
•获取/设置时钟父节点。
2.1.7.3源代码结构
源代码结构如下所示。
基于linux5.15.5的IMX 参考手册 --- 1_第9张图片
2.1.7.4
不同的时钟类型提供不同的时钟操作回调。设备驱动程序向时钟框架调用标准时钟API,最终调用到平台时钟驱动,并执行相应时钟节点的操作回调。
2.2系统控制器
2.2.1介绍
系统控制器是在i.MX 8和i.MX 8X系列上提供的,它对硬件的许多底层特性提供了抽象,并运行在一个执行SC固件(SCFW)的Cortex-M处理器上。本概述描述了SCFW的特性和公开给其他软件组件的api。
系统控制器的特性包括:
•系统初始化和启动——SCU只读存储器(ROM)从第一个容器加载代码/数据映像后,SCU立即运行SC固件。它负责初始化系统的许多方面。
这包括额外的电源和时钟配置以及资源隔离硬件配置。默认情况下,SC固件将主引导核心配置为拥有大部分资源并启动引导核心。额外的配置可以通过引导代码来完成。
•系统控制器通信——系统中的其他软件组件通过一个公开的API库与SC通信。这个库是通过底层的处理器间通信(IPC)机制实现远程过程调用(RPC)的。IPC由一个基于硬件的邮箱系统实现。为i.MX8交付的软件组件(Linux、QNX、FreeRTOS、MCUXpresso SDK)已经包含了客户端API的端口。在使用API之前,其他第三方需要先将API移植到他们的环境中。移植工具包发布版包括现有SW的客户端API存档。它们可以作为移植客户机API的参考。所有需要实现的是IPC层,它将利用消息传递单元(MU)与SCFW通信。
•电源管理—电源管理的所有方面,包括电源控制、偏差控制、时钟控制、复位控制和唤醒事件监控,都被分组在SC电源管理服务中。
—电源控制—SC固件负责电源控制和外部电源管理设备的集中管理。它管理电源状态和电源域的电压以及偏置控制。由于电源状态转换,它还会根据需要重置外设。这是通过对单个资源的电源状态需求进行通信的API实现的。
—时钟控制—SC固件负责集中管理时钟控制。这包括时钟源,如振荡器和锁相环,以及时钟分压器,muxes和门。这是通过对单个资源的时钟需求进行通信的API实现的。
—复位控制—SC固件负责复位控制。这包括启动/重新引导分区、获取复位原因以及启动/停止cpu。
在SoC中的任何硬件可以使用之前,SW必须首先启动资源并启用它需要的任何时钟,否则访问将产生一个总线错误。
•资源管理——SC固件负责管理系统资源的所有权和访问权限。SC固件支持的资源管理服务功能包括:
—管理系统资源,如SoC外设、内存区域和pad
—允许将资源划分到不同的所有权组,这些所有权组与不同的执行环境相关联,包括在不同核心上执行的多个操作系统、TrustZone和hypervisor
—将所有权与来自资源分区内消息单元的请求关联
—允许将内存划分为内存区域,然后像管理其他资源一样管理这些内存区域
—允许所有者对资源配置访问权限
—配置硬件组件以提供硬件强制隔离
-配置硬件组件来直接控制总线结构上驱动的安全/非安全属性
-为其他系统控制器功能提供所有权和访问权限信息(例如,pad所有权信息到pad muxing功能)
—资源保护包括两种方式。首先,当API调用影响特定资源时,SCFW本身检查资源访问权限。根据API调用的不同,这可能要求调用者是所有者、所有者的父或所有者的祖先。其次,任何可用于实施访问控制的硬件都是基于RM状态配置的。这包括IP的配置,如XRDC2、XRDC或RDC,以及IP的管理页面,如CAAM。
•Pad配置—Pad配置由SC固件管理。SC固件支持的pad配置特性包括:
—配置多路复用、输入输出连接、低功耗隔离模式。
-配置特定技术的pad设置,如驱动强度,上拉/下拉等
—配置双电压pad组补偿。
•计时器——许多面向计时器的服务被分组在SC计时器服务中。这包括看门狗、RTC和系统计数器。

—看门狗—SC固件为所有执行环境提供“虚拟”看门狗。功能包括更新看门狗超时时间、启动/停止看门狗、刷新看门狗、返回看门狗状态(可设置的最大超时时间、看门狗超时时间间隔、剩余超时时间间隔等)。
—实时时钟—SC固件负责提供对RTC的访问。功能包括设置时间,获取时间,设置闹钟。
-系统计数器—SC固件负责提供对SYSCTR的访问。功能包括设置绝对报警或相对,周期报警。读取直接通过每个CPU可用的本地硬件接口完成。
•中断——系统控制器需要一种方法来通知用户异步通知事件。这是通过中断服务完成的。该服务提供api来启用/禁用用户中断,并读取挂起中断的状态。读取状态会自动清除任何挂起状态。
•杂项-在以前的i.MX 6和7设备上,杂项功能通过连接到可配置硬件的信号的IOMUX GPR寄存器来控制。这个功能被DSC GPR信号所取代。SC固件负责对GPR信号进行编程以配置这些子系统功能。SC固件还负责监测各种温度、电压和时钟传感器。
-控件—SC固件提供对其他控件的访问。功能包括设置(写)杂项控件的软件请求和获取(读)杂项控件的软件请求。
—安全性—SC固件提供访问多个安全功能,包括镜像加载和身份验证。
—DMA—SC固件提供DMA通道分组和优先级功能。
—Temp—SC固件提供对温度传感器的访问。
通过这种抽象,SCFW使用的SoC参考手册中描述的一些硬件不能直接访问其他核心。这包括以下内容
•SCU子系统中的所有资源(SCU M4、SCU LPUART、SCU LPI2C等)。
•通过MSI链接从SCU子系统访问所有资源(包括pad, DSC, XRDC2, eCSR)
•OCRAM控制器,CAAM MP, eDMA MP和LPCG
•DB STC和LPCG, IMG GPR
•gGIC/IRQSTR LPCG, IRQSTR.SCU 和IRQSTR.CTI
•SCFW端口为单板预留的其他资源
每个版本提供的系统控制固件称为SCFW,与相关的i.MX参考板一起工作,并提供了一个移植套件,提供了一个可以为新板定制的源子集。这个移植工具包可以在nxp.com上找到,其中包括一个移植指南。

你可能感兴趣的:(NXP芯片,linux驱动,linux)