热度 26
2012-4-4 12:15
2806 次阅读|
1 个评论
作者:下家山(转载,请注明) 这里所说的电源管理主要是说:怎样降低功耗,也即省电! 怎样最有效的省电呢?Marvell把其分成了两部分来处理: IDLE状态(station没有链上AP),链接状态(station链上AP)。 (约定STA:表示station即wifi-card,AP表示access point,如无线路由器,PS:power save mode) 一:链接状态下省电 我们来见识一下Marvell8686到底能省多少电?下面是我的实验结果。 注:在连接上AP前提下。 命令 动作 电流 无 无 150mA Power on Rx ---ping 77mA(最大) Power on --(不动作) 14mA(最大) Power off Rx-----ping 150mA Power off Tx----iperf 160mA/162mA Power off Rx----iperf 152mA Power on Tx----iperf 142.2mA Power on Rx----iperf 152.1~153mA 1:POWER SAVE 命令 先说链接状态:在链接状态我们通过命令 Iwconfig eth1 power on 进入PS mode 而通过 Iwconfig eth1 power off 退出PS mode (注意:此命令仅在链接状态才有效,即如果STA没有连上AP则此命令无效) 这两个命令都是通过命令CMD_802_11_PS_MODE 0x0021来实现的,只不过在0x0021命令中还含有两个子命令,他们分别是: PS_CMD_ENTER 0x0030 ,Iwconfig eth1 power on时其实就是执行的这个子命令; PS_CMD_EXIT 0x0031,Iwconfig eth1 power off其实执行的就是这个子命令。 2:省电原理 我们执行Iwconfig eth1 power on命令就进入了PS mode,那么802.11是怎么来具体实现的呢? 当host驱动向firmware发送了此命令后,host不能送任何数据和命令到firmware了。因为,firmware一旦进入了PS mode ,许多硬件块就被关掉了(这些硬件块包括:hardware MAC(Media Access Controll),baseband processor(基带处理器),RF chip(射频芯片))。 这样就可以大大节省功耗。 3.进入PS mode后还可以传数据吗? 通过实验发现,在执行Iwconfig eth1 power on命令后,STA 与AP的链接并没有丢失。下面是我连上AP,执行Iwconfig eth1 power on,执行Iwconfig eth1 power off三个阶段的ping 结果。 /cybertan # ./auto.sh insmod sdio.ko insmod sd8686.ko helper_name=./firmware/helper_sd.bin fw_name=./firmware/sd8686.bin ./iwconfig eth1 essid sip ifconfig eth1 192.168.200.102 netmask 255.255.255.0 ./iwconfig eth1 bit 48M ping 192.168.200.1 PING 192.168.200.1 (192.168.200.1): 56 data bytes 64 bytes from 192.168.200.1: seq=0 ttl=64 time=7.176 ms 64 bytes from 192.168.200.1: seq=1 ttl=64 time=2.496 ms 64 bytes from 192.168.200.1: seq=2 ttl=64 time=2.507 ms --- 192.168.200.1 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 2.496/4.059/7.176 ms /cybertan # ./iwconfig eth1 power on /cybertan # ping 192.168.200.1 PING 192.168.200.1 (192.168.200.1): 56 data bytes 64 bytes from 192.168.200.1: seq=0 ttl=64 time=705.401 ms 64 bytes from 192.168.200.1: seq=1 ttl=64 time=12.633 ms 64 bytes from 192.168.200.1: seq=2 ttl=64 time=28.207 ms 64 bytes from 192.168.200.1: seq=3 ttl=64 time=47.442 ms 64 bytes from 192.168.200.1: seq=4 ttl=64 time=66.524 ms 64 bytes from 192.168.200.1: seq=5 ttl=64 time=93.352 ms 64 bytes from 192.168.200.1: seq=6 ttl=64 time=110.181 ms 64 bytes from 192.168.200.1: seq=7 ttl=64 time=135.511 ms --- 192.168.200.1 ping statistics --- 8 packets transmitted, 8 packets received, 0% packet loss round-trip min/avg/max = 12.633/149.906/705.401 ms /cybertan # ./iwconfig eth1 power off /cybertan # ping 192.168.200.1 PING 192.168.200.1 (192.168.200.1): 56 data bytes 64 bytes from 192.168.200.1: seq=0 ttl=64 time=2.397 ms 64 bytes from 192.168.200.1: seq=1 ttl=64 time=2.414 ms 64 bytes from 192.168.200.1: seq=2 ttl=64 time=2.377 ms --- 192.168.200.1 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 2.377/2.396/2.414 ms 通过这个实验我发现,在执行iwconfig eth1 power on 后,可以传数据和命令。 这不跟“当host驱动向firmware发送了此命令后,host不能送任何数据和命令到firmware了”这句话矛盾吗? 4:如何保持链接 STA进入PS mode后还是可以传输数据的,其与AP的链接并没有断开。那么,STA是怎样与AP保持这种链接的呢? 原来,STA进入PS mode 是间隙的,也就是STA隔一段时间就会“自动醒”来(这种醒来时自动的)。他醒来干什么呢? 他会去收AP是否给他发了对他有用的数据。如果有有用的数据就会进行处理,处理完后他又会进入PS mode 。 STA就是通过这种“间隙“来保持与AP的链接的。 5.间隙时间多长? 那么这个间隙是多长时间呢? 在命令CMD_802_11_PS_MODE (0x0021)中,有两个参数 NumDtims LocalListenInterval 第一个参数NumDtims表示firmware睡眠的DTIM intervals数量,其范围为 和0xFFFE。设置到0表示保持当前值不变。设置到0xFFFE,此项不取作用,唤醒间隙由listern interval控制。(设置到1表示:睡眠时间不超过1个DTIM intervals;设置到大于1表示:则在每个DTIM intervals的结束自动醒来,个人理解 ) 第二个参数,LocalListenInterval指示Listen interval(侦听间隙,此值在连上AP时已设置CMD_802_11_ASSOCIATE 0x0050)。其值范围 。如果设置为0,表示保持连接时设置的值不变,其他值将覆盖原先的值(在链接时设置的值)。如果第一个参数”NumDtims”大于1(不等于0xFFFE),或者Listen Interval的值大于DTIM period(这里DTIM period与DTIM interval同义,个人理解),Listern Interval不取作用。 STA的睡眠时间可以等价于Listern Interval时间。Listen Interval按照如下算法执行: 。当Listen Interval等于DTIM interval或DTIM interval的倍数 --STA 在每个DTIM到来时唤醒firmware。 。当Listen Interval比一个DTIM interval少(如,DTIM=10, Listen Interval=3) --DTIM count 编号如:0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0 --STA在DTIM count=0,3,6,9时唤醒。 。当Listen Interval大于一个DTIM interval --STA在DTIM count=0时唤醒(Listen Interval具体值不取作用) 。当Listen Interval等于Listern Interval的倍数时 --Listen Interval不取作用,STA在特定的DTIM interval时唤醒firmware。 6.DTIM interval是多少? DTIM interval的数值来自AP,因为STA是间隙侦听AP不过来的beacon,而AP只是在间隔多少个beacon才发送DTIM,这个间隔就是DTIM interval。这个值要看AP的设置。下面就是其中的一种: 这里,DTIM interval为133,即AP每隔133个beacon发送一个DTIM。这里我们还可以看到,beacon interval为100,即AP每隔100ms(毫秒)发送一个beacon。 二.IDLE状态下的省电 IDLE(STA没有连上AP)状态下的省电模式。 (有时间做实验看能省多少电) 此状态下省电,firmware将进入deepsleep mode。相关命令 Iwpriv eth1 deepsleep 1 使能deepsleep mode(此命令没有回应) Iwpriv eth1 deepsleep 0 禁能deepsleep mode Iwpriv eth1 deepsleep 2 显示当前deepsleep设置 进入deepsleep模式后,host 将不能访问设备(不能与firmware通信),直到我们的驱动去唤醒他(firmware)。 那么,我们怎么去唤醒他呢? Marvell有专门的命令来设置唤醒firmware的方法 *GPIO4:(marvell不同的芯片也许不一样,marvell8686和wm664都是这个脚)。当GPIO4从高到低,然后保持高的状态(当然低位要保持一段时间,具体时间我没有查证到) *这个命令的设置必须在发送deepsleep命令之前,不然就唤不醒了。 【当然,如果你不设置其唤醒方法,也不用担心进入了deepsleep后不能醒来,因为marvell默认方式下的唤醒方法为command interrupt(SPI和SDIO接口方式)。】 转载:请注明,作者,下家山 请尊重原创!