新闻  |   论坛  |   博客  |   在线研讨会
Marvell8686 电源管理原理
xiajiashan | 2012-08-28 16:33:40    阅读:955   发布文章

作者:下家山(转载,请注明)

这里所说的电源管理主要是说:怎样降低功耗,也即省电!

怎样最有效的省电呢?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

1.jpg

LocalListenInterval

2.jpg

第一个参数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按照如下算法执行:

3.jpg

 

。当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的设置。下面就是其中的一种:

111.jpg

 

这里,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的方法

 

4.jpg

 

*GPIO4:(marvell不同的芯片也许不一样,marvell8686和wm664都是这个脚)。当GPIO4从高到低,然后保持高的状态(当然低位要保持一段时间,具体时间我没有查证到)

*这个命令的设置必须在发送deepsleep命令之前,不然就唤不醒了。

【当然,如果你不设置其唤醒方法,也不用担心进入了deepsleep后不能醒来,因为marvell默认方式下的唤醒方法为command interrupt(SPI和SDIO接口方式)。】

转载:请注明,作者,下家山 请尊重原创!

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
02年接触ARM和ucos,开发过有线和无线图像报警器,IPCamera,人脸识别系统,OCR识别系统,指纹识别系统,05年开始从事Linux及Rtems下WiFi,camera,Ethernet等驱动开发工作,专做嵌入式linux培训,致力于把我十年来的研发经验传授给每一个学员,招人的可以找我,ximenpiaoxue4016@sina.com
推荐文章
最近访客