配色: 字号:
wifi驱动分析文档
2014-06-17 | 阅:  转:  |  分享 
  














WLAN驱动分析文档

目录

1 引言 3

1.1 目的 3

1.2 项目背景 3

1.3 参考资料 3

2 预备知识 3

2.1 WLAN技术 3

2.2 802.11协议简述 3

2.2.1 概述 3

2.2.2 802.11工作方式 4

2.2.3 802.11物理层 4

2.2.4 802.11b的增强物理层 4

2.2.5 802.11数字链路层 5

2.2.6 联合结构、蜂窝结构和漫游 5

2.3 802.11四种主要物理组件 6

2.4 802.11MAX基础 6

2.4.1 802.11原子帧传送 6

2.4.2 RTS/CTS 7

2.4.3 载波监听功能 7

2.4.4 帧间间隔 8

2.4.5 DCF竞争服务 8

2.4.6 封包帧 9

2.4.7 PCF无竞争服务 9

3 802.11eWMM应用介绍 10

3.1 802.11e与802.11的不同 10

3.2 802.11eWMM模块的原理 10

4 WLAN驱动结构介绍 12

4.1 SDIO驱动 12

4.2 详细接口及代码分析 12

4.2.1 SDIO注册流程分析 12

4.2.2 WILAN驱动流程分析 14

























引言

目的

通过编写阅读本文档,可以达到如下目的:

对WLAN技术有一定了解

对802.11a、802.11b及相应的扩展协议有一定的了解

详细阐述了WLAN驱动的原理及802.11e的WMM扩展。

对AndroidLIB层与WLAN驱动的接口暂时并无描述。

项目背景

该项目主要是利用android的开源结构,以三星的S3C6410为CPU,AW-GH381为WLAN网络接口卡的一款android手机系统。



参考资料

WLANDesignGuidebyAgilent

ProvidingQoSinWLANsbyintel

预备知识

WLAN技术WLAN是英文WirelessLAN的缩写,就是无线局域网的意思。无线以太网技术是一种基于无线传输的局域网技术,与有线网络技术相比,具有灵活、建网迅速、个人化等特点。将这一技术应用于电信网的接入网领域,能够方便、灵活地为用户提供网络接入,适合于用户流动性较大、有数据业务需求的公共场所、高端的企业及家庭用户、需要临时建网的场合以及难以采用有线接入方式的环境等。作为全球公认的局域网权威,IEEE802工作组建立的标准在过去二十年内在局域网领域独领风骚。这些协议包括了802.3Ethernet协议、802.5TokenRing协议、802.3z100BASE-T快速以太网协议。在1997年,经过了7年的工作以后,IEEE发布了802.11协议,这也是在无线局域网领域内的第一个国际上被认可的协议。在1999年9月,他们又提出了802.11b"HighRate"协议,用来对802.11协议进行补充,802.11b在802.11的1Mbps和2Mbps速率下又增加了5.5Mbps和11Mbps两个新的网络吞吐速率。利用802.11b,移动用户能够获得同Ethernet一样的性能、网络吞吐率、可用性。这个基于标准的技术使得管理员可以根据环境选择合适的局域网技术来构造自己的网络,满足他们的商业用户和其他用户的需求。802.11协议主要工作在ISO协议的最低两层上,并在物理层上进行了一些改动,加入了高速数字传输的特性和连接的稳定性。主要内容:1.802.11工作方式2.802.11物理层3.802.11b的增强物理层4.802.11数字链路层5.联合结构、蜂窝结构和漫游802.11定义了两种类型的设备,一种是无线站,通常是通过一台PC机器加上一块无线网络接口卡构成的,另一个称为无线接入点(AccessPoint,AP),它的作用是提供无线和有线网络之间的桥接。一个无线接入点通常由一个无线输出口和一个有线的网络接口(802.3接口)构成,桥接软件符合802.1d桥接协议。接入点就像是无线网络的一个无线基站,将多个无线的接入站聚合到有线的网络上。无线的终端可以是802.11PCMCIA卡、PCI接口、ISA接口的,或者是在非计算机终端上的嵌入式设备(例如802.11手机)。在802.11最初定义的三个物理层包括了两个扩散频谱技术和一个红外传播规范,无线传输的频道定义在2.4GHz的ISM波段内,这个频段,在各个国际无线管理机构中,例如美国的USA,欧洲的ETSI和日本的MKK都是非注册使用频段。这样,使用802.11的客户端设备就不需要任何无线许可。扩散频谱技术保证了802.11的设备在这个频段上的可用性和可靠的吞吐量,这项技术还可以保证同其他使用同一频段的设备不互相影响。802.11无线标准定义的传输速率是1Mbps和2Mbps,可以使用FHSS(frequencyhoppingspreadspectrum)和DSSS(directsequencespreadspectrum)技术,需要指出的是,FHSS和DHSS技术在运行机制上是完全不同的,所以采用这两种技术的设备没有互操作性。802.11b在无线局域网协议中最大的贡献就在于它在802.11协议的物理层增加了两个新的速度:5.5Mbps和11Mbps。为了实现这个目标,DSSS被选作该标准的唯一的物理层传输技术,这个决定使得802.11b可以和1Mbps和2M的802.11bpsDSSS系统互操作。最初802.11的DSSS标准使用11位的chipping-Barker序列-来将数据编码并发送,每一个11位的chipping代表一个一位的数字信号1或者0,这个序列被转化成波形(称为一个Symbol),然后在空气中传播。这些Symbol以1MSps(每秒1M的symbols)的速度进行传送,传送的机制称为BPSK(BinaryPhaseShiftingKeying),在2Mbps的传送速率中,使用了一种更加复杂的传送方式称为QPSK(QuandraturePhaseShiftingKeying),QPSK中的数据传输率是BPSK的两倍,以此提高了无线传输的带宽。在802.11b标准中,一种更先进的编码技术被采用了,在这个编码技术中,抛弃了原有的11位Barker序列技术,而采用了CCK(ComplementaryCodeKeying)技术,它的核心编码中有一个64个8位编码组成的集合,在这个集合中的数据有特殊的数学特性使得他们能够在经过干扰或者由于反射造成的多方接受问题后还能够被正确地互相区分。5.5Mbps使用CCK串来携带4位的数字信息,而11Mbps的速率使用CCK串来携带8位的数字信息。两个速率的传送都利用QPSK作为调制的手段,不过信号的调制速率为1.375MSps。这也是802.11b获得高速的机理。表1中列举了这些数据。为了支持在有噪音的环境下能够获得较好的传输速率,802.11b采用了动态速率调节技术,来允许用户在不同的环境下自动使用不同的连接速度来补充环境的不利影响。在理想状态下,用户以11M的全速运行,然而,当用户移出理想的11M速率传送的位置或者距离时,或者潜在地受到了干扰的话,这把速度自动按序降低为5.5Mbps、2Mbps、1Mbps。同样,当用户回到理想环境的话,连接速度也会以反向增加直至11Mbps。速率调节机制是在物理层自动实现而不会对用户和其它上层协议产生任何影响。802.11的MAC和802.3协议的MAC非常相似,都是在一个共享媒体之上支持多个用户共享资源,由发送者在发送数据前先进行网络的可用性。在802.3协议中,是由一种称为CSMA/CD(CarrierSenseMultipleAccesswithCollisionDetection)的协议来完成调节,而在802.11无线局域网协议中,冲突的检测存在一定的问题,这个问题称为"Near/Far"现象,这是由于要检测冲突,设备必须能够一边接受数据信号一边传送数据信号,而这在无线系统中是无法办到的。鉴于这个差异,在802.11中对CSMA/CD进行了一些调整,采用了新的协议CSMA/CA(CarrierSenseMultipleAccesswithCollisionAvoidance)或者DCF(DistributedCoordinationFunction)。CSMA/CA利用ACK信号来避免冲突的发生,也就是说,只有当客户端收到网络上返回的ACK信号后才确认送出的数据已经正确到达目的。CSMA/CA通过这种方式来提供无线的共享访问,这种显式的ACK机制在处理无线问题时非常有效。然而不管是对于802.11还是802.3来说,这种方式都增加了额外的负担,所以802.11网络和类似的Ethernet网比较总是在性能上稍逊一筹。另一个的无线MAC层问题是"hiddennode"问题。两个相反的工作站利用一个中心接入点进行连接,这两个工作站都能够"听"到中心接入点的存在,而互相之间则可能由于障碍或者距离原因无法感知到对方的存在。为了解决这个问题,802.11在MAC层上引入了一个新的Send/CleartoSend(RTS/CTS)选项,当这个选项打开后,一个发送工作站传送一个RTS信号,随后等待访问接入点回送RTS信号,由于所有的网络中的工作站能够"听"到访问接入点发出的信号,所以CTS能够让他们停止传送数据,这样发送端就可以发送数据和接受ACK信号而不会造成数据的冲突,这就间接解决了"hiddennode"问题。由于RTS/CTS需要占用网络资源而增加了额外的网络负担,一般只是在那些大数据报上采用(重传大数据报会耗费较大)。最后,802.11MAC子层提供了另两个强壮的功能,CRC校验和包分片。在802.11协议中,每一个在无线网络中传输的数据报都被附加上了校验位以保证它在传送的时候没有出现错误,这和Ethernet中通过上层TCP/IP协议来对数据进行校验有所不同。包分片的功能允许大的数据报在传送的时候被分成较小的部分分批传送。这在网络十分拥挤或者存在干扰的情况下(大数据报在这种环境下传送非常容易遭到破坏)是一个非常有用的特性。这项技术大大减少了许多情况下数据报被重传的概率,从而提高了无线网络的整体性能。MAC子层负责将收到的被分片的大数据报进行重新组装,对于上层协议这个分片的过程是完全透明的。802.11的MAC子层负责解决客户端工作站和访问接入点之间的连接。当一个802.11客户端进入一个或者多个接入点的覆盖范围时,它会根据信号的强弱以及包错误率来自动选择一个接入点来进行连接,一旦被一个接入点接受,客户端就会将发送接受信号的频道切换为接入点的频段。这种重新协商通常发生在无线工作站移出了它原连接的接入点的服务范围,信号衰减后。其他的情况还发生在建筑物造成的信号的变化或者仅仅由于原有接入点中的拥塞。在拥塞的情况下,这种重新协商实现quot;负载平衡"的功能,它将能够使得整个无线网络的利用率达到最高。802.11的DSSS中一共存在着相互覆盖的14个频道,在这14个频道中,仅有三个频道是完全不覆盖的,利用这些频道来作为多蜂窝覆盖是最合适的。如果两个接入点的覆盖范围互相影响,同时他们使用了互相覆盖的频段,这会造成他们在信号传输时的互相干扰,从而降低了他们各自网络的性能和效率。ck信息以确认数据包的到达。另外关于ContentionWindow的作用,实际上在检测到medium的空闲时间大于DIFS时。仍然没有立即传送数据,而是等待一个随机的时间randombackofftime。每一个工作站都与其他工作站不同的随机时间,Slottime为最小单位,即每个随机时间都是Slottime的倍数!Backoff-time的计算方法可以查看802.11标准。



封包帧



其原理是将多个MSDU单元一起传输,MSDU即为上面讨论的每次medium空闲时传输的数据单元。这里将一次传输多个数据单元,连接包的大小不得大于4k。



PCF无竞争服务

无竞争周期一开始,接入点就会送出一个Beacon帧。该Beacon帧中的CFPMaxDuration(无竞争最大持续期间)字段,用来标明无竞争周期最长持续多久。所有收到此Beacon的工作站会将NAV设定为此时间值,并将DCF媒介访问排除在这段期间之外。

为了避免干扰,所有无竞争传输会另外以SIFS(短帧间间隔)与PIFS(PCF帧间间隔)加以隔离防护。这两者都比DCF帧间间隔短,因此在DCF周期内没有其他DCF工作站可以访问媒介。



接入点接管无线媒介后,会根据轮询列表(pollinglist)分别询问与之关联的工作站是否有数据待传。在无竞争周期内,除非关联以轮询帧提出请求,否则工作站不得传送数据。无竞争轮询帧通常简写为CF-Poll。一个CF-Poll帧代表授权传送一个帧。除非接入点送出多次轮询请求,否者每次只能传送一个帧。

轮询列表所列出的都是无竞争周期内受邀传送帧的特权工作站。工作站一旦与接入点关联,就会被列在轮询列表中。

802.11eWMM应用介绍

802.11e与802.11的不同

802.11e中采用了另外两种机制来提供Qos服务:EDCA(增强型分布式协调访问机制混合式协调控制信道访问机制1.EDCA机制相比于DCF机制主要有以下改进之处EDCA机制引入了业务优先级的概念,对于不同业务类型设定不同的优先级,高优先级的多媒体实时业务(如视频,语音)具有更多的机会接入信道,减小了这些业务的时间延迟,使得其在网络中播出更加流畅。具有更加灵活的帧间间隔—仲裁帧间间隔AIFS。不同的访问类型AC有着不同的AIFS值,AIFS值越小,优先级越高。小的AIFS值意味着视频、语音等多媒体实时业务能够比不太敏感的一般数据通信更快地接入无线网络,从而实现实时通信。不同的访问类型AC在等待信道空闲以后,进入退避时的竞争窗口CW的大小也不同,对于每个AC,有不同的CWmin[AC]及CWmax[AC]。优先级越高的AC,CWmin[AC]和CWmax[AC]值越小。引入了发送机会(TXOP)的概念。TXOP是QSTA有权在无线媒体上发送帧交互序列的时隙时间,QSTA应确保它的TXOP的持续时间不会超出规则指定的TXOP最大持续时间,如果要发送的数据太大而不能在一个TXOP限制内发送完,则这个站点就把该数据包分多次发送。可以使无线接入点(AP)能够根据无线站点(STA)的数据类型与丢包、时延及抖动的敏感度分配无线资源,提高了无线带宽的利用率和数据包的管理能力。2.HCCA机制相比于PCF机制主要有以下改进之处由于HCCA机制的工作也分为竞争期CP和无竞争期CFP,在竞争期CP阶段,使用EDCA机制竞争信道,因此它具有上述的EDCA优于DCF的全部优点。HCCA能够在竞争期CP阶段轮询站点,并能基于QSTA具体通信业务流的需要,对数据包进行排序,而不像PCF那样,只能在无竞争期CFP阶段轮询站点。混合协调器HC具有比其他站点(STA)都高的优先权。由于帧间隔PIFS比DIFS和AIFS都要短,因此HC无需与其他站点竞争,就可以获得信道的控制权。HCCA中的轮询TXOP具有QoS(+)CF-Poll帧描述的周期,在一个TXOP的时间间隔内,一个QSTA可通过发送多个序列交互帧实现HC的虚拟载波检测,从而提供改进的CFP保护。

EDCA与DCF对比示意图:



HCCA发包示意图

关于WMM模块的实现,在驱动代码的Wlan_wmm.c中。

WLAN驱动结构介绍

SDIO驱动

由于网络接口卡挂接在SDIO总线上,所以在此之前我们先看一下SDIO的驱动结构。其驱动在drivers/mmc目录下的结构为:

|--mmc

||--card

||--core

||--host

主要关注的目录是core目录。

这个目录完成sdio总线的注册操作,相应的ops操作,以及支持mmc的代码。详细的情况将在函数接口部分详细讨论。

详细接口及代码分析

SDIO注册流程分析

相应的函数流程图如下:





从sbi_register函数开始,调用了内核注册接口sdio_register_driver,这个注册函数为驱动程序指明了name、id、探测函数wlan_probe、移除函数wlan_remove。wlan_probe用来初始化设备以及做一些准备工作,wlan_remove是其逆过程。

sdio_register_driver的代码在内核中,查看可知它大致完成三件事情:

1、将wlan_sdio在内核中注册。内核中有关于各种设备的一个大链表,这里将wlan_sdio驱动挂入其中。

2、查看总线上所有wlan设备的配置空间,查找id_table与这里的wlan_sdio相同的设备并将此设备与驱动程序相关联上(此过程在内核中完成,并不由wlan_probe完成),再驱动与设备关联上后会调用wlan_probe函数完成对设备的一些准备工作。

3、进行设备与驱动程序的挂接工作。

添加设备是在函数sbi_register_dev中,这段过程在wlan_probe中完成,具体为wlan_probe->wlan_add_card->sbi_register_dev,主要是为中断函数sbi_interrupt注册,读io端口寄存器及设置块大小(用于传输缓存)。这段代码将在WLAN驱动流程分析中涉及。

在sbi_register_dev函数里还会完成以下工作:开启SDIO设备——对应函数为sdio_claim_host与sdio_enable_func;申明中断处理函数——对应函数为sdio_claim_irq;获得读写数据的地址映射口——对应函数为sbi_read_ioreg->sdio_readb;设置传输数据缓冲区大小——对应函数为sdio_set_block_size。

中断状态的查询代码在sbi_get_int_status函数中,sdio不支持双路的读写数据或者命令,因此在未检测到数据或命令的传输完成状态位置位之前不允许再次传送,通过wmm_process_fw_iface_tx_xfer_end->os_stop_queue->netif_stop_queue函数完成停止设备发送数据。netif_stop_queue函数为内核接口函数。

sdio_ireg&DN_LD_HOST_INT_STATUS——发送中断状态位、sdio_ireg&UP_LD_HOST_INT_STATUS接受中断状态位,接受数据时需要从寄存器中获得接受数据的长度并分配缓存空间。通过mv_get_rx_len函数及dev_alloc_skb函数完成。mv_sdio_card_to_host函数完成从sdio卡中读取数据的过程。区分读到的数据是命令、数据或者事件。

WILAN驱动流程分析

wlan_probe函数中要完成的工作(主要是wlan_add_card函数)

此函数在sdio的驱动中已经讲诉过是wlan设备的一些准备工作及注册过程,它主要完成以下几件事情:

1)、建立net_device结构,相应的调用是alloc_etherdev函数,此函数为alloc_netdev的上层调用。

2)、接下来是对net_device结构中一些成员的初始化,完成这此注册的函数是内核函数register_netdev。

关于其中详细的初始化过程,其大致的流程如下:

a、对net_device结构的进一步初始化,包括指定打开、传送、关闭等函数。

b、wlan_init_sw用来初始化软件适配器部分,也就是会初始化一个wlan_adapter结构体,同时初始化wlan中的命令响应定时器。

c、wlan_create_thread创建主线程,线程函数是wlan_service_main_thread,此函数为wlan驱动中的主要处理函数,负责对接收数据和发送数据完成中断的相应——对应的函数为sbi_get_int_status,此函数将会完成中断处理;对深度睡眠的设备的唤醒——对应的函数为sbi_exit_deep_sleep;对响应设备命令的回复——对应的函数为wlan_process_cmdresp;对设备事件的处理——对应的函数为wlan_process_event。

随后的os_sched_timeout用于超时唤醒(睡眠指定的时间后,由时间超时来唤醒),主要是确认线程安全的建立。

d、sbi_register_dev初始化SDIO设备。

e、SET_NETDEV_DEV实现sysfs中物理设备创建一个与网络类逻辑设备的链接,也就是说将物理设备与网络设备联系起来wlan_init_fw下载固件至网卡,主要用于命令、时间等的响应。

注意:这里我们区分一下两个函数wlan_tx_packet与wlan_process_tx。在wlan_service_main_thread中我们调用的是wmm_process_tx函数用来推送数据,而wmm_process_tx主要使用wlan_process_tx来推送数据,也就是说我们实际使用的是wmm_process_tx函数来推送数据。

那么另一个函数wlan_tx_packet呢?我们注意到这个初始化语句dev->hard_start_xmit=wlan_hard_start_xmit,这是对设备用来实际操作数据推送的函数的初始化,将缓冲区中的数据推送至网卡的这个过程将由此函数完成。这个函数实际调用的函数即是wlan_tx_packet函数,我们在看一下wlan_tx_packet,它会调用wmm_map_and_add_skb将数据放入wmm的缓冲区,然后唤醒主线程wlan_service_main_thread去处理,主线程会调用wmm_process_tx函数。

对于接收数据的函数来说,则是wlan_process_rx_packet,它是在检测到设备发出数据到达的中断时被调用的,也就是说在sbi_get_int_status函数中。





















15







Wlan_probe



sbi_register



wlan_init_module



Module_init



wlan_add_card



sbi_register_dev



Register_netdev







献花(0)
+1
(本文系海漩涡首藏)