APP下载

基于MPC852T的VxWorks以太网驱动分析与实现

2018-01-18闵卫锋马安良

电子设计工程 2018年1期
关键词:网络设备驱动程序调用

闵卫锋,马安良

(杨凌职业技术学院陕西杨凌712100)

MPC852T是一款高性能通用通信处理器,在该芯片中,将PowerPC内核和通信外设集成于一体,配有多个支持各种通信协议的外设接口因此,该处理器芯片特别适用于通信领域。相对于其他操作系统,VxWorks除了具备常见操作系统的功能外,系统调度和硬实时(确定性)方面有明显的优势,开发工具非常完善,能提供良好的调试机制。它以其良好的可靠性和卓越性能广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。实现了一个基于MPC852T处理器和VxWorks操作系统的END接口标准的以太网驱动程序,为上层软件提供标准调用接口,分层设计保证了相对的独立性,方便跨平台移植。

1 设计原理

MPC852T具有快速以太网控制器(FEC),通过配置FEC的工作模式寄存器GFMR,可以使FEC工作于以太网模式,FEC相对独立,FEC的实现不影响CPM的其它性能。

以太网驱动主要是实现数据的发送、接收,以及完成BD表等,整个过程内核参与较少。发送过程主要由FEC来完成,太网发送被内核使能之后,FEC就按照固定的时间间隔(512个串行时钟)去轮询发送BD表,如果BD表中有数据需要发送,则进行发送操作。这种轮询方式有可能会造成数据延迟。对于实时性要求比较高的数据发送,上层软件在数据准备好之后,可以通过置位TODR[TOD],直接进行发送操作,而不必等到下一次的查询。在全双工方式下,以太网控制器不检测冲突,只维持帧间的最小间隔(96个串行时钟),但是在半双工模式下,在数据发送之前,就需要进行冲突检测。如果线路忙,则推迟发送。只有当CRS信号保持60个串行时钟的无效状态后,再等待CRS信号继续无效36个串行时钟才开始数据发送。

接收被内核使能后,在搜索模式(RX_DV有效且COL无效)判断FEC数据同步寄存器(FDSR)和进入接收移位寄存器的数据,直到匹配时搜索模式结束。提取数据数据帧的首字节,进行数据鉴权,通过后开始接收数据并写入内存,所有数据接收完毕后通知内核进行后续处理。

驱动程序需要完成的部分,是提供CPU相关的TxBD和RxBD操作的方法,当有数据需要发送时,要从CPU取得数据,填充到TxBD中去,当收到数据时,需要将收到的数据通知到网络接收任务。与TTY设备相似地,基于此,需要完成硬件寄存器的初始化,缓存空间的初始化,中断向量的关联,向VxWorks内核提供标准的接口函数。

2 MUX接口层

为了保证网络协议层与网络设备驱动层的无关性,VxWorks操作系统在网络设备驱动层和网络协议层之间增加了MUX接口层,MUX接口层有效隔离了网络设备驱动程序和协议层协议,使得网络设备驱动程序和协议相对独立,双方只有一个公共的接口就是MUX接口层。MUX接口层分别为网络设备驱动层和网络协议层提供了统一标准接口,而网络设备驱动层和网络协议层只需要跟对应的接口进行操作,双方并无直接交互。MUX接口层的加入,有效的避免了网络设备驱动层和网络协议层直接操作,方便设备驱动程序和协议的移植和扩展。

MUX提供的接口如图1所示。

3 关键代码

以太网驱动程序也可以划分为硬件初始化和API两部分。其中,硬件初始化工作是在系统上电初始化的时候完成的。API部分主要是提供了MUX接口层必须的一些标准接口函数。这里重点介绍硬件初始化部分以及驱动程序中用到的关键数据结构。

以太网设备的初始化一般要在作为控制端口的TTY设备初始化完成之后才开始。实际上,网口也可以在整个系统任务都运行完之后再进行加载。加载函数的接口是以结构END_TBL_ENTRY为元素的函数入口。END_TBL_ENTRY结构定义如下:

图1MUX接口示意图

第一个数值是设备的单元号,当加载这个驱动入口时,相应的设备名就是devName#unit,这样可以使用同一个加载函数入口实现多个设备单元的加载。

第二个就是加载函数入口,后续会详细描述。第三个是加载的入口字符串,用以提供对设备的详细描述。

第四个是借用缓存的标识,即收发数据时是否作一次拷贝?目前不使用这个参数。

第五个是BSP的参数入口,即当系统调用函数endLoadFunc()时,提供的void*参数。

第六个是记录是否有效的标志。这个办法可以让一个入口不必使用注释掉代码的办法停止一个驱动的加载。要使能这个驱动的加载,这个变量值写为FALSE,那么系统会加载这个驱动,在完成加载后将这个值写为TRUE。如果在静态配置中把这个值写为TRUE,系统就会停止该驱动的加载。

END_TBL_ENTRY结构变量存放在文件configNet.h文件的数组endDevTbl[]里,最终这个文件会被包含在xxxConfig.c文件(xxxConfig.c文件是指bootConfig.c或者prjConfig.c)里。系统通过muxDevLoad()函 数 来 加 载 endLoadFunc(参 考 <usrNetwork.c>):

endLoadFunc()函数从 muxDevLoad()入口点被系统加载后,就会在需要的地方被系统调用。

4 END驱动加载

END驱动加载如图2所示。

图2 END驱动加载示意图

系统在muxDevLoad()函数中调用endLoadFunc()函数时,并不是直接将END_TBL_ENTRY表中的初始化字符提供给endLoadFunc()函数,而是先提供一个空的字符串以获取该设备的名称,然后在设备列表中寻找这个设备的驱动,如果找到该驱动,则停止调用endLoadFunc()函数以免重复执行,如果找不到该驱动,才会继续执行加载,并会将该驱动的单元号追加到初始化字符串的头部。这在TORNADO的相关说明文档中并没有提及。

在加载完毕后系统通过调用NET_FUNCS驱动函数组中的motFecStar(t)函数将中断和处理函数连接并且使中断使能。也可以手动调用muxDevStart()函数执行网口的启用。

这里特别叙述一下数据的接收处理过程。数据接收通过motFecStar(t)函数使能接收中断,当满足条件的数据完成一帧的接收,它首先被放在RxBD指向的BUFFER中,然后触发CPU的接收中断。在由硬件驱动完成的中断处理函数中,需要通过netJobAdd()将任务级接收函数转交tNetTask任务处理。

netJobAdd()函数处理的主要流程即是调用msgQSend()函数向tNetTask任务发送一个消息,消息的第一个参数即是期望的处理函数入口指针,其余的参数则是提供给处理函数的参数。tNetTask()任务在收到该消息之后即将消息缓存中的第一个4字节组作为函数指针,其余的消息作为函数指针的入参,然后调用处理函数。所以如果使用netJobAdd()调用的函数处理出现异常,将会导致网络任务的异常乃至崩溃产生。

驱动层处理收到的数据时,可以调用endLib.h库中提供的 END_RCV_RTN_CALL(pEnd,pMblk)宏。该宏实际上是调用muxReceive()函数进行数据的接收处理,该函数是在运行muxDevLoad()时被TORNADO系统加载的,这就将数据的接收流程交给了TORNADO系统。在TORNADO的MUX层,系统会通过muxBind()函数将不同协议的数据接收数理函数添加到处理函数列表中,这些处理函数就会在muxReceive()函数中得到执行。

5 结论

文中分析了在VxWorks操作系统上实现基于MPC852T的END标准以太网驱动的设计原理和软件架构,充分发挥了MPC852T的强大控制能力和通信能力,以及VxWorks操作系统资源调度能力和实时性的特性,满足了用户的需求,达到预期目标。为上层软件提供了标准调用接口,经实际产品验证,该END标准以太网驱动稳定、可靠。

[1]周俊杰,何攀峰.基于VxWorks的实时多任务软件框架设计[J].国外电子测量技术,2012,31(4):80-82.

[2]冯先成,李寒,张铁男.基于MPC850 VxWorks系统的BSP设计[J].计算机与数字工程,2012,40(6):39-43.

[3]张宇坤,袁冬莉,黄鑫鑫,等.基于VxWorks的网卡驱动程序开发[J].计算机技术与发展,2013(1):18-20.

[4]张宇,王省书,胡春生.基于VxWorks的多任务实时性分析[J].微处理机,2013,34(1):53-57.

[5]楼杨.基于MPC8548的嵌入式设备光通信接口设计与实现[J].计算机测量与控制,2011(4):45-50.

[6]屈丹.基于MPC8270的MCC驱动设计[J].电子设计工程,2014(24):174-176.

[7]张寅生,雷杰.基于MPC8270的VxWorks BSP的移植[J].计算机技术与发展,2013(4):96-99.

[8]吕晨,李健,张激,等.VxWorks下UDP过载断流问题的改进[J].信息技术,2016(8):167-170.

[9]张煜,陈欣,宋力兵,等.基于MPC8280的CPU单元与内部总线驱动程序设计[J].电子设计工程,2014(19):43-46.

[10]张原,邹程帅,张帅,等.基于VxWorks的PCI总线多功能数据采集卡驱动开发[J].电子设计工程,2012(12):39-41.

[11]李艳军,高华,顾欣莉.实时嵌入式操作系统VxWorks设备驱动程序的设计[J].电子设计工程,2011(5):130-133.

[12]周勇军.关于VxWorks系统及其研究现状的评述[J].测控技术,2015(3):89-90.

[13]肖磊.VxWorks下基于socket的网络通信设计[J].计算机与网络,2012(9):13-15.

[14]陈怀民.VxWorks下设备驱动程序开发技术研究[J].现代电子技术,2015(10):79-80.

[15]胡明民.基于实时操作系统VxWorks的驱动程序开发[D].西安:西安电子科技大学,2012.

[16]曹桂平.VxWorkss设备驱动开发详解[M].北京:电子工业出版社,2011.

[17]孙智博.嵌入式设备驱动开发精解[M].北京:人民邮电出版社,2013.

猜你喜欢

网络设备驱动程序调用
网络设备的安装与调试课程思政整体设计
一种基于C# 的网络设备自动化登录工具的研制
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
计算机硬件设备驱动程序分析
基于系统调用的恶意软件检测技术研究
基于列车监测网络设备的射频功放模块设计
基于MPC8280的CPU单元与内部总线驱动程序设计
基于三层交换技术架构数字化校园网络设备的配置与管理
利用RFC技术实现SAP系统接口通信