一.改动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. hadoop3.1 分布式集群部署

    1.环境准备 Centos7.5系统 hadoop版本3.1 1.1资源分配 主机名 地址 角色 node01 10.10.0.11 namenode node02 10.10.0.12 second ...

  2. docker从零开始 存储(六)存储驱动如何选择

    Docker存储驱动程序 理想情况下,将非常少的数据写入容器的可写层,并使用Docker卷来写入数据.但是,某些工作负载要求您能够写入容器的可写层.这是存储驱动程序的用武之地. Docker使用可插拔 ...

  3. jQuery.Easyui 三层菜单的实现

    有图才有真相: 三层导航菜单JSON 数据格式如下: ].panel('options').title;    $('#wnav').accordion('select', t); } // 初始化左 ...

  4. BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子

    来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...

  5. HDU 6213 Chinese Zodiac 【模拟/水题/生肖】

    Problem Description The Chinese Zodiac, known as Sheng Xiao, is based on a twelve-year cycle, each y ...

  6. Hash算法详解

    这篇不错: https://blog.csdn.net/u014209205/article/details/80820263

  7. 贮油点问题(C++)

    贮油点问题…..一道送命系列的递推… 描述 Description 一辆重型卡车欲穿过S公里的沙漠,卡车耗汽油为1升/公里,卡车总载油能力为W公升.显然卡车装一次油是过不了沙漠的.因此司机必须设法在沿 ...

  8. Codeforces 855C - Helga Hufflepuff's Cup

    855C - Helga Hufflepuff's Cup 题意 要求构建一棵树,树上至多可以存在 \(x\) 个权值为 \(k\) 的重要点,且与重要点连边的点的权值必须小于 \(k\),问有多少种 ...

  9. 28、Django实战第28天:个人信息展示

    从今天开始,我来完成个人中心部分,前端页面如下 1.浏览这些页面可以发现,它们和base.html是有区别的,因此,它们需要新建一个模板usercenter-base.html 2.把usercent ...

  10. oracle enable / disable all constraint

    beginfor i in (select constraint_name, table_name from user_constraints where table_name='') LOOPexe ...