基于S3C2440平台的USB_WiFi驱动移植

2015-07-18 13:20陈侃松邵冲张丹张满意何林桂
物联网技术 2015年5期
关键词:驱动程序

陈侃松+邵冲+张丹+张满意+何林桂

摘 要:针对当下比较通用的USB_WiFi无线通信芯片在嵌入式系统开发应用中的具体要求,分析 Linux系统下基于ARM9处理芯片S3C2440 的USB_ WiFi驱动程序。结合 S3C2440与AR9271的接口电路设计、USB_WiFi驱动程序体系结构移植了USB无线设备驱动,并分析了数据传输的具体过程。根据实验结论,该WiFi驱动程序能够实现预期目标,并可用于应用系统的开发。

关键词:WiFi无线通信;Linux;S3C2440;驱动程序;无线网络设备

中图分类号:TP393 文献标识码:A 文章编号:2095-1302(2015)05-00-02

0 引 言

随着科技的进步, 基于802.11系列协议的WiFi无线保真通信技术迅猛发展,使得WiFi技术能够应用在多种不同的嵌入式设备上,并方便的连接运营商提供的接入点。WiFi与其他无线通信技术相比, 拥有组网灵活,数据传输速度快,传输距离远的特性。在已部署WiFi网络的范围内搭建WSN网络非常灵活而且组网成本不高。

1 WiFi技术和平台介绍

1.1 硬件平台总体设计

如图1所示,能达到本文需求的无线传输系统由S3C2440控制器、WiFi无线网卡和上位机组成。测试系统将输入的数据传输给中心处理芯片S3C2440,S3C2440将得到的数据储存到存储器,并对数据进行处理,然后由USB接口将封装的数据通过WiFi网络建立起的无线通信链路,传送到远端上位机。

图 1 硬件平台设计图

1.2 USB接口电路设计

S3C2440处理器通过USB接口与Atheros AR9271无线网卡的USB接口连接,实现数据的传输和接收。其中,数据的发送端是S3C2440。针对设备对系统资源需求的不同,在USB规范中规定了4种不同的数据传输方式,这里使用实时传输方式。这种传输方式可以连续不断地在S3C2440与USB设备之间传输数据。S3C2440的DN0、DP0引脚分别与AR9271的DM、DP引脚相连接;DN与DP输出的是一对差分信号。

2 WiFi驱动程序移植

2.1 WiFi驱动体系结构

AR9271无线网卡正常工作所需要的驱动程序主要包括两部分:WLAN驱动和USB接口驱动。WLAN驱动的作用在整个数据接收和传输的过程中非常重要,它既要接收从应用层传来的数据,把数据从USB接口转发到S3C2440平台;又要响应S3C2440平台传过来的中断,借助USB驱动程序注册的接口函数,读取硬件缓冲区的数据流,传递数据到应用层。内核启动后,会自动加载AR9271的固件htc_9271.fw,它在S3C2440平台根文件系统的/lib/firmware目录下。它的主要作用是控制WiFi硬件上的接口,完成802.11数据帧和802.3数据帧之间的转换和实现数据缓冲。由此可见, WiFi无线网卡设备在Linux中是被当作一般的以太网设备来识别。

2.2 USB接口驱动分析

USB接口初始化函数由ath9k_hif_usb_init入口,ath9k_hif_usb_exit出口。ath9k_hif_usb_init所做的工作,就是通过usb_register函数将ath9k_hif_usb驱动挂入到内核USB驱动链中。

ath9k_hif_usb_probe函数是最重要的,主要用于设备的探测以及所需内核资源的初始化。ath9k_hif_usb_suspend和ath9k_hif_usb_resume主要是处理电源管理相关工作,如收到suspend时以怎样的低功耗工作,以及resume如何恢复等。

ath9k_hif_usb_disconnect是当USB设备从系统中移除之后会调用的接口。rtusb_usb_id是驱动支持的USB设备ID。

ath9k_hif_usb_driver结构体初始化时向内核注册完之后,驱动就会扫描USB总线,查找是否有此驱动相应的设备在总线上,如果有设备,就会调用probe函数;或者驱动初始化后,再把设备插到系统上,此时也会从USB总线的中断触发到ath9k_hif_usb_driver的probe函数。两种调用的触发方式不同。

2.3 无线网卡驱动分析

2.3.1 Probe函数分析

ath9k_hif_usb_driver中的probe函数作用是测试当前驱动是否支持接入的USB设备。如果支持该USB设备,则调用interface_to_usbdev()函数先获取该接口的信息,再让udev结构体指针指向这段信息,使用kzalloc()函数为该USB设备分配空间,用hif_device_usb *hif_dev指针接收。然后把设备信息、接口信息、设备ID赋值给分配的USB设备:

hif_dev->udev = udev;

hif_dev->interface = interface;

hif_dev->usb_device_id = id;

接着probe 函数调用 usb_set_intfdata(struct usb_interface *intf, void *data)函数,这个函数的第一个参数是通过probe函数接收的要支持USB设备接口的数据结构的指针,第二个参数是内核中自己分配的描述该USB设备的结构体指针。 这个函数主要的作用是把接口和本驱动要用到的USB设备结构体建立连接。通过probe(struct usb_interface *interface,const struct usb_device_id *id)函数和上面一系列的分析我们可以看出来,一个设备对应一个驱动。

在这一系列工作完成后,通过init_completion(&hif_dev->fw_done)函数把它放入等待队列,等待加载与之相对应的固件。

2.3.2 数据的传输

USB无线网卡与其它接口无线网卡不一样的地方是,USB无线网卡是ath9k_hif_usb_rx_cb()函数通过查询来确定是否需要读取数据,而不是使用中断方式。当USB设备需要传输数据给其它无线设备时,ath9k_hif_usb_alloc_rx_urbs()函数会分配一个URB结构体,然后由ath9k_hif_usb_rx_cb()函数向USB核心发送一个读请求,以便它能够及时响应。当准备发送数据时,802.11协议层会构造并填充kb_buff结构体来描述将要发送的数据包,并调用hif_usb_send()函数来发送该数据包;这个函数的另一个作用是根据数据包的长度把它分割成USB设备能够传输的长度,然后构造写请求URB,再发送到USB核心,当USB设备从系统中移除后,就会调用ath9k_hif_usb_disconnect()函数,释放已经分配的系统资源,注销该设备。

3 结 语

作为目前无线网络应用最广泛的技术,在S3C2440平台上WiFi驱动的移植非常具有实际意义。本文分析移植了基于Linux系统的USB接口WiFi驱动程序的具体过程,且测试可用。这为其他的嵌入式平台WiFi驱动提供了参考。

参考文献

[1]刘欣.基于物联网的远程家庭监健康控监护系统网络的研究[D].北京: 北京邮电大学, 2011.

[2] Rajesh N, H Sarojadevi. Emerging Trends in Video Surveillance Applications[C]. Proceedings of International Conference on Software and Computer Applications, 2011:220-224.

[3]冯丽芳,孙俊,周俊华,等. 基于ARM9的网络视频监控系统实现[J].电力自动化设备,2010,26(10):95-97.

[4]李霏,王让定,徐霁.基于嵌入式Linux的多路视频监控系统的设计[J].宁波大学学报,2007,20(2): 151-154.

[5]杨望,宋牟平,陈鹏.嵌入式网络实时视频监控系统的设计[J].江南大学学报,2008,7(5):516-520.

猜你喜欢
驱动程序
阻止Windows Update更新驱动程序
计算机硬件设备驱动程序分析
基于MPC8280的CPU单元与内部总线驱动程序设计
基于WDM的 USB键盘驱动程序开发*