一.改动mt7620.dtsi,去掉默认的bootargs,kernel_menuconfig取消buildin的command line

二.kernel_menuconfig增加scsi驱动。USB Storage,Ext4文件系统,设置USB驱动有个关键的地方,要打开:

<*>     Generic EHCI driver for a platform device

三.set bootargs root=8:2 rootdelay=5 rootfstype=ext4 rw console=ttyS0,57600注意:rootdelay非常关键

四.全然关闭MTD驱动。须要改动两处:

1.从MTD中获取MAC地址

代码位于drivers/of/of_net.c

int of_get_mac_address_mtd(struct device_node *np, void *mac)
{
    struct device_node *mtd_np = NULL;
    size_t retlen;
    int size, ret;
    struct mtd_info *mtd;
    const char *part;
    const __be32 *list;
    phandle phandle;
 
    list = of_get_property(np, "mtd-mac-address", &size);
    if (!list || (size != (2 * sizeof(*list))))
        return -ENOENT;
 
    phandle = be32_to_cpup(list++);
    if (phandle)
        mtd_np = of_find_node_by_phandle(phandle);
 
    if (!mtd_np)
        return -ENOENT;
 
    part = of_get_property(mtd_np, "label", NULL);
    if (!part)
        part = mtd_np->name;
 
    mtd = get_mtd_device_nm(part);
    if (IS_ERR(mtd))
        return PTR_ERR(mtd);
 
    ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, (u_char *) mac);
    put_mtd_device(mtd);
 
    return ret;
}

当中MTD中的mac地址位置定义在WRTNode.dts文件里

ethernet@10100000 {
    mtd-mac-address = <&factory 0x4>;
    ralink,port-map = "wllll";
};

factory区(mtdblock3)内容例如以下:

我们能够看到。factory偏移4的mac地址是00:0C:43:76:20:A0

因为关闭了MTD驱动,如今的思路:通过bootargs来传递mac地址。

改动of_net.c代码为:

#ifdef CONFIG_MTD
int of_get_mac_address_mtd(struct device_node *np, void *mac)
{
    // 原始代码,从factory偏移4中获取mac地址 
}
#else // #not define CONFIG_MTD
// manfeel , mod to support cmdline mac address
char mac_addr[ETH_ALEN];
static int __init eth_addr_setup(char *str)
{
    int i;
 
    if(str == NULL)
        return 0;
    for(i = 0; i < ETH_ALEN; i++)
        mac_addr[i] = simple_strtol(&str[i*3], (char **)NULL, 16);
    return 1;
}
 
/* Get MAC address from kernel boot parameter eth=AA:BB:CC:DD:EE:FF */
__setup("eth=", eth_addr_setup);
 
int of_get_mac_address_mtd(struct device_node *np, void *mac)
{
    int i;
    for(i = 0; i < ETH_ALEN; i++)
        ((u_char *) mac)[i] = mac_addr[i];
 
    return 1;
}
#endif

于是,bootargs变成了:root=8:2 rootdelay=5 rootfstype=ext4 rw eth=${ethaddr} console=ttyS0,57600

2.从MTD中获取wifi參数

因为WRTNode使用了lintel编译好的ko格式的wifi驱动。无法改动。所以找到了“大茶园丁”大侠的代码,感谢他;)

“大茶”採取的是kernelPackage的方式。故rt2860的代码位于:build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/rt2860v2-r2714

读取MTD中的wifi配置的代码位于:rt2860v2/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>
 
 
 
 
 
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/syscalls.h>
#include <asm/unistd.h>
#include <asm/uaccess.h>
 
#define MY_FILE "/etc/config/eeprom"
 
 
 
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;
    pr_info("NOT implement : mtd_write to %X len = %X\n", to , len);
    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;
    pr_info("<=-=- mtd_read(%s,in file!) from %d len = %d\n", name, from , len);
    
    pr_info("begin to read factory file\n");
 
    struct file *file = NULL;
 
    mm_segment_t old_fs;    
    
    if(file == NULL)
        file = filp_open(MY_FILE, O_RDWR, 0644);
        if (IS_ERR(file)) {
            printk("error occured while opening file %s, exiting...\n", MY_FILE);
            return 0;
        }
 
     old_fs = get_fs();
     set_fs(KERNEL_DS);
     
     file->f_pos = from;
     rdlen = file->f_op->read(file, (char *)buf, len == 0 ?

0x400 : len, &file->f_pos);
     set_fs(old_fs);
     filp_close(file, NULL);  
     file = NULL;
     ret = 1;
 
    pr_info("mtd_read rdlen = %X\n",rdlen);
    if (rdlen != len)
        printk("warning: ra_mtd_read_nm: rdlen is not equal to len\n");
 
 
    return ret;
}
 
EXPORT_SYMBOL(ra_mtd_write_nm);
EXPORT_SYMBOL(ra_mtd_read_nm);
EXPORT_SYMBOL(procRegDir);
 
MODULE_AUTHOR("Manfeel <manfeel@foxmail.com>");
MODULE_DESCRIPTION("Ralink APSoC Flash Map");
MODULE_LICENSE("GPL");

内核驱动中读取/etc/config/eeprom文件的方式来实现,不符合kernel工作组的规范。后期想改成module parameter的方式。在insmod中,将eeprom内容通过数组參数的方式传递到内核驱动。

WRTNode(MT7620n)USB启动总结的更多相关文章

  1. Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码

    Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码 文/玄魂 目录 Kali Linux Web 渗透测试视频教—第二十课-利用 ...

  2. 简单制作 OS X Yosemite 10.10 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)

    原文地址: http://www.iplaysoft.com/osx-yosemite.html 简单制作 Mac OS X Yosemite 正式版 USB 启动盘的方法教程: 其实制作 OS X ...

  3. 制作win10 usb 启动盘

    Rufus 是一个开源的USB启动盘制作程序.其特点就是快速,且支持各种系统,包括各种windows系统,linux系统,使用也很简单. Rufus主页: http://rufus.akeo.ie/ ...

  4. 轻松制作X86 OPENWRT USB启动盘

    本文介绍了一个x86 live USBi启动盘的制作方法. 该方法有如下特点: 1.  可在winXP/win 7/win vista上制作, U盘采用fat格式, 即使对于linux经验较少者, 也 ...

  5. Rufus 制作 USB 启动盘简单教程

    制作 Windows 10 启动盘 U盘 / USB 安装盘图文教程  http://rufus.akeo.ie/downloads/rufus-2.2p.exe 1.将U盘连接到电脑,以管理员身份运 ...

  6. 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)

    方法一:使用命令行创建制作 macOS High Sierra 正式版 USB 安装盘 首先,准备一个 8GB 或更大容量的 U盘,并备份好里面的所有资料. 下载好 macOS High Sierra ...

  7. 使用 DD 命令制作 USB 启动盘

    Windows 下有很多很好用的 USB 启动盘制作工具,比如 Rufus,但是 MacOS 下这个类型的工具就少了很多,这里记录下在 MacOS 中用 DD 命令制作 Linux USB 启动盘的操 ...

  8. Raspberry Pi:树莓派开发板配置USB启动系统

    准备材料 树莓派4B U盘 TF卡 树莓派基础镜像2020-08-20稳定版(这个系统是必须的并拷录在TF卡) Kali树莓派系统(这个是我想要学习的系统,大家可以准备自己的系统,拷录在U盘的) SD ...

  9. 制作 macOS Sierra 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)

    使用命令行创建制作 macOS Sierra 正式版 USB 安装盘 1.准备一个 8GB 或更大容量的 U盘,并备份好里面的所有资料. 2.下载好 macOS Sierra 正式版的安装程序(app ...

随机推荐

  1. 【SQL】数据库更新

    1.插入 INSERT INTO R(A1,A2,...An) VALUES(v1, v2, ...,vn) 如果插入了所有属性,并且按照定义的顺序给出,可以省略(A1,A2,...An) 可以只插入 ...

  2. poj 2264(LCS)

    Advanced Fruits Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2158   Accepted: 1066   ...

  3. 5分钟在Mac上从0配置安装laravel5.5

    1.安装包管理工具homebrew ,相当于ubuntu的apt-get 在iTerm命令行输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.gi ...

  4. [libgdx游戏开发教程]使用Libgdx进行游戏开发(4)-素材管理

    游戏中总是有大量的图像资源,我们通常的做法是把要用的图片做成图片集,这样做的好处就不多说了.直接来看怎么用. 这里我们使用自己的类Assets来管理它们,让这个工具类作为我们的资源管家,从而可以在任何 ...

  5. (五)mysql表操作和约束条件

    (1)表基本操作 1)创建表 create table 表名(字段 数据类型 约束条件) mysql> create table student1(id int,name varchar(50) ...

  6. (二)centos7安装zabbix agentd端

    关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld sed -ri '/^SELINUX=/cSELINUX=disa ...

  7. hdu6162(树链剖分)

    hdu6162 题意 给出一颗带点权的树,每次询问一对节点 \((u, v)\),问 \(u\) 到 \(v\) 的最短路径上所有节点权值在 \([c1, c2]\) 区间内的和. 分析 树链剖分,那 ...

  8. amq笔记:记一个关于PooledConnectionFactory的问题

    替人排查一个关于amq连接数的问题,使用PooledConnectionFactory进行连接池管理,设置了连接数上限为3,但部署到服务器之后,瞬间建立了几百个连接,用netstat -an 查看,发 ...

  9. VisualVM远程JVM

    Tomcat配置 进入TOMCAT_HOME/bin目录 打开catalina.sh文件,加入如下信息: JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.ho ...

  10. NGUI_Sprites

    一.UI Sprites 控件: Sprites控件是NGUI的基础控件,几乎可以这么说所有的控件都可以基于Sprites控件添加 Box Collider然后进行附加相关的脚本组件来达到想要的插件效 ...