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

Posted chocolate2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于linux5.15.5的IMX 参考手册 --- 6相关的知识,希望对你有一定的参考价值。

基于linux5.15.5的IMX 参考手册 — 6

4.4 FEC (Fast Ethernet Controller)
4.4.1介绍
快速以太网控制器(FEC)驱动程序执行全套IEEE 802.3/以太网CSMA/CD媒体访问控制和通道接口功能。
FEC需要外部接口适配器和收发器功能来完成与以太网媒体的接口。10 Mbps、100 Mbps和1000 Mbps相关以太网上的半双工或全双工操作。
FEC驱动支持以下特性:
•全/半双工操作
•链路状态变化检测
•自动协商(决定网络速度和全双工或半双工操作)
•传输特性,如碰撞自动重传和CRC生成
•从设备获取统计信息,例如传输冲突
可以通过接口名称为ethx的ifconfig命令访问网卡。驱动器自动探测外部适配器(PHY设备)。
4.4.2硬件操作
FEC是一个以太网控制器,将系统连接到局域网网络。
FEC支持不同的标准MAC-PHY(物理)接口,用于连接外部以太网收发器。FEC支持10/ 100mbps MII、10/ 100mbps RMII和10/100/ 1000mbps RGMII。此外,FEC支持1000 Mbps的RGMII,它使用4位降低的GMII在125 MHz的工作。
这里提供了设备功能的简要概述。详细信息请参见《应用处理器参考手册》中的FEC章节
MII模式下,EMAC支持IEEE 802.3标准定义的18种信号。MII, RMII和RGMII模式使用18个信号中的一个子集。下表列出了这些信号。

MII管理接口由两个引脚FEC_MDIO和FEC_MDC组成。FEC的硬件操作可以分为以下几个部分。具体操作请参见《应用处理器参考手册》。
•传输—以太网发射器被设计成几乎不需要软件干预的工作方式。一旦断言[ETHER_EN]并且数据出现在传输FIFO中,以太网MAC就能够在网络上传输。当发送FIFO填充到水印(由TFWR定义)时,MAC发送逻辑断言FEC_TX_EN,并开始发送序言(PA)序列、起始帧分隔符(SFD),然后从FIFO发送帧信息。但是,如果网络繁忙,控制器会延迟传输(FEC_CRS断言)。
•在发送之前,控制器等待载波检测变为非活动状态,然后确定载波检测是否在60位时间内保持非活动状态。如果传输在额外等待36位时间(载波检测最初变为非活动后的96位时间)后开始,则可以根据EIMR中的设置生成缓冲区(TXB)和帧(TXF)中断。
•接收- FEC接收器被设计为几乎不需要主机干预,可以执行地址识别、CRC检查、短帧检查和最大帧长检查。当驱动程序通过断言ECR[ETHER_EN]使能FEC接收器时,它立即开始处理接收帧。当FEC_RX_DV断言时,接收端检查有效的PA/SFD报头。如果PA/SFD是有效的,并由接收器处理帧。如果没有找到有效的PA/SFD,帧将被忽略。在MII模式下,接收端检查至少一个与SFD匹配的字节。零个或更多的PA字节可能发生,但是如果在SFD字节之前检测到00位序列,帧将被忽略。
•接收到帧的前6个字节后,FEC对帧进行地址识别。在接收期间,以太网控制器检查各种错误条件,一旦整个帧写入FIFO,一个32位帧状态字写入FIFO。该状态字包含M、BC、MC、LG、NO、CR、OV、TR状态位和帧长。如果EIMR寄存器使能,接收缓冲区(RXB)和帧中断(RXF)可能产生。当接收帧完成时,FEC在RxBD中设置L位,将其他帧状态位写入RxBD,并清除E位。接下来,以太网控制器产生一个可屏蔽中断(EIR中的RXF位,EIMR中的RXF位可屏蔽),表明一个帧已经接收到并在内存中。然后,以太网控制器等待新的帧。
•中断管理——当一个事件发生时,在EIR中设置了一个位,如果在中断掩码寄存器(EIMR)中相应的位也设置了,则产生一个中断。如果向该位写入1,则清空该EIR中的位;写零没有影响。该寄存器在硬件复位时被清除。这些中断可以分为操作中断、收发器/网络错误中断和内部错误中断。正常操作可能发生的中断有GRA、TXF、TXB、RXF、RXB。在网络或收发器中检测到的错误/问题导致的中断有HBERR、BABR、BABT、LC和RL。由内部错误导致的中断是HBERR和UN。一些错误中断被单独计算在MIB块计数器中。软件可以选择屏蔽这些中断,因为这些错误通过MIB计数器对网络管理可见。
•PHY management-phylib用于管理所有FEC PHY相关的操作,如PHY发现、链路状态和状态机。MDIO总线将在FEC驱动程序中创建并注册到系统中。更多信息请参见Linux操作系统源目录下的Documentation/networking/phy.txt。
4.4.3软件操作
FEC驱动支持以下功能:
•模块初始化-用特定于设备的结构初始化模块
•接收/发送传输
•中断服务程序
•物理层管理
•FEC管理,如init/start/stop
•i.MX 6 FEC模块使用little-endian格式
4.4.4源代码结构
下表显示了源文件。
它们可以在drivers/net/ethernet/freescale目录中找到

4.4.5菜单配置选项
配置内核以提供此模块:
•该模块提供了CONFIG_FEC。此选项可在以下情况下使用:

— Device Drivers > Network device support > Ethernet (10, 100 or 1000 Mbit) > FEC Ethernet controller。

—要通过FEC挂载NFS-rootfs,如果需要,请禁用menuconfig中的其他Network配置。
4.4.6编程接口
设备特定的定义被添加到头文件(fec.h)中,它们提供了通用的单板配置选项。
fec.h定义了寄存器访问的结构和缓冲区描述符的结构。例如,

/*
* Define the buffer descriptor structure.
*/
struct bufdesc 
 unsigned short cbd_datlen; /* Data length */
 unsigned short cbd_sc; /* Control and status info */
 unsigned long cbd_bufaddr; /* Buffer address */
;
struct bufdesc_ex 
 struct bufdesc desc;
 unsigned long cbd_esc;
 unsigned long cbd_prot;
 unsigned long cbd_bdu;
 unsigned long ts;
 unsigned short res0[4];
;
/*
* Define the register access structure.
*/
#define FEC_IEVENT 0x004 /* Interrupt event reg */
#define FEC_IMASK 0x008 /* Interrupt mask reg */
#define FEC_R_DES_ACTIVE 0x010 /* Receive descriptor reg */
#define FEC_X_DES_ACTIVE 0x014 /* Transmit descriptor reg */
#define FEC_ECNTRL 0x024 /* Ethernet control reg */
#define FEC_MII_DATA 0x040 /* MII manage frame reg */
#define FEC_MII_SPEED 0x044 /* MII speed control reg */
#define FEC_MIB_CTRLSTAT 0x064 /* MIB control/status reg */
#define FEC_R_CNTRL 0x084 /* Receive control reg */
#define FEC_X_CNTRL 0x0c4 /* Transmit Control reg */
#define FEC_ADDR_LOW 0x0e4 /* Low 32bits MAC address */
#define FEC_ADDR_HIGH 0x0e8 /* High 16bits MAC address */
#define FEC_OPD 0x0ec /* Opcode + Pause duration */
#define FEC_HASH_TABLE_HIGH 0x118 /* High 32bits hash table */
#define FEC_HASH_TABLE_LOW 0x11c /* Low 32bits hash table */
#define FEC_GRP_HASH_TABLE_HIGH 0x120 /* High 32bits hash table */
#define FEC_GRP_HASH_TABLE_LOW 0x124 /* Low 32bits hash table */
#define FEC_X_WMRK 0x144 /* FIFO transmit water mark */
#define FEC_R_BOUND 0x14c /* FIFO receive bound reg */
#define FEC_R_FSTART 0x150 /* FIFO receive start reg */
#define FEC_R_DES_START 0x180 /* Receive descriptor ring */
#define FEC_X_DES_START 0x184 /* Transmit descriptor ring */
#define FEC_R_BUFF_SIZE 0x188 /* Maximum receive buff size */
#define FEC_MIIGSK_CFGR 0x300 /* MIIGSK config register */
#define FEC_MIIGSK_ENR 0x308 /* MIIGSK enable register */

4.4.6.1获取MAC地址
MAC地址可以通过内核命令行、内核设备树DTS文件、OCOTP或引导加载程序(如U-Boot)设置的MAC寄存器来设置。FEC驱动程序使用它来为网络设备配置MAC地址。通常,使用fec形式的内核命令行。fec.macaddr=0x00,0x04,0x9f,0x01,0x30,0xe0设置MAC地址。由于某些引脚冲突(FEC RMII模式需要使用GPIO_16或RGMII_TX_CTL引脚作为时钟的参考输入/输出通道),这两个引脚中的一个无法连接到其他模块使用的分支线路,因为分支线路对时钟影响严重。
4.5 FlexCAN
4.5.1介绍
FlexCAN是根据CAN 2.0B协议规范实现CAN协议的通信控制器。
CAN协议主要用于作为车辆串行数据总线,满足该领域的具体要求,如实时处理、车辆EMI环境下的可靠运行、成本效益和所需的带宽。
支持标准和扩展消息帧。最大消息缓冲区为64。驱动为PF_CAN协议族的网络设备驱动。

详细信息请参见Linux源目录下的“lwn.net/Articles/253425”或“Documentation/networking/can.txt”。
i.MX 8QuadMax/8QuadXPlus上的FlexCAN支持CAN FD协议。
4.5.1.1软件操作
CAN驱动是一种网络设备驱动。软件操作的常用信息请参考内核源目录下的文档“Documentation/networking/can.txt”。
CAN网络设备驱动程序接口提供了一个通用接口来设置、配置和监控CAN网络设备。然后,用户可以使用来自“IPROUTE2”实用工具套件的程序“ip”,通过网络链路接口配置can设备,比如设置位定时参数。
启动和停止CAN网络设备。
使用“ifconfig canX up/down”或“ip link set canX up/down”命令正常启动或停止CAN网络设备。
请注意,在启动CAN设备之前,您必须定义适当的位定时参数,以避免容易出错的默认设置:
•ip链路设置canX up类型可以比特率125000
iproute2工具还为can总线提供了一些其他配置功能,比如位计时设置。详细信息请参见内核文档:Documentation/networking/can.txt
4.5.1.2源代码结构
下表显示了drivers/net/can中可用的驱动程序源文件

4.5.1.3菜单配置选项
这个模块提供了以下内核配置选项。

•CONFIG_CAN -构建对PF_CAN协议族的支持。在menuconfig中,该选项在Networking > CAN bus subsystem support下可用。
•CONFIG_CAN_RAW -构建对Raw CAN协议的支持。在menuconfig中,该选项在Networking > CAN bus subsystem support > Raw CAN Protocol (raw access with CAN-ID filtering)下可用。
•CONFIG_CAN_BCM -建立对广播管理器CAN协议的支持。在menuconfig中,该选项在Networking > CAN bus subsystem support > Broadcast Manager CAN Protocol (with content filtering)下可用。
•CONFIG_CAN_VCAN -建立对虚拟本地CAN接口(也在以太网接口)的支持。在menuconfig中,该选项在Networking > CAN bus subsystem support > CAN Device Driver > Virtual Local CAN Interface (vcan)。
•CONFIG_CAN_DEBUG_DEVICES—构建对向驱动程序的系统日志生成调试消息的支持。在menuconfig中,该选项在Networking > CAN bus subsystem support > CAN Device Driver > CAN devices debugging messages.。
•CONFIG_CAN_FLEXCAN -构建对FlexCAN设备驱动程序的支持。在menuconfig中,该选项在Networking > CAN bus subsystem support > CAN Device Driver > Freescale FlexCAN下可用。

4.6 Inter-IC (I2C)
4.6.1介绍
LPI2C是一种双向串行总线,它提供了一种简单、高效的数据交换方法,最大限度地减少设备之间的互连。
Linux操作系统的LPI2C驱动程序由两部分组成:
•总线驱动底层接口,用于与LPI2C总线通信
•芯片驱动程序-其他设备驱动程序与LPI2C总线驱动程序之间的接口
I2C总线驱动程序是一个底层接口,用于与I2C总线进行接口。这个驱动程序由I2C芯片驱动程序调用,它不暴露给用户空间。标准的Linux内核包含一个I2C核心模块,芯片驱动使用该模块访问总线驱动,通过I2C总线传输数据。这个总线驱动程序支持:
•兼容I2C总线标准
•比特率高达400kbps
•标准I2C主模式
•电源管理功能,暂停和恢复I2C。
4.6.2 LPI2C总线驱动概述
LPI2C总线驱动程序仅由芯片驱动程序调用,不向用户空间公开。标准的Linux内核包含一个I2C核心模块,芯片驱动通过该模块访问LPI2C总线驱动,通过LPI2C总线传输数据。芯片驱动程序使用Linux内核中提供的标准内核空间API来访问核心I2C模块。标准的I2C内核函数记录在内核源代码树的Documentation/ I2C下的文件中。这个总线驱动支持以下特性:
•兼容I2C总线标准
•中断驱动,逐字节的数据传输
•标准I2C主模式
4.6.3 I2C设备驱动简介
I2C设备驱动程序实现了与LPI2C总线驱动程序通信所需的所有Linux I2C数据结构。它向其他设备驱动程序公开一个自定义内核空间API,以便将数据传输到连接到LPI2C总线的设备。
在内部,这些API函数使用标准的I2C内核空间API来调用I2C核心模块。I2C核心模块查找LPI2C总线驱动程序,调用LPI2C总线驱动程序中的相应函数进行数据传输。该驱动程序为其他设备驱动程序提供以下功能:
•读取功能,读取设备寄存器
•写入功能,用于写入设备寄存器
4.6.4软件操作
Linux操作系统的I2C驱动包括I2C总线驱动和I2C芯片驱动两部分。
4.6.5 I2C总线驱动软件操作
I2C总线驱动程序由一个名为i2c_adapter的结构来描述。这个结构中最重要的字段是struct i2c_algorithm * alggo。该字段是一个指向i2c_algorithm结构的指针,该结构描述了数据如何在I2C总线上传输。该算法结构包含一个指向函数的指针,每当I2C芯片驱动程序想要与I2C设备通信时,该函数就会被调用。
在启动过程中,当加载驱动时,I2C总线适配器被注册到I2C核心上。某些架构有多个I2C模块。如果是这样,驱动程序为I2C核心的每个I2C模块注册单独的i2c_adapter结构。当卸载驱动程序时,这些适配器将被取消注册(删除)。
在正常通信过程中,当传输出现某些错误条件(如检测到NACK)时,它会超时并返回错误。当发生错误情况时,I2C驱动器应停止电流传输。
4.6.6 I2C设备驱动软件操作
I2C驱动程序在I2C总线上控制一个单独的I2C设备。I2C芯片驱动程序的结构为i2c_driver。这个结构中感兴趣的字段是flags和attach_adapter。flags字段被设置为一个值I2C_DF_NOTIFY,以便在加载驱动程序之后,任何新的I2C设备都可以通知芯片驱动程序。当加载I2C总线驱动程序时,该驱动程序存储与该总线驱动程序相关联的i2c_adapter结构,以便它可以使用适当的方法传输数据。
4.6.7驱动特性
LPI2C驱动支持以下特性:
•I2C通信协议
•I2C主操作模式

请注意:LPI2C驱动不支持slave模式。处理步骤
4.6.8源代码结构
下表显示了drivers/i2c/bus中可用的驱动程序源文件

4.6.9菜单配置选项
通过menuconfig配置内核选项来启用该模块:

i.MX 6、i.MX 7、i.MX 8M选择:Device Drivers > I2C support > I2C Hardware Bus support > IMX I2C interface.。
i.MX 8和i.MX 8X选择:Device Drivers > I2C support > I2C Hardware Bus support > IMX Low Power I2C interface。

4.6.10编程接口
LPI2C设备驱动程序可以使用标准的SMBus接口来读写连接到LPI2C总线的设备的寄存器。有关更多信息,请参见include/linux/i2c.h。
4.7媒体本地总线
4.7.1介绍
MediaLB是pcb上或芯片间通信总线,专门设计用于标准化通用硬件接口和软件API库。
这种标准化允许一个或多个应用程序访问MOST Network数据,或以最小的工作量与其他应用程序通信。MediaLB支持大多数网络的所有数据传输方式:同步流数据、异步包数据、控制消息数据。MediaLB还支持一种同步数据传输方法。
关于MediaLB的信息,请参阅媒体本地总线规范。

MediaLB模块实现了MediaLB规范的物理层和链路层,将i.MX与MediaLB控制器连接起来。
MLB实现了3针MediaLB模式,运行速度可达1024Fs。它不实现MediaLB控制器功能。所有MediaLB设备都支持一组通过MediaLB发送数据的物理通道。每个物理通道长度为4字节(四元组),并被分组成逻辑通道,每个逻辑通道分配一个或多个物理通道。这些逻辑通道可以是通道类型(同步、异步、控制或同步)和方向(发送或接收)的任意组合。
MLB支持最多64个逻辑通道和最多64个物理通道。使用唯一的通道地址引用每个逻辑通道,并表示传输数据的MediaLB设备和接收数据的MediaLB设备之间的单向数据路径。
支持的特性如下。
•同步、异步、控制和等时通道。
•最大支持64个逻辑通道和64个物理通道,最大运行速度1024Fs。
•作为与逻辑通道地址相关联的传输设备,传输命令和数据,接收接收状态。
•作为与逻辑通道地址相关联的接收设备,接收命令和数据,并作为接收状态响应传输。
•MediaLB锁检测。
•系统通道命令处理。
•256Fs, 512Fs和1024Fs帧率。
•异步、控制、同步和等时通道类型。
•MLB设备模块的以下配置:
——帧率
——设备地址
——频道地址

•MLB通道异常获取接口。所有通道异常都由应用程序发送和处理。
4.7.2 MLB驱动简介
MLB驱动程序被设计为一个普通的Linux操作系统字符驱动程序。采用乒乓缓冲操作方式,实现了一台异步、一台控制通道设备。支持的帧速率为256f、512f和1024f。MLB驱动使用普通的读写接口接收/发送报文,使用ioctl接口配置MLB设备模块。
MLB驱动程序架构如下图所示。

MLB驱动程序创建四个次要设备。这四种设备支持控制Tx/Rx通道、异步Tx/Rx通道、同步Tx/Rx通道和同步Tx/Rx通道。设备文件分别为/dev/ctrl、/dev/async、/dev/sync和/dev/isoc。每个次要设备都有相同的接口,并处理Tx和Rx操作。下面的描述是针对这两个控件的和异步设备。
驱动程序使用IRAM作为MLB设备模块的Tx/Rx缓冲区。模块与IRAM之间的所有数据传输和接收都由MLB模块DMA处理。驱动程序负责为MLB模块配置缓冲区开始和结束指针。
对于接收,驱动程序使用一个环形缓冲区来缓冲接收的数据包。当一个数据包到达时,MLB模块将接收到的数据包放入IRAM Rx缓冲区,并通过中断通知驱动程序。然后驱动程序将数据包从IRAM复制到一个由写入位置指示的环形缓冲区节点,并使用下一个空节点更新写入位置。最后通知数据包读取器应用程序,,它从环形缓冲区读取位置所指示的节点获得一个包。在读取完成后,它使用下一个可用的缓冲区节点更新读取位置。当读写位置相同时,环缓冲区没有收到报文。
对于传输,驱动程序将写入应用程序给出的数据包写入IRAM Tx缓冲区,更新Tx状态并设置MLB设备模块Tx缓冲区指针开始传输。传输完成后,通过中断通知驱动程序并更新发送状态以接受来自应用程序的下一个数据包。
驱动支持NON BLOCK I/O。用户应用程序可以轮询检查是否有数据包或异常事件需要读取,也可以检查数据包是否可以发送。如果有异常事件,应用程序可以调用ioctl来获取事件。ioctl还提供了配置帧速率、设备地址和通道地址的接口。
4.7.3软件操作
MLB驱动程序为应用程序提供了一个公共接口。
•支持报文读/写- block、NONBLOCK报文I/O方式。一次只能读写一个数据包。最小读长度必须大于等于接收报文长度,同时写长度必须小于1024字节。

•轮询- MLB驱动提供了轮询接口,轮询三种状态,应用程序可以使用select来获取当前的I/O
状态:
-数据包可读取(准备读取)
-驱动程序准备发送下一个包(准备写)
-异常事件来了(准备读取)
•ioctl- mlb驱动提供以下ioctl:
MLB_SET_FPS
参数类型:unsigned int
设置帧速率,参数必须是256,512或1024。
MLB_GET_VER
参数类型:unsigned long
获取MLB设备模块版本号,i.MX35默认为0x02000202。
MLB_SET_DEVADDR
参数类型:unsigned char
设置MLB设备地址,系统通道MlbScan命令使用该地址。
MLB_CHAN_SETADDR
参数类型:unsigned int
设置相应的通道地址[8:1]位。这个ioctl结合了tx和rx通道地址,参数格式是:
Tx_ca [8:1] << 16 | rx_ca[8:1]。
MLB_CHAN_STARTUP
启动相应类型的通道进行发射和接收。
MLB_CHAN_SHUTDOWN
关闭相应类型的通道。
MLB_CHAN_GETEVENT
参数类型:unsigned long
从MLB设备模块获取异常事件,事件定义为一组枚举:
MLB_EVT_TX_PROTO_ERR_CUR
MLB_EVT_TX_BRK_DETECT_CUR
MLB_EVT_RX_PROTO_ERR_CUR
MLB_EVT_RX_BRK_DETECT_CUR

4.7.4源代码结构
下表列出了MLB驱动程序源文件。

4.7.5菜单配置选项
在菜单配置中启用以下模块:

Device Drivers > MXC support drivers > MXC Media Local Bus Driver > MLB support。

以上是关于基于linux5.15.5的IMX 参考手册 --- 6的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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