3.7 SDMA (Smart Direct Memory Access)接口
3.7.1概述
Smart Direct Memory Access (SDMA) API驱动程序控制SDMA硬件。它为其他驱动程序提供了一个API,用于在MCU内存空间和外围设备之间传输数据。支持以下特性:
•将通道脚本从MCU内存空间加载到SDMA内部RAM中
•加载脚本的上下文参数
•加载脚本的缓冲区描述符参数
•控制脚本执行
•脚本执行结束时的回调机制
3.7.2硬件操作
SDMA控制器负责MCU存储空间与外设之间的数据传输,具有以下特点:
•多通道DMA支持多达32个时分多路DMA通道。
•采用16位指令集微型risc引擎。
•每个通道执行特定的脚本。
•非常快速的上下文切换与基于两级优先级的优先多任务。
•4kbytes ROM包含启动脚本(即启动代码)和其他常见的实用程序,可以被ram定位的脚本引用。
•8kbyte RAM区域被划分为处理器上下文区域和用于存储从系统内存下载的通道脚本的代码空间区域。
3.7.3软件操作
驱动程序为其他驱动程序提供了一个API来控制SDMA通道。SDMA通道根据外围设备和传输类型运行专用脚本。SDMA API驱动程序负责将脚本加载到SDMA内存中,初始化通道描述符,并控制缓冲区描述符和SDMA寄存器。
下表提供了使用SDMA的驱动程序列表,以及每个驱动程序使用的SDMA物理通道的数量。驱动程序可以指定它想要使用的SDMA通道号,静态通道分配,或者可以让SDMA驱动程序提供一个免费的SDMA通道供驱动程序使用,动态通道分配。对于动态信道分配,将SDMA信道列表从信道32扫描到信道1。当找到一个空闲通道时,该通道将被分配给请求的DMA传输。
3.7.4源代码结构
SDMA API头文件dmaengine.h在“linux/include/linux”目录下
下表显示了目录drivers/dma中可用的源文件。
下表显示了用于4.1和4.9内核的firmware/imx/sdma目录下可用的映像文件。对于4.14内核,sdma固件与firmware-imx包一起提供,而不在内核源代码树中。
3.7.5特殊外设和SDMA案例
3.7.5.1 i.MX 6/7Dual/8M中的I2C
在当前版本中,i.MX 6/7Dual/8M中的I2C控制器和SDMA脚本也不支持SDMA。
有两个限制:
•当帧长度大于16字节时,I2C使用DMA模式,因为I2C本身在发送和接收帧时仍然需要使用CPU处理前几个字节和后几个字节。因此,当发送的数据不长时,使用DMA发送数据并不能提高效率。
•SDMA脚本是在rootfs阶段加载的,所以在内核启动阶段使用I2C DMA传输将会失败。
在发送少量数据时,强烈建议不要使用I2C SDMA模式。如果有特殊情况需要发送大量I2C数据,请联系NXP Pro-support获取补丁集。
3.8 SPI NOR闪存技术器件(MTD)
3.8.1介绍
MTD驱动程序通过SPI接口提供对数据Flash的支持。
默认情况下,SPI NOR Flash MTD驱动程序创建静态MTD分区来支持数据Flash。
3.8.2硬件操作
在一些单板上使用SPI NOR - AT45DB321D,在一些单板上使用M25P32。请检查各单板的SPI NOR类型,再进行配置。
AT45DB321D是一款2.7 V串口顺序存取Flash存储器。AT45DB321D串行接口兼容SPI频率高达66mhz。内存被组织为8,192个512字节或528字节的页。AT45DB321D还包含两个512/528字节的SRAM缓冲区,允许在主存中的页面被重新编程时接收数据,以及写入连续的数据流。
M25P32是一款32mbit (4M x 8)的串行闪存,具有先进的写保护机制,通过高速spi兼容总线访问,最高可达75mhz。内存被组织为64个扇区,每个扇区包含256个页面。每个页面有256字节宽。因此,可以将整个内存视为由16384页或4,194,304字节组成。内存可以使用Page Program指令一次编程1到256字节。整个内存可以使用批量擦除指令擦除,或者一次擦除一个扇区,使用扇区擦除指令。
与随机访问的传统Flash存储器不同,这两个SPI NOR按顺序访问数据。它们通过单个2.7-3.6V电源进行编程和读取操作。它们通过一个芯片选择引脚使能,并通过三线接口访问:串行输入,串行输出和串行时钟。
3.8.3软件操作
在一个基于flash的嵌入式Linux系统中,许多Linux技术一起工作来实现一个文件系统。下图说明了一些标准组件之间的关系。
Linux操作系统的MTD子系统是到内存设备(如Flash和RAM)的通用接口,提供对物理内存设备的简单读、写和擦除访问。称为mtdblock的设备可以由JFFS、JFFS2和CRAMFS文件系统挂载。SPI NOR MTD驱动是基于内核中的MTD数据闪存驱动,增加了SPI访问。在初始化阶段,SPI NOR MTD驱动程序通过读取JEDEC ID来检测一个数据Flash。驱动添加MTD设备。SPI NOR MTD驱动程序还提供了读取、写入和擦除NOR Flash的接口。
3.8.4源代码结构
驱动文件如下表所示:
3.8.5菜单配置选项
在菜单配置中启用以下模块:
•CONFIG_MTD_M25P80:此配置允许访问最现代的SPI闪存芯片,用于程序和数据存储。
•Device Drivers > Memory Technology Device (MTD) support >Self-contained MTD device drivers > Support most SPI Flash chips(AT26DF、M25P、W25X等)
第四章 连接
4.1 ADC
4.4.1 ADC的介绍
ADC-Digital的特点如下:
•2个12位adc
•线性逐次逼近算法,高达12位分辨率,10/11位精度
•高达1ms /s采样率
•最多8个单端外部模拟输入
•单次或连续转换(单次转换后自动恢复空闲)
•输出模式:(右对齐无符号格式)
Device Drivers > Industrial I/O support > Analog to digital converters > Freescale vf610 ADC driver
Device Drivers > Industrial I/O support > Analog to digital converters > i.MX 7Dual ADC driver
Device Drivers > Industrial I/O support > Analog to digital converters > i.MX 8QXP ADC driver
4.1.6编程接口
Linux IIO提供了一些系统接口来从相关的输入中获取原始ADC数据。用户还可以设置采样率
可用的采样速率组。ADC控制器系统接口位于:
/sys/devices/soc0/soc.1/2200000.aips-bus/2280000.adc/iio:device0:
/sys/devices/soc0/soc.1/2200000.aips-bus/2284000.adc/iio:device1:
软件接口说明如下表所示
4.2 ENET IEEE-1588
4.2.1介绍
ENET IEEE-1588驱动程序执行一组功能,实现网络通信中时钟的精确同步。
驱动程序需要一个协议栈来完成IEEE-1588完整协议。它符合LinuxPTP栈。
为了实现IEEE 1588或类似的时间同步协议,将ENET MAC与时间戳模块相结合,以支持传入和传出帧的精确时间戳。
4.2.1.1传输时间戳
在传输时,只有1588事件帧需要时间戳。客户端应用程序(例如,MAC驱动程序)应该检测到1588事件帧,并将ff_tx_ts_frm信号与帧一起设置。
对于每个传输的帧,MAC返回tx_ts(31:0)上捕获的时间戳,带有帧序列号(tx_ts_id(3:0))和传输状态。发送状态位tx_ts_stat(5)表示应用程序为帧断言了ff_tx_ts_frm信号。
如果ff_tx_ts_frm设置为’1’,MAC会在寄存器TS_TIMESTAMP中额外存储帧的时间戳。中断位EIR (TS_AVAIL)被设置为表示新的时间戳可用。
软件将通过设置ff_tx_ts_frm信号来实现握手过程,当它传输需要时间戳的帧时,然后等待EIR (TS_AVAIL)中断位,以知道时间戳何时可用。然后它可以从TS_TIMESTAMP寄存器读取时间戳。这对所有事件框架都是如此;其他帧不使用ff_tx_ts_frm指示器,因此不干扰时间戳捕获。
4.2.1.2接收时间戳
当接收到帧时,当检测到帧SFD字段时,MAC锁存计时器的值,并提供ff_rx_ts(31:0)上捕获的时间戳。对所有接收到的帧都这样做。
DMA控制器必须确保它将为帧提供的时间戳传输到软件访问的接收描述符中的相应字段。
4.2.2软件操作
1588驱动程序具有以下功能:
•模块初始化-用特定于设备的结构初始化模块,并注册一个字符驱动。
•中断服务例行程序-支持事件,如TS_AVAIL, TS_TIMER。驱动程序与FEC驱动程序共享中断服务程序。
4.2.2.1源代码结构
下表列出了drivers/net/ethernet/freescale目录中的源文件。
4.2.2.2菜单配置选项
缺省情况下,ENET 1588处于开启状态。
4.2.2.3编程接口
1588驱动遵循Linuxptp协议栈接口。
堆栈特定的定义被添加到头文件(fec.h)。
4.2.3 1588栈介绍
这个版本支持以下类型的1588栈:
•Linuxptp堆栈
本软件是基于IEEE标准1588的精密时间协议(PTP)在Linux操作系统上的实现。这两个设计目标是提供标准的健壮实现,并使用Linux操作系统内核提供的最相关和最现代的应用程序编程接口(API)。支持遗留api和其他平台并不是我们的目标。软件的版权由作者所有,并根据GNU通用公共许可证授权。
软件开发位于Source Forge: sourceforge.net/projects/linuxptp/
4.2.3.1 Linuxptp栈特性
Linuxptp支持以下特性:
•普通/边界时钟
•最佳主时钟算法
•传输UDP/IPv4, UDP/IPv6, IEEE 802.3
•透明时钟(E2E/P2P)
•仅从机
•支持IEEE 802.1AS-2011终端站的角色
4.2.3.2使用Linuxptp
使用如下命令运行ptp4 1588堆栈二进制文件。
Linuxptp:
Transport on UDP IPV4 with E2E delay mechanism: ptp4l -A -4 -H -m -i eth0
Transport on UDP IPV4 with P2P delay mechanism: ptp4l -P -A -4 -H -m -i eth0
Transport on UDP IPV6 with E2E delay mechanism: ptp4l -A -6 -H -m -i eth0
Transport on UDP IPV6 with P2P delay mechanism: ptp4l -P -A -6 -H -m -i eth0
Transport on IEEE 802.3 with E2E delay mechanism: ptp4l -A -2 -H -m -i eth0
Transport on IEEE 802.3 with P2P delay mechanism: ptp4l -P -A -2 -H -m -i eth0
4.3增强的可配置串行外设接口(ECSPI)
4.3.1介绍
ECSPI驱动程序实现了到ECSPI控制器的标准Linux驱动程序接口。
支持以下特性:
•中断驱动的字节传输/接收
•多个主控制器接口
•多个从节点选择
•Multiclient请求
ECSPI用于比传统串行通信更少软件中断的快速数据通信。>每个ECSPI都配备一个数据FIFO,是一个主/从配置的串行外设接口模块,允许处理器与外部SPI主或从设备进行接口。
ECSPI的主要特点包括:
•主/从可配置
•4个芯片选择信号,支持多个外设
•高达32位可编程数据传输
•64 x 32位FIFO传输和接收数据
•可配置芯片选择(SS)和SPI时钟(SCLK)的极性和相位
ECSPI模块支持以下特性:
•实现ECSPI模块与Linux操作系统接口所需的每个功能
•多个SPI主控制器
•多客户端同步请求
4.3.2软件操作
以下部分描述了ECSPI软件操作。
4.3.3 Linux系统下的SPI子系统
ECSPI驱动层位于客户端层(SPI-NOR Flash就是客户机的例子)和硬件访问层之间。下图是Linux操作系统下SPI子系统的框图。
SPI请求进入I/O队列。对给定SPI设备的请求按照FIFO顺序执行,它们通过完成回调异步完成。还有一些用于这些调用的简单同步包装器,包括用于常见事务类型的包装器,比如写入命令,然后读取其响应。
4.3.4软件限制
ECSPI驱动程序的限制如下:
•目前没有SPI从逻辑实现
•不支持一个客户端连接到多个主机
•目前没有通过设备节点条目实现用户空间接口,但支持sysfs接口
4.3.5标准操作
ECSPI驱动程序负责实现初始化、退出、芯片选择和传输的标准入口点。驱动程序实现以下功能:
•初始化函数spi_imx_init()注册device_driver结构。
•探测函数spi_imx_probe()执行SPI设备特定结构的初始化和注册SPI核心驱动。驱动程序探测内存和IRQ资源。配置IOMUX启动ECSPI I/O引脚、IRQ请求和复位硬件。
•芯片选择函数spi_imx_chipselect()为当前SPI设备配置硬件ECSPI。设置此设备的字大小、传输模式、数据速率。
•SPI传输函数spi_imx_transfer()处理数据传输操作。
•SPI设置函数spi_imx_setup()初始化当前SPI设备。
•当数据传输操作完成并产生中断时,调用SPI驱动ISR spi_imx_isr()。
4.3.6 ECSPI同步运行
下图显示了ECSPI如何提供同步读/写操作。
4.3.7源代码结构
下表显示了drivers/spi目录中可用的源文件:
4.3.8菜单配置选项
在菜单配置中启用以下模块:
•对SPI核心的CONFIG_SPI构建支持。在menuconfig中,这个选项在下面可用:
— Device Drivers > SPI Support。
•CONFIG_BITBANG是由需要它的驱动程序自动选择的库代码。SPI_IMX选择它。在menuconfig中,这个选项在下面可用:
— Device Drivers > SPI Support > Utilities for Bitbanging SPI masters。
•CONFIG_SPI_IMX实现了ECSPI的SPI主模式。在menuconfig中,这个选项在下面可用:
— Device Drivers > SPI Support > Utilities for Bitbanging SPI masters。
4.3.9编程接口
这个驱动程序实现了SPI核心与ECSPI硬件接口所需的所有功能。
有关更多信息,请参阅由build: make htmldocs生成的Linux文档。
4.3.10中断需求
SPI接口产生中断。
下表列出了ECSPI中断要求。
典型值是基于1 Mbps的波特率,接收触发电平(Rxtl)为1,传输长度为32位。最坏情况是波特率为12 Mbps (SPI接口支持的最大波特率),传输长度为8位。