QNX操作系统的网络交换机驱动设计

2018-08-08 07:31,,
单片机与嵌入式系统应用 2018年8期
关键词:网络接口网络设备网络通信

,,

(国电南京自动化股份有限公司,南京210032)

引 言

随着电力系统智能化的不断发展,对自动化装置的通信技术要求也越来越高,除了要求通信稳定可靠外,还要求通信接口冗余、网络接口尽量多等,而传统的通信模件一般是利用CPU自带的MAC控制器外加独立PHY的方式实现网络通信,由于资源的限制通常一个CPU仅提供2个MAC控制器,限制了对通网络信口的扩展,而通过采用网络交换芯片88e6060可以很方便地设计出5网口甚至以上的通信模组,能最大化满足电力系统通信需求。

1 QNX系统简介

QNX是类UNIX操作系统,由加拿大QSSL公司(QNX Software System Ltd)开发的分布式实时操作系统。它采用独特的微内核结构,由内核实现进程通信、进程调度、中断处理和底层网络通信,因此内核非常小,运行速度极快。将驱动程序、应用程序、网络协议、文件系统存放的地址空间和内核存放的地址空间分离,应用程序无法直接访问内核空间,这种封闭的微内核结构使得任何外部模块的故障都不会影响内核的运行,系统稳定性大大提高,同时QNX支持裁剪和扩展,能针对用户需求定制不同的功能模块,实现灵活的嵌入式开发。

2 原理设计

图1 交换芯片与CPU的连接示意图

通信模件采用AM3352为主控CPU,它是一款基于ARM Cortex-A8内核的微处理器,主频最高支持720 MHz,运算能力高达1600 DMIPS,具有丰富的外围接口,能搭配DDR3,支持大容量的eMMC和NAND Flash。图1给出了网络交换芯片88e6060与CPU的连接示意图,交换芯片作为10/100 BaseT网络收发器,其端口P5设计成MII-PHY模式与CPU连接,P0、P1、P2、P3、P4用于与信息子站、DCS、录波器等网络通信。

3 网络交换机驱动

3.1 QNX下网络驱动层次结构

QNX网络模块采用层次化结构设计,如图2所示,网络设备驱动模块处于最底层,接受io-pkt的调度和管理,负责向io-pkt报告数据收发情况,接收和传递数据。中间层是底层和顶层的数据桥梁,它提供统一接口给协议模块。顶层resource manager提供了Socket API调用的open、write、read等函数,通过read应用层接收来自io-pkt的数据,通过write应用层发送数据到io-pkt,由io-pkt调用协议模块实现IP、TCP、UDP等网络传输协议。

图2 网络模块层次结构图

3.2 QNX下网络交换机驱动原理和实现方法

网络设备驱动程序按功能可划分为初始化模块、中断处理模块、接收数据模块、发送数据模块、网络设备信息统计模块。

3.2.1 初始化

初始化模块对寄存器地址空间进行映射,完成对寄存器的配置,向系统注册中断处理函数、收包函数、发包函数,让系统知道网络设备存在网络通信的能力,并最终由io-pkt调用收包函数、发包函数实现数据的收发。程序首先清空RX_HDP和TX_HDP,将CPPI前4 KB空间分配给接收队列描述字Rx_Descriptors,后4 KB空间分配给发送队列描述字Tx_Descriptors。Rx_Descriptors是按下面结构体定义的数组,其成员Next指向下一个Rx_Descriptor,成员Buffer指向数据体存放的RAM空间, 成员off_len存放Buffer中有效数据的长度,成员flag_len存储Buffer状态信息和数据包的有效长度。

typedef struct{

uint32_t next; /*Pointer to next descriptor*/

uint32_t buffer; /*Pointer to data buffer*/

uint32_t off_len; /*Buffer offset and length*/

uint32_t flag_len; /*Packet flag and length*/

} cppi_desc_t;

建立Rx_Descriptors的单向链接表,使RX_HDP指向链表的首端。建立起的链表如图3所示。

图3 接收队列链表图

队列描述表建立好后,驱动需要调用设备绑定函数dev_attach为每个端口分配一个网络设备dev,dev封装了网络接口ifnet用于网络设备的管理,ifnet定义了启动分组的传输函数if_start、初始化接口函数if_init、控制命令函数if_ioctl。QNX下的网络驱动不直接响应中断处理,而是由io-pkt接管中断间接调用驱动提供的process_interrupt函数处理中断,为此需要对结构体iopkt_inter定义中断处理函数process_interrupt和中断使能函数enable_interrupt,最后调用interrupt_entry_init、if_attach、ether_ifattach将上述函数注册进io-pkt。

为了保证网络上网络设备MAC地址的唯一性,采取了将IP地址映射到MAC地址的方法,由初始化程序读配置文件获取各网络设备的IP地址,然后将MAC[3:0]设置成IP[3:0],从而实现了网络设备MAC地址与IP地址的同步。

电力系统通信的主要特点是正常运行流量较小,突发流量较大[1]。不同特点的报文在网络上传输会产生不同流量特征,如果网络配置不当,将会产生不合理的报文传输,造成网络风暴[2],使网络通信系统瘫痪,因此要求通信装置有抵御网络风暴的能力。为此可以通过配置AM335X的RX_IMAX和INT_CONTROL寄存器,对每毫秒接收中断次数加以限制,风暴来临时能控制系统资源消耗,风暴消失后能快速恢复通信能力。

接下来需要配置DMA引擎,开放DMA接收使能和发送使能,使能DMA中断。最后通过SMI对交换芯片进行配置,配置PHY为全双工速率的自动协商工作模式。将P5口设置成egress trailer模式,出该端口的数据尾端都会被88e6060打上4字节的trailer标签。同样CPU发往该端口的数据由驱动程序在数据尾端打上4字节trailer标签,通知88e6060数据要发到哪个端口。trailer标签的格式如图4所示,DPV[5:0]标识了数据要发往哪个端口。P0、P1、P2、P3、P4设置成普通模式,进出该端口的数据是不被修改的未标记帧。

图4 Marvell trailer标签格式

为了实现多网口的网络通信,需要按表1配置交换机路由表。

表1 VLANTable设置

配置完成后形成图5所示的连接关系,P0、P1、P2、P3、P4同P5保持双向的连接,P0、P1、P2、P3、P4接收外部请求后通过P5接口把请求数据转发给CPU,CPU处理完毕后,由P5接口把数据转发给请求端口。

图5 路由图连接关系

由于P5接口收到的包可能来自P0~P4中的任意一个端口,所以需要在收包函数Receive里告诉io-pkt收到的数据来自哪一个端口,为此在网络设备dev里定义了数组成员common_ecom[0~5]用于存储各网络设备和各网络接口的对应关系,从而通过网络设备可以快速找到网络接口ifnet。

3.2.2 中断处理

当网络数据到来时,由DMA控制器将数据放到外部Buffer,CPU更新Rx_descriptor的Buffer 域、off_len域和flag_len域,同时中断控制器产生中断信号,io-pkt接管中断,间接调用驱动提供的process_interrupt函数,通过process_interrupt函数调用Receive函数接收数据。

3.2.3 接收数据

Receive函数从接收队列描述字获取有效数据长度,用这个长度更新接收数据链mbuf的m_pkthdr.len域和mlen域。由于通过RMMI收到的来自交换芯片P5接口的数据是尾部被打上4字节tailer标签的标记帧,所以数据送到io-pkt前需要去掉tailer标签,为此只需要对mbuf的m_pkthdr.len域和mlen域做减4操作,同时要告知io-pkt数据是来自哪一个网络接口。标记帧的tailer标签DPV[5:0]域指明了数据是来自哪一个端口,通过DPV[5:0]可以找到网络设备dev对应的common_ecom[]数组成员,从而确定网络接口ifnet,将ifnet作为参数传入ip_input,这样io-pkt就知道数据来自哪一个网络接口以及应答数据要送往哪一个网络接口。

3.2.4 发送数据

由io-pkt启动分组传输函数if_start将应答数据发往对应的网络接口。由于P5接口设置成了egress trailer模式,需要由驱动在应答数据末尾加上4字节的tailer标签,为此,通过m_get函数从系统空间分配数据区m3用于存放tailer标签。通过if_start函数的ifnet参数可以找到对应的网络设备,网络设备的device_index成员存储了设备ID即数据要发往的端口号,把1左移device_index位后写到m3的数据成员m_data[1],用于通知88e6060数据要发往哪个端口,然后将m3链接到m2的尾端形成如图6所示的链表。因为增加了4字节的tailer标签,m1成员m_pkthdr.len需要加4。最后更新发送队列描述字,向TX_HDP写入发送队列描述字首地址启动TX DMA发送数据。

驱动程序编写好后需要配置脚本文件,通过脚本启动网络设备。脚本配置如下:

io-pkt-v4-hc-dam335x deviceindex=0

ifconfig dm0 172.20.6.220 up

ifconfig dm1 172.30.6.220 up

……

结 语

利用交换芯片88e6060可以很方便、容易地扩展网络接口,能满足电力系统自动化装置对多通信口的需求。对利用88e6060设计出来的通信模件进行了实测,

其网络通信可靠、稳定,能抵御网络风暴,将其应用于电力系统能大大提高电力系统的稳定性。

图6 添加tailer标签示意图

猜你喜欢
网络接口网络设备网络通信
网络设备的安装与调试课程思政整体设计
一种基于C# 的网络设备自动化登录工具的研制
基于网络通信的智能照明系统设计
网络通信中信息隐藏技术的应用
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
双冗余网络接口自动切换测试模块的设计与实现
浅析CTC与GSM-R系统网络接口及路由配置改进措施
网络设置管理
京沪高铁GSM-R网络接口监测网关子系统的设计与实现