MT7688 wifi 調試(二) 如何修改ra0 mac地址

本系列導航:
MT7688 wifi 調試

1. 查看ra0 mac地址

# ifconfig -a ra0
ra0       Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:51894 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1585 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:13104021 (12.4 MiB)  TX bytes:83336 (81.3 KiB)
          Interrupt:6 

怎麼是 00:00:00:00:00:00 ?有什麼方法修改?

2. 一般修改 mac 地址的方法

通過 ifconfig 幫助信息可知 ,ifconfig ra0 hw ether xx 可以修改mac地址

ifconfig --help
BusyBox v1.23.2 (2019-04-01 17:15:57 CST) multi-call binary.

Usage: ifconfig [-a] interface [address]

Configure a network interface

        [add ADDRESS[/PREFIXLEN]]
        [del ADDRESS[/PREFIXLEN]]
        [[-]broadcast [ADDRESS]] [[-]pointopoint [ADDRESS]]
        [netmask ADDRESS] [dstaddr ADDRESS]
        [hw ether ADDRESS] [metric NN] [mtu NN]
        [[-]trailers] [[-]arp] [[-]allmulti]
        [multicast] [[-]promisc] [txqueuelen NN] [[-]dynamic]
        [up|down] ...

使用 ifconfig ra0 hw ether 12:34:56:78:99:10
實測結果:

# ifconfig ra0 hw ether 12:34:56:78:99:10 
ifconfig: SIOCSIFHWADDR: Operation not supported

說明這個方法對對mt7688 並不管用。
那怎麼辦呢?難道就沒有辦法改mac 地址了?要知道如果兩個mac地址相同的設備在組網時是會有衝突的!
爲了解決這個問題,有兩個思路,一是網上搜索更多的資料,二是看能不能找到驅動源碼(這個是閉源驅動)。

3. 網上找的方法

3.1 一點一滴分析LinkIt Smart 7688 問題彙總 - huang的專欄 - CSDN博客

https://blog.csdn.net/hnhkj/article/details/50930483
摘要:

2.1.2 dd命令:/bin/dd
讀取mtd2內的數據內容,mac地址
$ dd bs=1 skip=3 count=6 if=/dev/mtd2 2>/dev/null | hexdump
參考文檔:linkit-smart-7688-feed\mtk-linkit\files\etc\uci-defaults\51_linkit_config - Line30:
MAC=$(dd bs=1 skip=7 count=3 if=/dev/mtd2 2>/dev/null | hexdump -v -n 3 -e ‘3/1 “%02X”’

2.1.4 備份MTD2/factory信息
$ dd if=/dev/mtd2 of=/tmp/factory.bin

2.1.5 寫factory.bin到mtd2
$ mtd -r write /tmp/factory.bin factory
注意:如果命令返回不能寫入MTD2,可能是由於你的系統設定了禁止寫該區域的權限。我們可以通過修改target/linux/ramips/dts/LINKIT7688.dts,註銷禁止代碼(read-only)。這樣就可以將數據寫入到MTD2區域了。

有效信息:

  • 1./dev/mtd2 用於存放 factory 信息,裏面包含mac地址
  • 2.mtd -r write /tmp/factory.bin factory 可以改寫 /dev/mtd2 裏的內容
  • 3.需要修改 target/linux/ramips/dts/LINKIT7688.dts 使/dev/mtd2 可寫

驗證:

1.查看 /dev/mtd2 數據
# dd if=/dev/mtd2 of=/tmp/f.bin
# hexdump f.bin  
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
*
0010000

居然是全FF !!。也難怪,因爲之前從沒寫過該分區。

2.如何確定 ra0 mac地址存儲的位置?

由於只知道ra0 mac地址 從mtd2裏讀取,而不知道具體是哪個位置,爲了確定ra0 mac 在mtd2 中的位置
我使用下面的方法生成了一個f.bin文件,

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
        int fd = open("./f.bin",O_RDWR|O_CREAT);

        int i = 0;
        int j = 0;

        for(i=0;i< 0x100;i++)
        {
                for(j=0;j< 0x100;j+=2)
                {
                        unsigned char data1 = i;//i;
                        unsigned char data2 = j;//j;

                        write(fd,&data1,1);
                        write(fd,&data2,1);
                }
        }

        close(fd);

        return 0;
}

生成的 bin 文件內容如下:
f.bin
假如 ra0 mac 爲00:92:00:94:00:96 則說明,位置是mtd2 的 0x92 。

3.驗證

rm /lib/firmware/mt7628.eeprom
mtd -r write /tmp/f.bin factory
重啓後 查看mac

# ifconfig -a ra0
ra0       Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:51894 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1585 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:13104021 (12.4 MiB)  TX bytes:83336 (81.3 KiB)
          Interrupt:6 

!!! 仍然是 00:00:00:00:00:00
很遺憾!此方法似乎不起作用?

繼續找方法。。。

3.2 通過 iwpriv 指令修改工廠參數 - mcusun2000的博客 - CSDN博客

https://blog.csdn.net/mcusun2000/article/details/50953582
摘要:

iwpriv ra0 e2p

從手冊可以看出,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 重啓網絡

有效信息:

  • 1.iwpriv ra0 e2p 可查看eeprom 數據
  • 2.ra0 的 mac 是讀取 0x0004,0x0006 和 0x0008
  • 3.iwpriv ra0 e2p 08=9988 可修改mac

驗證:

1.iwpriv ra0 e2p
~# iwpriv ra0 e2p
ra0       e2p:
[0x0000]:7628  [0x0002]:0001  [0x0004]:0000  [0x0006]:0000  
[0x0008]:0000  [0x000A]:0000  [0x000C]:0000  [0x000E]:0000  
[0x0010]:FFFF  [0x0012]:FFFF  [0x0014]:FFFF  [0x0016]:FFFF  
[0x0018]:FFFF  [0x001A]:FFFF  [0x001C]:FFFF  [0x001E]:FFFF  
[0x0020]:0000  [0x0022]:0000  [0x0024]:0020  [0x0026]:0000  
[0x0028]:0000  [0x002A]:0000  [0x002C]:0000  [0x002E]:0000  
[0x0030]:0000  [0x0032]:0000  [0x0034]:3422  [0x0036]:2000  
[0x0038]:FFFF  [0x003A]:0100  [0x003C]:0000  [0x003E]:0000 
...

0x0004,0x0006 和 0x0008 確實是全00 ,怪不得ra0 mac是全00了。

2.修改e2p 0x0004,0x0006 和 0x0008

iwpriv ra0 e2p 4=1234
iwpriv ra0 e2p 6=5678
iwpriv ra0 e2p 8=9010

~# iwpriv ra0 e2p 4=1234
ra0       e2p:
[0x04]:1234  
~# iwpriv ra0 e2p 6=5678
ra0       e2p:
iwpr[0x06]:5678  
~# iwpriv ra0 e2p 8=9010
ra0       e2p:
[0x08]:9010  
~# iwpriv ra0 e2p 4
ra0       e2p:
[0x0004]:0x1234  
~# iwpriv ra0 e2p 6
ra0       e2p:
[0x0006]:0x5678  
~# iwpriv ra0 e2p 9
ra0       e2p:
[0x0009]:0x0090  
~# 
3.重啓網絡

etc/init.d/network restart

結果:

~# ifconfig -a ra0
ra0       Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:564285 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16157 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:138761440 (132.3 MiB)  TX bytes:865783 (845.4 KiB)
          Interrupt:6 

!!! 結果還是 00:00:00:00:00:00
很遺憾!此方法不起作用!
繼續找方法。。。

3.3 MAC address nulled · Issue #41 · Nossiac/mtk-openwrt-feeds

https://github.com/Nossiac/mtk-openwrt-feeds/issues/41

the correct mt7628 rf parameter should be like this:
ziqiang@ziqiang:~/Router/mpkg/drivers/tm7628/files/lib/firmware$ hexdump mt7628.eeprom.bin
0000000 7628 0200 0c00 e143 2876 0000 0000 0000
0000010 ffff ffff ffff ffff ffff ffff ffff ffff
0000020 0000 0000 0020 0000 0c00 e143 2976 0c00
0000030 e143 2a76 3422 2000 ffff 0100 0000 0000
0000040 0000 0022 0000 0000 0030 0000 0000 0000
0000050 0082 9400 b040 cac0 0023 0000 ca40 0023
0000060 0000 0000 0000 0000 0000 0000 0000 0000

in order to dump the correct rf parameter, you must know the factory mtd block, and shold have the correct partion for mtd block. maybe isn’t not easy.

you can download one from https://github.com/dcboy/mt7628-p4rev-120395/blob/master/src/eeprom/MT7628_EEPROM_20140317.bin, and rename it to /lib/firmware/mt7628.eeprom.bin. be careful, the mac in this file is null, you can edit the mac feild to what you want.

有效信息:

驗證:
7628.eeprom.bin

mtd write /tmp/MT7628_EEPROM_20140317.bin factory
rm /lib/firmware/mt7628.eeprom
reboot

重啓後查看mac

ra0       Link encap:Ethernet  HWaddr 12:34:56:78:90:10  
          inet6 addr: fe80::1034:56ff:fe78:9010/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:561 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:135666 (132.4 KiB)  TX bytes:1148 (1.1 KiB)
          Interrupt:6 

終於生效了!!

此時再查看 iwpriv ra0 e2p

~# iwpriv ra0 e2p
ra0       e2p:
[0x0000]:7628  [0x0002]:0001  [0x0004]:3412  [0x0006]:7856  
[0x0008]:1090  [0x000A]:0000  [0x000C]:0000  [0x000E]:0000  
[0x0010]:FFFF  [0x0012]:FFFF  [0x0014]:FFFF  [0x0016]:FFFF  
[0x0018]:FFFF  [0x001A]:FFFF  [0x001C]:FFFF  [0x001E]:FFFF  
[0x0020]:0000  [0x0022]:0000  [0x0024]:0020  [0x0026]:0000  
[0x0028]:0000  [0x002A]:0000  [0x002C]:0000  [0x002E]:0000  
[0x0030]:0000  [0x0032]:0000  [0x0034]:3422  [0x0036]:2000  
[0x0038]:FFFF  [0x003A]:0100  [0x003C]:0000  [0x003E]:0000  
[0x0040]:0000  [0x0042]:0022  [0x0044]:0000  [0x0046]:0000  
[0x0048]:0030  [0x004A]:0000  [0x004C]:0000  [0x004E]:0000  
[0x0050]:0081  [0x0052]:9400  [0x0054]:B040  [0x0056]:C640  

發現e2p 的內容也跟着改過來了。

總結梳理:

修改 mt7628/88 的ra0 mac 地址的方法

1.修改target/linux/ramips/dts/LINKIT7688.dts 將factory分區屬性改爲可寫(去掉read-only)
2. 下載一個別人備份的eeprom.bin https://github.com/dcboy/mt7628-p4rev-120395/blob/master/src/eeprom/MT7628_EEPROM_20140317.bin
3. 修改MT7628_EEPROM_20140317.bin 的 4 到 9字節,改成想要的mac地址
4. mtd write /tmp/MT7628_EEPROM_20140317.bin factory 將bin寫入factory 分區
5. rm /lib/firmware/mt7628.eeprom 刪掉緩存文件
6. reboot

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章