"); //-->
作者:下家山(转载,请注明)
这里所说的电源管理主要是说:怎样降低功耗,也即省电!
怎样最有效的省电呢?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数量,其范围为[0,5]和0xFFFE。设置到0表示保持当前值不变。设置到0xFFFE,此项不取作用,唤醒间隙由listern interval控制。(设置到1表示:睡眠时间不超过1个DTIM intervals;设置到大于1表示:则在每个DTIM intervals的结束自动醒来,个人理解[希望有人与我讨论])
第二个参数,LocalListenInterval指示Listen interval(侦听间隙,此值在连上AP时已设置CMD_802_11_ASSOCIATE 0x0050)。其值范围[0,20]。如果设置为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接口方式)。】
转载:请注明,作者,下家山 请尊重原创!
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
eleaction01 阅读:4522