基于eCos的无线网卡驱动设计与实现

出处:lbklxq 发布于:2009-09-14 15:03:50

  摘要:本文详细介绍了 eCos下无线网卡驱动程序的体系结构及其设计方法,并将 linux2.6内核所提供的无线配置工具移植到 eCos下,扩展了 eCos下的无线配置管理功能。

  一、引言

  近年来,无线局域网技术,以其灵活性、移动性、高速率及低成本等优势越来越受到广大用户的青睐,因此,如何快速而高效的研发无线局域网设备,对于在该领域内掌握技术及保持市场竞争力具有重要意义。本文通过对开发北京*万通微电子技术股份有限公司自主研发的无线局域网芯片在 eCos(Embedded Configurable Operation System)操作系统下驱动程序的经验总结,介绍了基于 eCos的无线网卡驱动程序编写的一般方法,并扩展了 eCos下的无线网络配置功能,对于嵌入式研发人员在 eCos下开发无线网卡驱动程序有着实际的指导意义。

  二、eCos下无线网卡驱动程序的体系结构

  eCos即嵌入式可配置操作系统,其的特点是可实现源码行级别的配置,与嵌入式 linux相比,eCos版本只有几百个字节 , 体积小巧,非常适合小型嵌入式系统的开发。同时,eCos使用了多任务抢占机制, 具有的中断延迟, 支持嵌入式系统所需的所有同步原语, 并拥有灵活的调度策略和中断处理机制 , 具有良好的实时性。因此,相对于其他嵌入式操作系统而言,eCos更适合于处理实时性信号如 WLAN等通信设备的开发。

  对于无线局域网设备,技术的关键点则在于驱动程序的设计和 IEEE802.11MAC协议栈的实现上。通常情况下,操作系统的驱动程序应包含以下功能[1]:

  1、向内核注册设备;

  2、提供一些基本的 I/O函数,负责设备的初始化和配置任务,以及从设备收发数据、控制设备、处理设备中断等;

  3、调用系统函数,管理设备。驱动程序可调用操作系统内核所提供的函数实现同步、计时、内存管理、缓冲区管理及资源管理等功能;

  由于我们研究开发的是 eCos下的无线网卡驱动程序,因此驱动程序中还必须实现以下功能:

  1、实现 IEEE802.11MAC协议栈的部分管理功能;

  2、对无线网络配置管理的功能。

  在eCos下,网络设备驱动程序大致可以划分为四层,从上到下分别为协议接口层(与 eCos内核及上层协议通信)、网卡高层驱动程序层、提供实际功能的网卡底层驱动功能层、以及网络设备——无线网卡。网卡高层驱动程序是 eCos 对不同类型网卡的底层驱动程序提供了统一的程序接口和编写规范[2]。这样,网卡驱动程序的实现和移植更加灵活和方便。我们实现的无线网卡驱动程序就属于网卡底层驱动功能层,主要分为两大部分, IEEE802.11 MAC协议栈及底层驱动接口程序。由于在实际应用时, IEEE 802.11 MAC协议的实现大部分以硬件实现为主,因此驱动程序中 IEEE 802.11 MAC协议栈部分主要实现协议的部分管理功能,而底层驱动接口部分为编写网卡驱动程序的难点,因此,本文将重点介绍底层驱动接口程序部分的实现方法,该驱动程序硬件基于PCI/Cardbus接口的无线网卡,操作系统则基于的 eCos 2.0版本。

  三、eCos下无线网卡驱动程序的实现

  由于 eCos没有提供 WLAN设备的驱动模型,我们利用 eCos原有的以太网驱动模型,把 WLAN网卡注册成以太网设备,向上层提供以太网驱动的接口,从而使得上层协议栈可以直接使用 WLAN网卡。但是 WLAN网卡和以太网网卡相比需要更多的对 MAC协议栈的管理,譬如,设置信道和设置 BSSID,而这些操作接口是 eCos的以太网设备驱动模型中没有的,对此,我们通过自己的上层管理程序进行操作,这需要在驱动中注册 IOCTL为管理程序提供相应的接口,同时扩充 eCos的无线网络配置功能,在后面的内容中会详细介绍。

  3.1 驱动的注册:在eCos中,通过下面的宏的一个实例注册一个以太网设备,

  NETDEVTAB_ENTRY( wlan_netdev, /*设备表名*/ DRIVER_NAME, /*设备名*/

  系统启动时,初始化函数 wlan_eth_init()被调用,其主要功能是初始化硬件。实现的步骤包括:判断硬件是否正常工作;向系统注册网卡设备;初始化无线网卡的相关寄存器,收发数据包的缓冲区等;为上层协议栈分配内存。实现的伪代码如下:

  static int wlan_eth_init(struct cyg_netdevtab_entry *tab)

  {

  cyg_pci_init(); /* 初始化PCI 总线 */

  /*扫描总线上的PCI 设备,并将扫描到的设备存入devid 中 */

  if (cyg_pci_find_next(CYG_PCI_NULL_DEVID, &devid)){

  do {

  cyg_pci_get_device_info(devid, &dev_info); /*查询当前设备信息,并存入dev_info*/

  cyg_pci_translate_interrupt(&dev_info,&priv->irq) /*为网卡申请中断号,存入irq*/

  if (cyg_pci_configure_device(&dev_info)) { /*为网卡分配内存和I/O 地址空间*/

  } while (cyg_pci_find_next(devid, &devid)); }

  cyg_drv_interrupt_create(…………… ); /*将中断号映射到相应的中断处理函数*/

  cyg_drv_interrupt_attach(priv->interrupt_handle);

  cyg_drv_interrupt_unmask(priv->irq); /*打开中断*/

  ……………………….. /*为上层802.11 协议栈分配内存*/

  wlan_priv_data_init(priv); /*初始化网卡设备相关寄存器*/

  sc->wireless_handlers=&wlan_iw_handler; /*实现无线配置函数*/

  }

  3.2驱动的接口函数:

  网卡成功注册后,系统内核即可调用网卡驱动程序中相应的函数,实现数据包的发送和接收过程。在 eCos中,通过下面的宏实现各函数与内核的关联:

  ETH_DRV_SC(

  wlan_src, /*专用底层驱动函数接口名*/

  &wlan _pri_data, /*网卡驱动私有数据结构*/

  DRIVER_IF_NAME, /*网卡接口名*/

  wlan_eth_start, /*系统初始化后被调用,打开网卡接口,允许网卡收发数据*/

  wlan_eth_stop, /*关闭网卡,禁止收发数据*/

  wlan_eth_control, /*实现对网卡接口的控制*/

  wlan_eth_can_send, /*判断网卡接口状态,忙或空闲*/

  wlan_eth_send, /*此函数实现发送数据过程*/

  wlan_eth_recv, /*此函数实现接收数据过程*/

  wlan_eth_deliver, /*与wlan_eth_dsr()函数结合实现需要花大量时间的数据搬移过程*/

  wlan_eth_poll, /*此函数用于不能使用中断的驱动中以查询的方式去收发网卡数据*/

  wlan_eth_int_vector /*返回中断向量号*/

  );

  通过实现上面的函数,我们的驱动程序就能实现收发数据的过程了。其中,各个函数在驱动程序中的关系及与上层的通信流程如图1所示,具体应用时,收发包流程如下:

  发送流程:网卡初始化并启动后,由上层协议栈首先调用 can_send()函数确定网卡是否可以发送数据,驱动也可以从 can_send()函数的参数中知道将要发送的数据包数量并作相应处理。如果发送队列未满,返回“否”,上层协议栈将等待;如果发送队列已满,则调用 send()函数,send()函数将接受要发送的数据,处理后写入网卡的发送队列。

  接收流程和中断处理流程:网卡初始化并启动后,网卡的接收中断已经打开。当中断到来时,中断服务程序 ISR将被调用, ISR主要负责确定接收是否成功以及对硬件装备中断信号的响应和清除。如果接收失败,程序立刻返回不作任何处理;如果接收成功,则调用 DSR中断服务函数(滞后中断服务函数)。在 DSR中断服务函数中,程序已不占操作体系中的核调度资源,因而 DSR函数与 deliver()函数执行了需要花费大量时间的数据搬移工作,此时接受到的数据处理后将被复制到 sg_list的上层链表中,并通知上层有数据已被接收。

  此外,poll()函数主要是应用于不能使用中断时以查询的方式去接收和发送网卡数据,我们没有实现这个函数。

  3.3对 eCos的无线配置扩充: 由于 Linux 2.6 内核中的无线扩展( Wireless Extensions)已经提供了对 WLAN设备的支持,为了减小工作量,我们将其移植到 eCos上。Linux的无线扩展的作用是对 WLAN设备的 IEEE 802.11 MAC协议栈管理,分为内核部分和应用程序部分。应用程序部分即无线扩展的工具集,无线扩展的工具集的移植主要做的就是把入口函数的形式改变。  eCos内核对其网络设备驱动支持 IOCTL,但只支持有限的一些,不能任意扩充。为了满足对管理 MAC的需要,我们扩充了其对 IOCTL的支持,使其支持更多的 IOCTL。仿照 Linux,我们添加的 IOCTL分为通用 IOCTL和私有 IOCTL,通用 IOCTL的输入和输出已经被约定了,不能更改和扩充,譬如,设置速率的 IOCTL,私有 IOCTL的输入和输出可以按需要定制,要在内核和工具集之间统一传递的数据的格式。由于应用层移植 Linux的工具集并作较少的改变,在内核里需要适合工具集传来的数据的格式。无线扩展工具调用 IOCTL时使用 ioctl(int skfd, int request, struct iwreq * pwrq) 这样的形式,而驱动的 IOCTL处理函数的形式要定义成 int wlan_io_ctrl_set_txpower(eth_drv *ndev, struct iw_request_info *info, struct iw_param*wrqu, char *extra)这样的形式,因此,对 eCos的内核里要判断是通用 IOCTL还是私有 IOCTL,提取并传递相应的参数。这些数据结构的转换在 Linux的源码 include/net/iw_handler.h和 include/linux/wireless.h 文件里,必须把它们移植到 eCos下。 在 eCos内核中的 eth_drv_sc结构中增加一个 structure iw_handler_def wireless_handlers结构,从中能够找到我们定义的 IOCTL函数指针,驱动在初始化时需要填充这个结构并把结构的指针赋值给 wireless_handlers,以此传递 IOCTL函数的函数指针。 修改 eCos的内核文件 packages/io/eth/v2_0/src/net/eth_drv.c中的 eth_drv_ioctl函数,使遇到不支持的 IOCTL码时到 iw_handler_def结构里去查找对应的 IOCTL处理函数,如果存在,则调用对应的 IOCTL处理函数;如果不存在,则继续原来的处理流程。在被调用的 IOCTL处理函数被调用返回后,如果需要在内核和用户层传递数据,则要做上面提到的数据结构的转换并完成数据传递。

  四、总结

  本文的创新点在于:由于 eCos下并没有提供无线网卡驱动模型,本文在设计时利用 eCos下原有的以太网驱动模型接口函数,在此基础上实现无线网卡设备的驱动程序,并将 Linux下的无线扩展工具移植到 eCos下,扩充了 eCos对无线网卡设备的管理功能,实现了无线局域网设备的通信功能。此外,本论文介绍了 eCos操作系统的优点,并详细介绍了在 eCos下设计无线网卡驱动程序的实现方法。根据 eCos越来越受欢迎以及无线局域网的快速发展趋势表明,本文所总结的 eCos下的无线网卡驱动程序的实现方法对嵌入式开发人员将具有正确及重要的指导参考意义。


  

参考文献:

[1]. PCI  datasheet https://www.dzsc.com/datasheet/PCI+_1201469.html.


关键词:基于eCos的无线网卡驱动设计与实现无线网卡驱动

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

超低功耗的射频模块nrf24l01,它在无线通信中是许多玩家的选择!
广告
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:
技术客服:

0571-85317607

网站技术支持

13606545031

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!