基于ARM7处理器uC/OS系统的Nos-Wlan移植
2011-06-24
作者:余俊(北京中电华大电子设计有限责任公司)
1 引言
目前,在无线监控、工业控制、视频传输等行业应用中,嵌入式无线系统主要采用以NORDIC解决方案为代表的无操作系统环境,该方案由“CPU+无线数传模块”构成,能够实现短距离低带宽无线通信。为满足这种需求,北京中电华大电子设计有限责任公司(以下简称华大电子)适时的推出了不依赖于任何操作系统的Nos-Wlan模块以加速现有产品的无线功能的升级,模块支持国内(WAPI)/国际(802.11i)安全标准。本文主要介绍了华大电子Nos-Wlan模块在基于ARM7核处理器LPC2478的uC/OS-ii环境下的移植。
2 Nos-Wlan模块介绍
Nos-Wlan系列模块产品是为了满足工业应用、安防监控等领域中,现有产品的无线功能升级的需要而研发的,其最大的特点在于:它提供了一个不基于任何操作系统的驱动软件,可以集成到任何的系统平台中运行,并实现高速的数据传输,使得没有操作系统也能使用Wi-Fi进行视频传输成为可能。Nos-Wlan产品硬件如图1所示:
图 1 TLG09UB09
Nos-Wlan其驱动软件结构如图2所示:
图 2 Nos-Wlan驱动结构
Nos-Wlan模块集成到主机系统中的位置如图3所示:
图 3 Nos-Wlan在主机系统的位置
3 LPC2478处理器uC/OS-ii系统框图
该系统以NXP的LPC2478处理器为核心,外围集成了FLASH,SDRAM,UART模块,以太网接口模块,USB OTG接口模块,LCD液晶屏和触摸屏模块,以及以FPGA为核心的视频采集模块以及华大电子的Nos-Wlan模块,该系统主要应用于视频监控领域,其系统硬件框架如图4所示:
图 4 系统硬件框架
4 Nos-Wlan模块软件移植
根据华大电子Nos-Wlan软件用户手册,Nos-Wlan模块软件移植所调用的模块内部接口函数有:hedrv_Init,hedrv_UsbPlugIn,hedrv_UsbPullOut,hedrv_UsbRx,hedrv_UsbTxDone,hedrv_UsbControlDone,hedrv_TickFunction,所需要实现的模块内部回调函数有:hosts_UsbHostReset,hosts_UsbTx,hosts_UsbControl,Nos-Wlan模块软件移植代码部分主要实现模块内部的初始化,模块内部所使用源时钟注册,USB控制帧及批量传输帧的发送和接收。其中,系统USB HOST(OHCI)驱动是基于周立功公司所提供的基于U盘的OHCI驱动修改而来,以适应USB无线网卡的需求。
4.1 模块初始化
模块初始化函数aq3_usb_init,完成整个模块的初始化,包括Nos Wifi模块内部内存池的初始化(调用模块接口函数hedrv_Init)、USB传输部分主数据结构的初始化、USB传输主线程的创建、模块内部源时钟的初始化及网卡的初始化(调用模块接口函数hedrv_UsbPlugIn),网卡初始化完成后模块内部会调用用户注册的初始化完成回调函数(DevInitDone,用户实现),该函数由网卡初始化函数hedrv_UsbPlugIn的参数传入。
4.2 模块的卸载
模块卸载函数aq3_usb_exit,完成整个模块的卸载,包块模块主源时钟的释放、Nos Wifi模块的卸载(调用模块接口函数hedrv_UsbPullOut)及所申请资源的释放等。
4.3 Nos-Wlan模块临界保护的实现
由于ucos-ii是实时的多任务嵌入式操作系统,模块需要对相关数据结构进行临界保护,其实现只需要使用ucos-ii提供的临界保护函数即可:
void hosts_EnterCritical (void)
{
OS_ENTER_CRITICAL();
}
void hosts_LeaveCritical (void)
{
OS_EXIT_CRITICAL();
}
4.4 模块源时钟
模块的源时钟时由系统tick定时器产生的,驱动向系统tick服务程序注册定时器超时回调函数,该函调函数进行计时,当10ms定时时间到时,该函数调用模块定时器超时处理回调函数hedrv_TickFunction。
4.5 USB控制帧、Bulkin帧、Bulkout帧传输
本系统中USB帧的发送都是统一在USB传输主线程里处理的,USB相关帧的传输接口函数只需要完成相关发送数据结构的初始化后将其提交给USB传输处理主线程即可。USB控制帧传输函数hosts_UsbControl只需完成USB标准请求数据结构USB_DEV_REQ的初始化,USB BULKOUT帧传输函数hosts_UsbTx只需要完成USB请求数据结构urb的初始化,USB BULKIN帧传输函数usb_bulkin也是只需要完成USB请求数据结构urb的初始化。USB传输主线程usb_transfer_thread,主要处理USB控制帧和批量传输帧的发送及其USB传输完成后的处理,其中USB控制传输采用同步的通信方式,批量传输采用异步的方式,提交urb后即返回,等到传输完成后USB HOST驱动调用提交urb时注册的回调函数,该回调函数发送消息给USB传输主线程,由主线程完成对传输完成后的后续处理。USB传输完成后,主线程将根据完成帧的类型分别调用模块控制帧回调函数hedrv_UsbControlDone或者BULKOUT帧回调函数hedrv_UsbTxDone通知模块本次传输完成,后模块判断内部缓存队列是否为空,若不为空,则模块调用控制帧或者BULKOUT帧传输回调函数(hosts_UsbControl,hosts_UsbTx)继续发送。BULKIN帧传输完成后,传输完成回调函数将调用模块内部接口函数hedrv_UsbRx将接收到的数据帧提交模块处理后继续提交BULKIN帧以接受网卡上行数据。
4.6 Nos-Wlan网络协议栈接口
该部分移植代码涉及的模块回调函数有:hedrv_AllocateNetBuf,hedrv_NetSendNetBuf及hedrv_NetSend,需要用户实现的模块回调函数是hosts_NetRecv。其中hedrv_NetSend是hedrv_AllocateNetBuf和hedrv_NetSendNetBuf的综合,hedrv_AllocateNetBuf用于向模块申请发送内存,hedrv_NetSendNetBuf进行发送操作,而hedrv_NetSend函数则是将用户数据拷贝到模块内部所申请的动态内存里进行相关处理及发送。用户实现hosts_NetRecv回调函数用于处理网卡接收的数据帧,其中数据帧是以以太网包的形式由模块内部调用该函数以提交给用户进行处理的。
调用模块MAC帧发送函数需要用户将需要发送的数据包打包成以太网数据包后提交模块发送,调用函数hedrv_NetSend,用户只需将打包的以太网数据包和长度传给该函数即可,模块内部将完成缓存空间的申请和释放,用户也可以调用函数hedrv_AllocateNetBuf自行申请缓存空间并将以太网数据包拷贝至空间后调用函数hedrv_NetSendNetBuf进行发送,申请的空间不需要用户进行释放操作,模块内部将会在发送成功后自行释放。
当网卡接收到MAC数据帧时,模块将调用回调函数hosts_NetRecv提交用户处理,该函数由用户实现,提交该函数的MAC数据模块将其打包成以太网数据包,用户只需要按以太网数据包处理即可。
5 结论
本文详细介绍了华大电子Nos-Wlan模块在LPC2478处理器uC/OS-ii系统上的移植,整个项目周期为2周,其中系统CPU主频为40MHz,Nos-Wlan模块在该平台下吞吐可达4Mbps,稳定通信可达72小时不断网。通过该系统的移植,证明了华大电子Nos-Wlan模块能够加速客户产品无线功能的升级。
参考文献
[1] 北京中电华大电子设计有限公司. Nos-Wlan软件用户手册[Z]. 北京:北京中电华大电子设计有限公司,2009.
[2] Compaq,Microsoft,National Semiconductor.Open Host Controller Interface Specification for USB[S].1999.
[3] Compaq,Hewlett-Packard,Intel,Lucent,Microsoft,NEC,Philips.Universal Serial Bus Specification Revision 1.1 [S].1998.
[4] 邵贝贝等. 嵌入式实时操作系统uC/OS-II[M]. 北京:北京航空航天大学出版社,2006.
[5] NXP Semiconductors.LPC24XX User manual Rev.04[S].2009.