通过 iwpriv 指令修改工厂参数

http://home.elecfans.com/forum.php?mod=viewthread&tid=527717


最标本兼治的方法是,修改FLASH 的factory 分区(art 分区)

步骤一:使用 iwpriv 命令, 在7688开发板输入

root@OpenWrt:/# iwpriv

eth0.1    no private ioctls.
lo        no private ioctls.
ra0       Available private ioctls :
          set              (8BE2) : set 1536 char  & get   0      
          show             (8BF1) : set 1024 char  & get   0      
          get_site_survey  (8BED) : set   0       & get 1024 char 
          set_wsc_oob      (8BF9) : set 1024 char  & get 1024 char 
          get_mac_table    (8BEF) : set 1024 char  & get 1024 char 
          e2p              (8BE7) : set 1024 char  & get 1024 char 
          bbp              (8BE3) : set 1024 char  & get 1024 char 
          mac              (8BE5) : set 1024 char  & get 1024 char 
          rf               (8BF3) : set 1024 char  & get 1024 char 
          get_ba_table     (8BF6) : set 1024 char  & get 1024 char 
          stat             (8BE9) : set 1024 char  & get 1024 char 
apcli1    Available private ioctls :
          set              (8BE2) : set 1536 char  & get   0      
          show             (8BF1) : set 1024 char  & get   0      
          get_site_survey  (8BED) : set   0       & get 1024 char 
          set_wsc_oob      (8BF9) : set 1024 char  & get 1024 char 
          get_mac_table    (8BEF) : set 1024 char  & get 1024 char 
          e2p              (8BE7) : set 1024 char  & get 1024 char 
          bbp              (8BE3) : set 1024 char  & get 1024 char 
          mac              (8BE5) : set 1024 char  & get 1024 char 
          rf               (8BF3) : set 1024 char  & get 1024 char 
          get_ba_table     (8BF6) : set 1024 char  & get 1024 char 
          stat             (8BE9) : set 1024 char  & get 1024 char 
eth0      no private ioctls.
apcli0    Available private ioctls :
          set              (8BE2) : set 1536 char  & get   0      
          show             (8BF1) : set 1024 char  & get   0      
          get_site_survey  (8BED) : set   0       & get 1024 char 
          set_wsc_oob      (8BF9) : set 1024 char  & get 1024 char 
          get_mac_table    (8BEF) : set 1024 char  & get 1024 char 
          e2p              (8BE7) : set 1024 char  & get 1024 char 
          bbp              (8BE3) : set 1024 char  & get 1024 char 
          mac              (8BE5) : set 1024 char  & get 1024 char 
          rf               (8BF3) : set 1024 char  & get 1024 char 
          get_ba_table     (8BF6) : set 1024 char  & get 1024 char 
          stat             (8BE9) : set 1024 char  & get 1024 char 
br-lan    no private ioctls.
eth0.2    no private ioctls.

步骤二: 再接着输入
root@OpenWrt:/# iwpriv ra0 e2p
  1. ra0       e2p:
  2. [0x0000]:7628  [0x0002]:0201  [0x0004]:5164  [0x0006]:807E  
  3. [0x0008]:FA35  [0x000A]:0000  [0x000C]:0000  [0x000E]:0000  
  4. [0x0010]:FFFF  [0x0012]:FFFF  [0x0014]:FFFF  [0x0016]:FFFF  
  5. [0x0018]:FFFF  [0x001A]:FFFF  [0x001C]:FFFF  [0x001E]:FFFF  
  6. [0x0020]:0000  [0x0022]:0000  [0x0024]:0030  [0x0026]:0000  
  7. [0x0028]:0C00  [0x002A]:E143  [0x002C]:2976  [0x002E]:0C00  
  8. [0x0030]:E143  [0x0032]:2A76  [0x0034]:3411  [0x0036]:2000  
  9. [0x0038]:FFFF  [0x003A]:0100  [0x003C]:0000  [0x003E]:0000  
  10. [0x0040]:0000  [0x0042]:0022  [0x0044]:0000  [0x0046]:0000
复制代码



步骤三: 结合   Ralink_QA_Tool_Introduction__20081201.pdf   对寄存器做修改,参考附件
 Ralink_QA_Tool_Introduction__20081201.pdf (1018.29 KB, 下载次数: 2) 


从手册可以看出,ra0 的 mac 是读取 0x0004,0x0006 和 0x0008 三个寄存器。
若果想把 Mac 地址修改为 64:51:7e:80:88:99
输入:
root@OpenWrt:/# iwpriv ra0 e2p 08=9988   (高字节09保存99,低字节08保存88)


步骤四: 删除 wireless 文件,重启网络或者重启 wrtnode2r 板子

root@OpenWrt :/#  rm /etc/config/wireless
root@OpenWrt :/# etc/init.d/network restart  重启网络
要转载,请说明出处,谢谢!
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`iwpriv`命令的源码主要位于Linux内核源代码树中的`net/wireless/wext-core.c`文件中,以下是该文件中`ioctl_standard_iwpriv`函数的源码解析: ```c static int ioctl_standard_iwpriv(struct net_device *dev, struct iwreq *iwr, u32 cmd) { /* 通过命令码cmd解析出设备驱动程序中相应的命令处理函数 */ struct iw_priv_args *priv; struct iw_handler_def *iwe; int i, count; struct iw_priv_args user_priv; void __user *argp = iwr->u.name; int (*handler)(struct net_device *, struct iw_request_info *, union iwreq_data *, struct iw_priv_args *); union iwreq_data wrqu; int ret = 0; /* 遍历设备驱动程序中支持的所有IWPRIV命令 */ for (i = 0; i < dev->ieee80211_ptr->priv_args_count; i++) { priv = &dev->ieee80211_ptr->priv_args[i]; if ((!priv->name) || (!priv->set)) { continue; } if (strcmp(priv->name, iwr->u.name) == 0) { /* 找到要执行的IWPRIV命令 */ iwe = priv->handler; count = iwe->num_standard; /* 该命令支持的标准命令个数 */ if (iwe->flags & IW_HANDLER_SPECIAL) { /* 特殊处理的IWPRIV命令 */ handler = iwe->standard[count].handler; if (!handler) return -EOPNOTSUPP; ret = handler(dev, NULL, &wrqu, priv); } else { /* 标准IWPRIV命令 */ handler = iwe->standard[IW_PRIV_CMD_GET].handler; if (!handler) return -EOPNOTSUPP; /* 解析参数 */ if (iwe->standard[IW_PRIV_CMD_SET].handler) { if (copy_from_user(&user_priv, argp, sizeof(user_priv))) return -EFAULT; wrqu.data.pointer = user_priv.pointer; wrqu.data.length = user_priv.length; wrqu.data.flags = user_priv.flags; } /* 调用设备驱动程序中的命令处理函数 */ ret = handler(dev, NULL, &wrqu, priv); /* 将处理结果返回给用户空间 */ if (iwe->standard[IW_PRIV_CMD_GET].handler) { if (copy_to_user(argp, &user_priv, sizeof(user_priv))) return -EFAULT; } } break; } } if (i == dev->ieee80211_ptr->priv_args_count) /* 没有找到要执行的IWPRIV命令 */ ret = -EOPNOTSUPP; return ret; } ``` `ioctl_standard_iwpriv`函数主要实现了`iwpriv`命令的功能。它通过解析`iwr->u.name`中的命令参数,找到对应的设备驱动程序中的命令处理函数,并通过调用该函数完成相应的操作。该函数的主要步骤包括: 1. 遍历设备驱动程序中支持的所有IWPRIV命令,找到要执行的IWPRIV命令。 2. 解析命令参数,根据命令处理函数的要求设置对应的参数值。 3. 调用设备驱动程序中的命令处理函数,完成相应的操作。 4. 将处理结果返回给用户空间。 在该函数中,命令处理函数主要分为两种类型:标准IWPRIV命令和特殊处理的IWPRIV命令。对于标准IWPRIV命令,用户空间可以通过`ioctl`系统调用的`arg`参数向内核空间传递一些参数,内核空间则通过解析这些参数来执行相应的操作;对于特殊处理的IWPRIV命令,用户空间直接调用该命令即可,不需要传递任何参数。 总的来说,`ioctl_standard_iwpriv`函数的实现比较复杂,需要涉及到内核空间和用户空间之间的数据传输、命令参数的解析和处理等方面的问题。如果您想要深入了解该函数的实现细节,可以仔细阅读该函数的源码,并结合相关的内核文档进行学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值