移植MT7620-rt2860v2驱动到OpenWRT

46
9422

经大茶指导得知,之前缺失的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

很多朋友没调出来,都是因为缺失了这个。

[vc_toggle title=”dq大哥的rt2860v2-package” open=”false”]dq大哥直接将rt2860v2打包了~这下大家都可以直接用了

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]

46 意见

  1. 修改wireless目录下的Kconfig和Makefile之后,直接make V=99就可以了,在make过程中会提示新的选项的(如果不加V=99则报错)。

      • 什么文件?我曾经调过,也编译进去了,都可以广播SSID了,但完全收不到无线数据包,似乎是无线网的中断有问题。。

        • 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的问题……

      • 第一个问题:
        我有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抓包。
        以上问题,希望高手帮忙解答一下啊,不甚感激。。。。。。

  2. 那啥……其实驱动要放在target/linux/ramips/files下,然后写一个修改Kconfig和Makefile的patch放到target/linux/ramips/patches下才对……
    然后怎么弄?我驱动加进去编译通过了,luci界面里能看到无线网卡,SSID也能改……不过模式一直显示Client,然后能搜到信号,就是连不上……(加密方式我没试过……)
    还有,问下,你那个 ra_mtd_read_nm和ra_mtd_write_nm是怎么处理的?

  3. 很多人都在做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/

    • 使用http://www.clz.me/rt2860v2-package/给的openwrt-mt7620,编译出来的 固件能不能使用aircrack-ng抓包?如果要编译trunk版本,如何移植WiFi驱动?能不能给个详细点的步骤?按照以上方式遇到阻碍:RT288X_SDK在哪里下载,百度搜索没有找到。

  4. 缺失的那些配置其实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被用到

  5. 谷歌找到的两个函数体,我是把这个加进去编译成功的:
    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;
    }

  6. wifi信号强度在web界面正常显示吗?还有支持wpa加密吗? WPA加密可以在luci里改wifi.lua文件来实现,但在web界面里wifi信号怎么始终显示0呢,需要怎么修改呢?

  7. 我用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, 请问这里的大牛们, 怎么解决这个问题啊

留下一个答复

Please enter your comment!
Please enter your name here