您的位置:首页 > 其它

Ralink SDK NVRAM和WIFI配置的关系

2016-02-24 14:52 417 查看
Ralink SDK NVRAM和WIFI配置的关系
380939960@qq.com

简单来说,Ralink SDK中的NVRAM机制提供了以下功能:

* 将WIFI配置持久化在flash中,保证用户设置的SSID,KEY等WIFI参数掉电后仍然有效;

* 第三方程序通过“nvram_set ”命令设置新的WIFI参数,并将它保存到FLASH中;设置完WIFI参数后,还需要使用其他命令才能让WIFI driver使用到新的WIFI参数。

* 第三方程序通过“nvram_get ”命令获得当前“nvram”中的WIFI参数。注意:这个参数可能并不一定是WIFI driver当前使用的参数。

* 第三方程序通过“ralink_init gen ***”命令,根据NVRAM机制中WIFI参数生成WIFI driver使用的配置文件(例如” /etc/Wireless/RT2860/RT2860.dat”); 生成新的WIFI配置参数后,通常还需要重新打开WIFI设备才能让新配置生效(例如:ifconfig ra0 down; ifconfig ra0 up);

* 通过“ralink_init renew 2860 [<file>]”命令恢复出厂设置。

如果 是C代码的话,就使用lib_nvram中提供的函数来操作;

个人觉得不太建议将 lib_nvram提供的函数和"iwpriv"这个命令提供的功能混合使用,混合使用时,操作流程互相交叉,很容易出一些奇奇怪怪的问题。

修改WIFI参数

可以通过类似如下的命令设置当前NVRAM中的某个WIFI参数;需要指出的是nvram_set命令实际上是ralink_init命令的符号连接。

# nvram_set HT_BW

1

#

当然如果是C程序的话,最好还是使用SDK中libnvram提供的函数来实现,例如:

if(!strlen(ntpServer)){

// user choose to make NTP server disable

nvram_bufset(RT2860_NVRAM, "NTPServerIP", "");

nvram_bufset(RT2860_NVRAM, "NTPSync", "");

}else{

if(check_semicolon(ntpServer))

goto leave;

if(!strlen(ntpSync))

goto leave;

if(strtol(ntpSync, NULL, 10) > 300)

goto leave;

nvram_bufset(RT2860_NVRAM, "NTPServerIP", ntpServer);

nvram_bufset(RT2860_NVRAM, "NTPSync", ntpSync);

}

关于libnvram的使用可以参考SDK中goahead的实现。

注:修改完所有的WIFI参数后,必须通过“ralink_init gen ***”命令,将NVRAM机制中WIFI参数生成WIFI driver使用的配置文件(例如” /etc/Wireless/RT2860/RT2860.dat”); 同时通常还需要重新打开WIFI设备才能让新配置生效(例如:ifconfigra0 down; ifconfig ra0 up);

获得某个WIFI参数

可以通过类似如下的命令获得当前NVRAM中的某个WIFI参数;需要指出的是nvram_get命令实际上是ralink_init命令的符号连接。

# nvram_get HT_BW

1

#

当然如果是C程序的话,最好还是使用SDK中libnvram提供的函数来实现,例如:

char *dmz_enable = (char *)nvram_bufget(RT2860_NVRAM, "DMZEnable");

if(!dmz_enable){

printf("Warning: can't find \"DMZEnable\" in flash\n");

return;

}

关于libnvram的使用可以参考SDK中goahead的实现。

显示NVRAM中的所有WIFI参数

如果想要显示当前“NVRAM”中所有的WIFI参数,可以使用“ralink_init rt2860_nvram_show”或者” ralink_init show2860”;需要特别说明的是,由于设置完NVRAM中的WIFI参数后,还需要通过其他步骤来让它生效,因此,如果操作不当的话,这里显示的一些参数可能和WIFI dirver真正使用的参数是不一致的。

另外:在手册中提到,如果是无线网卡的话,使用的命令为”ralink_init show inic”(INIC:intelligent network interface card )

# ralink_init rt2860_nvram_show

crc = 65081317

WebInit=1

Platform=RT5350

dhcpEnabled=0

dhcpStart=192.168.0.100

dhcpEnd=192.168.0.200

dhcpMask=255.255.255.0

dhcpPriDns=192.168.0.1

dhcpSecDns=

dhcpGateway=192.168.0.1

dhcpLease=86400

dnsPEnabled=0

stpEnabled=0

lltdEnabled=0

igmpEnabled=0

natEnabled=0

IPPortFilterEnable=0

IPPortFilterRules=

PortForwardEnable=0

PortForwardRules=

MacFilterEnable=0

MacFilterRules=

DefaultFirewallPolicy=1

DMZEnable=0

DMZIPAddress=

TZ=0

NTPEnable=1

NTPServerIP=0.pool.ntp.org

NTPSync=2

DDNSProvider=

DDNS=

DDNSAccount=

DDNSPassword=

WatchDogEnable=1

CountryRegion=0

CountryRegionABand=7

CountryCode=

BssidNum=1

WirelessMode=9

TxRate=0

Channel=0

BasicRate=15

BeaconPeriod=100

DtimPeriod=1

TxPower=100

DisableOLBC=0

BGProtection=0

TxAntenna=

RxAntenna=

TxPreamble=1

RTSThreshold=2347

FragThreshold=2346

TxBurst=1

PktAggregate=1

TurboRate=0

WmmCapable=1

#

显示flash中的uboot参数

# ralink_init uboot_nvram_show

crc = 4958103e

bootcmd=tftp

bootdelay=5

baudrate=57600

ethaddr="00:AA:BB:CC:DD:10"

Image1Try=4

stdin=serial

stdout=serial

stderr=serial

bootfile=test_7620uImage

autostart=no

filesize=3027ab

fileaddr=80100000

ipaddr=192.168.80.35

serverip=192.168.80.105

BootImage=0

Image1Stable=1

#

恢复出厂设置的WIFI参数

可以通过“ralink_init renew 2860 [<file>]”命令将NVRAM参数恢复到出厂设置;

在编译内核时,SDK通常将默认配置参数保存到“/etc_ro/Wireless/RT2860AP”目录中,因此我们可以修改SDK中“source/vendors/Ralink/MT7620/RT2860AP.dat”这个文件的参数为我们想要的默认参数;编译完内核后,在目标板上,这个文件位于“/etc_ro/Wireless/RT2860AP/RT2860AP.dat”;因此我们可以通过命令“ralink_initrenew 2860 /etc_ro/Wireless/RT2860AP/RT2860AP.dat”将NVRAM中的WIFI参数恢复到出厂设置。

nvram_daemon

在Ralink SDK中nvram_daemon程序是处理“WPS”以及“reset to default”的守护进程;当然你也可以将WPS修改为reboot系统。

nvram_daemon守护进程首先注册对应的gpio,当用户通过按键触发该gpio时,内核根据按压该按键时间长短发送SIGUSER1或者SIGUSER2信号给nvram_daemon程序;nvram_daemon程序收到该程序后进行相应的处理;

Itreceives interruptions from GPIO pin 0. If SIGUSR1 is received (userone-clicked GPIO pin 0 button), nvram_daemon tells the GoAhead web server tostart the WPS PBC procedure by sending it SIGUSR1. If SIGUSR2 is received (userpressed GPIO pin 0 button for
several seconds), nvram_daemon will restore thesystem configuration to the default values.

/*

* gpio interrupt handler -

* SIGUSR1 - notify goAhead to start WPS (by sending SIGUSR1)

* SIGUSR2 - restore default value

*/

static void nvramIrqHandler(int signum)

{

static int rcvUsr1Cnt = 0;

if (signum == SIGUSR1) {

#ifdef CONFIG_RALINK_RT2880

// killpid("/var/run/goahead.pid", SIGUSR1)

printf("nvramIrqHandler CONFIG_RALINK_RT2880 reboot..\n");

//system("reboot");

#else

printf("nvramIrqHandler non CONFIG_RALINK_RT2880 reboot..\n");

rcvUsr1Cnt++;

if (rcvUsr1Cnt > 1)

system("reboot");

//RT2883, RT3052, RT3883 use a different gpio number for WPS,

//which will be registered in goahead instead

#endif

} else if (signum == SIGUSR2) {

killpid("/tmp/agent.pid", SIGUSR2);

printf("sleep 10s then load default and reboot..\n");

sleep(10);

loadDefault(2860);

#if defined (CONFIG_RTDEV) || \

defined (CONFIG_RTDEV_PLC)

loadDefault(2880);

#elif defined (CONFIG_RT2561_AP) || defined (CONFIG_RT2561_AP_MODULE)

loadDefault(2561);

#endif

system("reboot");

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: