经大茶指导得知,之前缺失的ra_mtd_read_nm和ra_mtd_write_nm,在华硕的google code里可以找到
google code:https://code.google.com/p/rt-n56u/
路径为:linux3.4.x/drivers/mtd/ralink
很多朋友没调出来,都是因为缺失了这个。
MT7620 OpenWRT所用的RT2860v2 WIFI驱动package
so easy[/vc_toggle][vc_toggle title=”有点问题的方法” open=”false”]rt2860v2在Ralink SDK中路径为\linux-2.6.36.x\drivers\net\wireless
OpenWrt中对应目录为\build_dir\toolchain-mipsel_24kec+dsp_gcc-4.6-linaro_uClibc-0.9.33.2\linux-3.10.28\drivers\net\wireless
驱动下载:
http://www.clz.me/mt7620-wifi-driver/
直接将 rt2860v2、rt2860v2_ap、rt2860v2_sta复制到OpenWRT的目录中。
然后修改目录下makefile和Kconfig文件,理论上是可行的,但make kernel_menuconfig中仍然看不到添加的选项。
原来,make kernel_menuconfig配置的内核为target linux而非 toolchain 中linux。
所以须将保存驱动的地址改为
\build_dir\target-mipsel_24kec+dsp_uClibc-0.9.33.2\linux-ramips_mt7620a\linux-3.10.28
但只添加RT2860v2驱动还不行,还有些网络支持驱动需添加。
经WRTnode的罗老师提供方法如下:
将mt7620_wifi2715_all_dpa_20130308.tar.bz2解压,得到3个文件:
rt2860v2 rt2860v2_ap rt2860v2_sta
(1):将这三个文件放到 /home/host-name/openwrt/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.13/drivers/net/wireless 目录下
(2)在 drivers/net/wireless目录下修改Makefile文件:添加
obj-$(CONFIG_RT2860V2_AP) += rt2860v2_ap/
obj-$(CONFIG_RT2860V2_STA) += rt2860v2_sta/
(3)在 /home/host-name/openwrt/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.13目录下执行:mkdir ralink → cd ralink → cp /home/host-name/RT288x_SDK/source/linux-2.6.36.x/ralink/Kconfig ./ (前提是我们有一份RT288x_SDK 源码)
(4)根据Kconfig文件的要求(source”drivers/net/rt_rdm/Kconfig” source “net/nat/hw_nat/Kconfig”
source “drivers/net/raeth/Kconfig”)
我们还需要从 RT288x_SDK的源文件中拷贝几个文件,
cp -r /home/host-name/RT288x_SDK/source/linux-2.6.36.x/drivers/net/rt_rdm /home/host-name/openwrt-test/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.13/drivers/net
cp -r /home/host-name/RT288x_SDK/source/linux-2.6.36.x/drivers/net/ raeth /home/host-name/openwrt-test/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.13/drivers/net
cp -r /home/host-name/RT288x_SDK/source/linux-2.6.36.x/net/nat /home/host-name/openwrt-test/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.13/net
(5)在trunk的内核里添加我们的驱动配置
vim /home/host-name/openwrt-test/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.13/arch/mips/Kconfig 的末尾加上 source “ralink/Kconfig”
(6) :执行make kernel_menuconfig
但这样还是有报错,可能是Ralink SDK的部分配置openwrt没有造成的。
已发现的缺失配置有:
RTMP_RF_RW_SUPPORT、RTMP_FLASH_SUPPORT、RF_BANK、WSC_AP_SUPPORT 我全给define了
最后define一个RT6352。
参考:
RT3070驱动移植 http://www.anywlan.com/thread-89366-1-1.html[/vc_toggle]
修改wireless目录下的Kconfig和Makefile之后,直接make V=99就可以了,在make过程中会提示新的选项的(如果不加V=99则报错)。
还有几个文件,不能只添加RT2860V2的驱动,等我调通了,再发
什么文件?我曾经调过,也编译进去了,都可以广播SSID了,但完全收不到无线数据包,似乎是无线网的中断有问题。。
那啥……其实驱动要放在target/linux/ramips/files下,然后写一个修改Kconfig和Makefile的patch放到target/linux/ramips/patches下才对……
然后怎么弄?我驱动加进去编译通过了,luci界面里能看到无线网卡,SSID也能改……不过模式一直显示Client,然后能搜到信号,就是连不上……(加密方式我没试过……)
还有,问下,你那个 ra_mtd_read_nm和ra_mtd_write_nm是怎么处理的?
我现在也是这个问题,还没解决
hw_nat、rt_rdm、raeth、nat这几个,我把罗老师说的方法更新到上面了,但我还没调通,有报错,应该是OpenWRT没有Rlink sdk的一些选项造成的,如果你调通了,告诉我一声
我编译是通了,但编出来的wifi驱动能广播SSID但是连不上,可能是wifi驱动的问题,也可能是irq的问题?
至于“hw_nat、rt_rdm、raeth、nat”那几个,都和无线驱动没关系不用理会吧?
报错的话,可能出现有一个extern指针找不到,删掉extern即可。如果还有类型匹配的问题,改成0就好。ra_mtd_read_nm的问题……
缺少ra_mtd_read_nm的问题,请参考这个:
https://lists.openwrt.org/pipermail/openwrt-devel/2013-March/019212.html
(这里面ra_mtd_write_nm的实现是个假的,不过其实也用不到改mtd……吧?)
很多人都在做mt7620 wifi驱动的openwrt移植,但好像都没调通。(mt7620a和n非常类似)
比如这个:
http://patchwork.openwrt.org/patch/4811/
还有这个:
http://devchaotic.blogspot.com/2014/02/getting-openwrt-to-boot-and-wireless.html#comment-form
可能是openwrt在arch目录下的一些系统基本驱动(比如irq)和ralink的sdk不同,导致ralink的wifi驱动只在sdk能用。
比如下面这个项目的wifi驱动就好用,而移植到openwrt就不行。。。
https://code.google.com/p/rt-n56u/
谢谢,我研究下
缺失的那些配置其实Makefile里面有。你去rt2860v2_ap的Makefile里面把所有CONFIG_RALINK_MT7620改成CONFIG_SOC_MT7620,之后在Makefile里面加上:
ifeq ($(CONFIG_SOC_MT7620),y)
EXTRA_CFLAGS += -DCONFIG_RALINK_MT7620
endif
然后直接编译,无线驱动这块就差不多了。
sdk里面的文件好像只有rt_mmap.h被用到
谷歌找到的两个函数体,我是把这个加进去编译成功的:
int ra_mtd_write_nm(char *name, loff_t to, size_t len, const u_char *buf)
{
int ret = -1;
size_t rdlen, wrlen;
struct mtd_info *mtd;
struct erase_info ei;
u_char *bak = NULL;
DECLARE_WAITQUEUE(wait, current);
wait_queue_head_t wait_q;
mtd = get_mtd_device_nm(name);
if (IS_ERR(mtd)) {
ret = (int)mtd;
goto out;
}
if (len > mtd->erasesize) {
put_mtd_device(mtd);
ret = -E2BIG;
goto out;
}
bak = kzalloc(mtd->erasesize, GFP_KERNEL);
if (bak == NULL) {
put_mtd_device(mtd);
ret = -ENOMEM;
goto out;
}
set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&wait_q, &wait);
ret = mtd->_read(mtd, 0, mtd->erasesize, &rdlen, bak);
if (ret) {
set_current_state(TASK_RUNNING);
remove_wait_queue(&wait_q, &wait);
put_mtd_device(mtd);
goto free_out;
}
schedule(); /* Wait for write to finish. */
remove_wait_queue(&wait_q, &wait);
if (rdlen != mtd->erasesize)
printk(“warning: ra_mtd_write: rdlen is not equal to erasesize\n”);
memcpy(bak + to, buf, len);
ei.mtd = mtd;
ei.callback = NULL;
ei.addr = 0;
ei.len = mtd->erasesize;
ei.priv = 0;
ret = mtd->_erase(mtd, &ei);
if (ret != 0) {
put_mtd_device(mtd);
goto free_out;
}
set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&wait_q, &wait);
ret = mtd->_write(mtd, 0, mtd->erasesize, &wrlen, bak);
schedule(); /* Wait for write to finish. */
remove_wait_queue(&wait_q, &wait);
udelay(3000); //add 3ms delay after write
put_mtd_device(mtd);
free_out:
kfree(bak);
out:
return ret;
}
int ra_mtd_read_nm(char *name, loff_t from, size_t len, u_char *buf)
{
int ret;
size_t rdlen;
struct mtd_info *mtd;
mtd = get_mtd_device_nm(name);
if (IS_ERR(mtd))
return (int)mtd;
ret = mtd->_read(mtd, from, len, &rdlen, buf);
if (rdlen != len)
printk(“warning: ra_mtd_read_nm: rdlen is not equal to len\n”);
udelay(1000); //add 1ms delay after read
put_mtd_device(mtd);
return ret;
}
我朋友说他编译过了,但mac地址获取貌似有问题,读出的是00,您清楚这个怎么弄吗?
我就一个初三学生……能知道什么……
我编译出来的好像没有这个问题啊?是不是又是那两个函数的事……
初三,好厉害,那时我只会做做静态网页。。。
http://pan.baidu.com/s/1pJ13F2F 这个有定义,也是报 ra_mtd_read_nm和ra_mtd_write_nm 这个错误。
上面那两个函数放在哪里呢?
这不是我之前发在恩山的吗……那里面有这两个函数了,不过里面的mtd驱动有点多余就是了……函数在files/mtd/maps/ralink-flash.c里面啊……
为什么会报错呢……我记得那是我第一个通过编译的版本啊……
已经调通了,过几天把方法整理出来
正常工作?还是只是编译通过……
全部OK啦~~~一个大神还把打包了~直接就可以用啦~明天晚上我发出来~~~哈哈哈
已经调通啦~~~大神朋友还把打好了包~明天晚上我发出来~哈哈哈
wifi信号强度在web界面正常显示吗?还有支持wpa加密吗? WPA加密可以在luci里改wifi.lua文件来实现,但在web界面里wifi信号怎么始终显示0呢,需要怎么修改呢?
可能RF参数没对,但那需要仪器测,一般都做不了~最好是把路由器原始的env分区保留下来
跟大神混了,决定了~
(~ ̄▽ ̄)~我也是新手~
请问一下,用了QD的源码可以编译出带无线驱动的固件,但里面只有WEP加密,没有WPA这些,还有无线信道也没有的选择,这个怎样解决,谢谢!
这个只有靠你自己研究了~我也没弄过~
为什么我把QD的源码下载来了编译用在小度路由装不了的?
描述具体点
能不能给指点一下,这个弄了很久了,还是没能做好。我邮箱956448552@qq.com
用那个package就行
第一个问题:
我有rt2860v2、rt2860v2_ap、rt2860v2_sta这三个文件,也放在了/work/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.34/drivers/net/wireless这个目录下,当然也修改了Makefile、但是我缺少这个RT288X_SDK,百度无果,望高手给个链接或者发邮箱都行,我邮箱是956448552@qq.com
第二个问题:
以上说的直接可用的RT2860V2 WIFI驱动PACKAGE,是不是已经在openwrt-mt7620这个SDK里面,为什么我的这个make menuconfig里面没有找到。
第三个问题:
我有这个SDK:openwrt-mt7620,不知道是不是你们说的那个,但是make menuconfig里面没有找到kmod-rt2860v2,经过修改这个我编译通过了,有无线,不能ping,而且网卡不支持监听模式。不能使用aircrack-ng抓包。不知道你们编译通过的能不能使用aircrack-ng抓包。
以上问题,希望高手帮忙解答一下啊,不甚感激。。。。。。
使用http://www.clz.me/rt2860v2-package/给的openwrt-mt7620,编译出来的 固件能不能使用aircrack-ng抓包?如果要编译trunk版本,如何移植WiFi驱动?能不能给个详细点的步骤?按照以上方式遇到阻碍:RT288X_SDK在哪里下载,百度搜索没有找到。
我用的是qdk的SDK,编译通过了,但是搜索不到无线信号,模式一直显示client。改为其他模式就出错了,而且频率也不能改。请问你怎么解决的呢?我QQ:956448552
调通的方法呢,能不能发出来看看啊?我的还没有搞定呢。。。。。。。
奈何col,你能把mt7620a的make menuconfig 的配置的相关内容打* 的界面配置发给我吗?我的邮箱:549467713@qq.com,谢谢!!!
我用ubuntu交叉编译的openwrt-ramips-mt7620n-wr8305rt-squashfs-sysupgrade.bin, 可以起来, 但没有wifi
然后, 根据https://github.com/wuqiong/rt2860v2-for-openwrt-mt7620 这个页面里的做法, 把rt2620v2编译到内核, 并把rt2620ap.dat 拷贝到/etc/wireless下, ra0 可以up, 可以看到信号. 但是luci上显示的是无线网卡, 无法识别成ap, 请问这里的大牛们, 怎么解决这个问题啊
更正下, 可以识别成ap, 手机上可以看到这个无线设备, 但网卡本身搜不出周围任何信号
应该只是luci没支持,用iwconfig搜索
luci要支持需要写对应的程序,请用iwconfig
那个打包好的rt2860v2包怎么用呀,小白大神勿喷哦~~~~
7620n 的 bssid mac、地址 咋修改 呀
network配置里可以修改
大神 你还是没说如何解决 缺失 ra_mtd_read_nm ra_mtd_write_nm 定义 的问题啊
求一个详细的解答过程啊
太久没弄这个都忘了,,现在有开源的驱动了,自己研究下吧