移植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\n");

    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\n");

    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 <[email protected]>");
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);
时间: 2024-10-09 05:46:36

移植MT7620A+MT7610E驱动到Openwrt trunk(Linux Kernel 3.14.18)(续:MT7620A)的相关文章

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

MT7620 修改trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/mt7620/rt2880/os/linux/rt_linux.c :1201行 将: pOSFSInfo->fsuid = current_fsuid(); pOSFSInfo->fsgid = current_fsgid(); 修改为: pOSFSInfo->fsuid = *(int *)&current

基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 网卡芯片:DM9621NP 交叉编译工具链: arm-none-linux-gnueabi-gcc

Linux开源模块移植概述暨交叉编译跨平台移植总结--摘自《嵌入式Linux驱动模板精讲与项目实践》

本文摘自<嵌入式Linux驱动模板精讲与项目实践>一书中的"开发与调试技巧". Linux的强大威力就在于有很多开源项目可以使用,通常很多需求可以通过寻找相关的开源模块做为快速解决方案.要把这些开源模块应用到嵌入式中,其中一个关键点就是要使用交叉编译工具对开源项目进行交叉编译. 根据具体情况,下载的开源项目在组织上有很多情况,在此对各种情况进行归类介绍. 1. 下载的开源软件包找不到Makefile 对于这种开源包通常是采用configure的方式组织的,那么第一步就是使用

pcDuino的linux移植四简单驱动开发

开发环境系统:ubuntu 10.04.4单板:pcDuino(全志A10)编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 搭建开发环境详见ubuntu 10.04.4开发环境配置. 目标1.配置 编译linux-3.0.62内核,串口正常输出2.配置内核,支持nfs挂载,启动文件系统3.最简单内核驱动开发 这个是在pcDuino linux移植一.二.三的基础上写的,重点介绍内核驱动开发,其它具体移植过程不再

关于linux kernel及文件系统在jz2440的移植

结合网上及书上的讲解,记录下linux kernel及yaffs2文件系统的移植过程及问题,以便以后查询! 部分转自:http://blog.sina.com.cn/s/blog_9d7f02120101gvnk.html 一,内核移植 修改晶振 修改arch/arm/mach-s3c2440/mach-smdk2440.c    static void __init smdk2440_map_io(void){    s3c24xx_init_io(smdk2440_iodesc, ARRAY

简单移植deepin的wine软件包到其他linux发行版

简单移植deepin的wine软件包到其他linux发行版:(不能直接安装的情况下) 因为是deepin的软件包所以难免会有一些依赖问题,我们只需要去掉这些依赖就可以安装了.所以我们需要对软件包进行修改.但由于依赖问题,所以部分软件并不能完美运行. 1.安装dpkg 这个软件包估计都是安装过得 要是没有安装的可以通过指令或新立得安装 执行代码 sudo apt-get install dpkg 2.修改deepin的wine软件包 a.获取deepin的wine软件包,可以通过一下网址得到.(请

在linux内核文件中添加自己的驱动,添加自己的linux驱动,编译自己的linux驱动程序方法和例子图文

此文章为done原创,转载请写明出处,尊重原创. 写这个文章,我参考了网上的一些博客: http://bbs.chinaunix.net/thread-3634524-1-1.html http://www.bkjia.com/gjrj/800182.html 也参考了参考了 <linux驱动开发详解>3.4章节,实现建立自己驱动目录. 文章中的驱动范例是:linux设备驱动开发详解第二版 的 global mem tow,宋宝华主编的书本光盘源码 在我们学习了linux的驱动之后,我们都想编

Linux kernel中断子系统之(五):驱动申请中断API

一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述.第三章主要描述了驱动申请 interrupt line接口API request_threaded_irq的规格.第四章是进入request_threaded_irq的实现细节,分析整个代码的执行过程. 二.和中断相关的lin

Linux kernel 之 uart 驱动解析

uart 是一种非常之常见的总线,比如DEBUG信息输出,小数据量数据传输,485,以及蓝牙的控制,GPS,很多都是通过uart 进行数据传输并进行控制. 在Linux kernel 内部,uart 通常是作为 一个 tty 设备对其进行控制,也是就是一个字符设备文件,可对其进行读写操作. kernel version 4.4.12 首先先看一下基本的 结构体 和 API 操作. // include/linux/serial_core.h // uart 驱动结构体 struct uart_d