• 移植MT7620A+MT7610E驱动到Openwrt trunk(Linux Kernel 3.14.18)(续:MT7620A)


    按照上一篇的内容修改文件重新编译后不会报错,但是烧到flash里后运行的时候有问题,如下:

    [   16.840000] mt7620: module license 'unspecified' taints kernel.
    [   16.840000] Disabling lock debugging due to kernel taint
    [   16.870000] mt7620: Unknown symbol ra_mtd_write_nm (err 0)
    [   16.880000] mt7620: Unknown symbol ra_mtd_read_nm (err 0)
    [   16.880000] mt7620: Unknown symbol procRegDir (err 0)
    [   17.290000] mt7610: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.290000] mt7610: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.290000] mt7610: Unknown symbol procRegDir (err 0)
    [   17.290000] mt7620: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.290000] mt7620: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.290000] mt7620: Unknown symbol procRegDir (err 0)
    [   17.290000] ip_tables: (C) 2000-2006 Netfilter Core Team
    [   17.290000] mt7610: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.620000] mt7610: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.620000] mt7610: Unknown symbol procRegDir (err 0)
    [   17.670000] mt7620: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.690000] mt7620: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.690000] mt7620: Unknown symbol procRegDir (err 0)
    [   17.700000] nf_conntrack version 0.5.0 (1979 buckets, 7916 max)
    [   17.740000] xt_time: kernel timezone is -0000
    [   17.780000] mt7610: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.800000] mt7610: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.800000] mt7610: Unknown symbol procRegDir (err 0)
    [   17.860000] mt7620: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.880000] mt7620: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.880000] mt7620: Unknown symbol procRegDir (err 0)
    [   17.900000] PPP generic driver version 2.4.2
    [   17.900000] NET: Registered protocol family 24
    [   17.940000] mt7610: Unknown symbol ra_mtd_write_nm (err 0)
    [   17.960000] mt7610: Unknown symbol ra_mtd_read_nm (err 0)
    [   17.960000] mt7610: Unknown symbol procRegDir (err 0)
    [   18.020000] mt7620: Unknown symbol ra_mtd_write_nm (err 0)
    [   18.020000] mt7620: Unknown symbol ra_mtd_read_nm (err 0)
    [   18.040000] mt7620: Unknown symbol procRegDir (err 0)
    [   18.080000] mt7610: Unknown symbol ra_mtd_write_nm (err 0)
    [   18.090000] mt7610: Unknown symbol ra_mtd_read_nm (err 0)
    [   18.100000] mt7610: Unknown symbol procRegDir (err 0)
    [   18.160000] mt7620: Unknown symbol ra_mtd_write_nm (err 0)
    [   18.160000] mt7620: Unknown symbol ra_mtd_read_nm (err 0)
    [   18.180000] mt7620: Unknown symbol procRegDir (err 0)
    [   28.440000] device eth0.1 entered promiscuous mode

    解决方法:

    移植7620

    1. 添加os/linux/rt_flash.c 内容为:

    #include <linux/module.h>
    #include <linux/types.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    #include <linux/version.h>
    #include <linux/err.h>
    #include <linux/slab.h>
    #include <linux/delay.h>
    #include <linux/sched.h>
    #include <linux/backing-dev.h>
    #include <linux/compat.h>
    #include <linux/mount.h>
    #include <linux/mtd/mtd.h>
    #include <linux/mtd/map.h>
    #include <linux/mtd/concat.h>
    #include <linux/mtd/partitions.h>
    
    struct proc_dir_entry *procRegDir;
    /*
     * Flash API: ra_mtd_read, ra_mtd_write
     * Arguments:
     *   - num: specific the mtd number
     *   - to/from: the offset to read from or written to
     *   - len: length
     *   - buf: data to be read/written
     * Returns:
     *   - return -errno if failed
     *   - return the number of bytes read/written if successed
     */
    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;
    
        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;
        }
    
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
        ret = mtd_read(mtd, 0, mtd->erasesize, &rdlen, bak);
    #else
        ret = mtd->read(mtd, 0, mtd->erasesize, &rdlen, bak);
    #endif
        if (ret) {
            goto free_out;
        }
    
        if (rdlen != mtd->erasesize)
            printk("warning: ra_mtd_write_nm: rdlen is not equal to erasesize
    ");
    
        memcpy(bak + to, buf, len);
    
        ei.mtd = mtd;
        ei.callback = NULL;
        ei.addr = 0;
        ei.len = mtd->erasesize;
        ei.priv = 0;
    
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
        ret = mtd_erase(mtd, &ei);
    #else
        ret = mtd->erase(mtd, &ei);
    #endif
        if (ret != 0)
            goto free_out;
    
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
        ret = mtd_write(mtd, 0, mtd->erasesize, &wrlen, bak);
    #else
        ret = mtd->write(mtd, 0, mtd->erasesize, &wrlen, bak);
    #endif
    
        udelay(10); /* add delay after write */
    
    free_out:
        if (mtd)
            put_mtd_device(mtd);
    
        if (bak)
            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 = 0;
        struct mtd_info *mtd;
    
        mtd = get_mtd_device_nm(name);
        if (IS_ERR(mtd))
            return (int)mtd;
    
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)
        ret = mtd_read(mtd, from, len, &rdlen, buf);
    #else
        ret = mtd->read(mtd, from, len, &rdlen, buf);
    #endif
        if (rdlen != len)
            printk("warning: ra_mtd_read_nm: rdlen is not equal to len
    ");
    
        put_mtd_device(mtd);
        return ret;
    }
    
    EXPORT_SYMBOL(ra_mtd_write_nm);
    EXPORT_SYMBOL(ra_mtd_read_nm);
    EXPORT_SYMBOL(procRegDir);
    
    MODULE_AUTHOR("Steven Liu <steven_liu@ralinktech.com.tw>");
    MODULE_DESCRIPTION("Ralink APSoC Flash Map");
    MODULE_LICENSE("GPL");

    2. 修改os/linux/rt_proc.c

    struct proc_dir_entry *procRegDir

     改为:

    struct proc_dir_entry *procRegDir2860v2

    并将该文件中所有调用procRegDir 的地方改为: procRegDir2860v2

    3. 在Makefile中添加

    rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_flash.o


    4. 修改 include/chip/rt2880.h
    将:

    #include <asm/rt2880/rt_mmap.h> 

    改为: 

    #include "rt_mmap.h" //fix

    5. 修改 include/iface/rtmp_rbs.h

    将:

    #define RTMP_MAC_IRQ_NUM    4

     改为 

    #define RTMP_MAC_IRQ_NUM    6

    6. 修改 include/video.h

    添加 

    VOID VideoTurbineDynamicTune(IN PRTMP_ADAPTER pAd);
  • 相关阅读:
    一、JQuery选择器
    二、HelloMaven-第一个Maven项目
    一、maven的简介和环境搭建
    Junit源码
    五、spring和Hibernate整合
    JS 冒泡排序从学到优化
    JS小案例(基础好烦恼少)----持续更新
    JS+PHP实现用户输入数字后取得最大的值并显示为第几个
    将博客搬至CSDN
    HTML表单相关
  • 原文地址:https://www.cnblogs.com/jzyuchen/p/4094752.html
Copyright © 2020-2023  润新知