openwrt下的mac地址修改,开始使用的是网上开源的程序,想通过iwpriv命令修改板子上的地址,出现问题就是就算修改成功,一旦掉电就直接消失,再次上电发现e2p中数据并没有被修改成功,对比华硕的开源程序,并没有发现太大的差别,只有固件的权限不同,在组权限中多出了写权限。
后查阅资料,发现固件mtd是属于块设备,具有的是readonly权限,按官方说法是在dts文件中修改掉readonly权限为wr权限即可,然而我并没有修改成功。
通过手册查找flash信息,了解对应的mac地址存放位置,知道了mac放在mtdblock2区域,mtdblock是MTD子系统的mtdblock层,属于nandflash,MTD底层驱动需要给MTD层主要提供三个常用的接口,分别是:
Write、read和erase。read不用说,write和erase是修改的主要手段,一个是将位从1写到0,另一个是从0复位到1。在内核驱动中有相应的驱动函数去调用。
基于此,想到的就是将其中的mac地址拷贝出来,转换为2进制.bin文件,修改其中的参数,再将其重新写回mtdblock中让它自己通过调用函数修改地址。
一、dd if=/dev/mtdblock2 of=/tmp/factory.bin
将mac地址导出以后保存为临时文件,少量修改时通过winscp传出,通过hex软件修改指定值(通常六位),然后传回板子中
二、mtd write XXX.bin factory
进行写回分区操作
写回后进行重启,在重新上电过程中进行了修改,重启后通过iwpriv ra0 e2p来查看即可确定是否修改成功。
三、如果需要工业化生产,可以写一个自己的.ipk包去直接操作,取消掉传出文件,直接在板上系统中进行修改。
我是自己写的程序去替换掉用软件修改指定值的过程(fopen,fread,fwrite)
这样就避开了去修改mtd块设备的读写权限