一.改动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. 1.hadoop环境搭建以及配置

    提前说明一下:由于环境的配置搞得我很头疼,所以记录下来.并不是零基础,像hadoop的由来.发展史.结构.各个组件,这里都没有介绍,只是为了自己能够在忘了的时候回忆起来,所以记录下来 如何在linux ...

  2. centos 7 卸载自带的jdk

    # 查看jdk安装信息 rpm -qa|grep java 卸载已安装的jdk: # yum -y remove java java-1.7.0-*

  3. DRF最高封装的子类视图

    # 转载请留言联系 子类视图: 视图 作用 方法 父类 ListAPIView 查询多条数据 get GenericAPIView ListModelMixin CreateAPIView 新增一条数 ...

  4. HUST-1350 Trie

    1350 - Trie 时间限制:1秒 内存限制:128兆 104 次提交 35 次通过 题目描述 In computer science, a trie, is an ordered tree da ...

  5. solr in action

    Miscellaneous settings: Lucene version solr使用luceneMatchVersion来决定当前索引正在使用的lucene版本及是否禁用新版本的特性.

  6. 统计mysql库中每张表的行数据

    修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...

  7. HDU 6373.Pinball -简单的计算几何+物理受力分析 (2018 Multi-University Training Contest 6 1012)

    6373.Pinball 物理受力分析题目. 画的有点丑,通过受力分析,先求出θ角,为arctan(b/a),就是atan(b/a),然后将重力加速度分解为垂直斜面的和平行斜面的,垂直斜面的记为a1, ...

  8. Codeforces 651 B. Beautiful Paintings

    B. Beautiful Paintings   time limit per test 1 second memory limit per test 256 megabytes input stan ...

  9. JavaScript处理异步请求的几种方式(取异步函数返回值)

    JavaScript处理异步的几种方式 Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个 ...

  10. Spfa+DP【p2149】[SDOI2009]Elaxia的路线

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia和w**每天都要奔波于宿舍和实验室之间 ...