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"这个命令提供的功能混合使用,混合使用时,操作流程互相交叉,很容易出一些奇奇怪怪的问题。
当然如果是C程序的话,最好还是使用SDK中libnvram提供的函数来实现,例如:
关于libnvram的使用可以参考SDK中goahead的实现。
注:修改完所有的WIFI参数后,必须通过“ralink_init gen ***”命令,将NVRAM机制中WIFI参数生成WIFI driver使用的配置文件(例如” /etc/Wireless/RT2860/RT2860.dat”); 同时通常还需要重新打开WIFI设备才能让新配置生效(例如:ifconfigra0 down; ifconfig ra0 up);
当然如果是C程序的话,最好还是使用SDK中libnvram提供的函数来实现,例如:
关于libnvram的使用可以参考SDK中goahead的实现。
另外:在手册中提到,如果是无线网卡的话,使用的命令为”ralink_init show inic”(INIC:intelligent network interface card )
在编译内核时,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守护进程首先注册对应的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.
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 # |
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); } |
注:修改完所有的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 # |
char *dmz_enable = (char *)nvram_bufget(RT2860_NVRAM, "DMZEnable"); if(!dmz_enable){ printf("Warning: can't find \"DMZEnable\" in flash\n"); return; } |
显示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"); } } |
相关文章推荐
- Yii 1.1 过滤器原理学习
- 我们团队的协作流程
- 利用gdb调试coredump
- html+css+JavaScript贪吃蛇
- 在Mac OS X中使用jenv管理多个Java版本
- 一维小波降噪的综合应用实例
- 使用librtmp进行H264与AAC直播
- Struts2 动态结果集
- python 双向链表
- React Native-13.React Native 常用API及实践 AppRegistry
- 数据结构与算法是程序的灵魂
- 我们团队中使用到的管理工具
- UML精粹2 - 开发过程
- Model View Controller(MVC) in PHP
- openstack overcommit
- ios逆向教程使用的工具
- 【hud2222】Keywords Search AC自动机
- Servlet开发整理
- Volley
- 网络学习笔记1