一.改动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. 3.orm之peewee

    peewee是一款orm框架,为什么选择peewee,是因为它比较简单和Django比较类似,而且还有一个async-peewee,可以进行异步化. 如何定义model和生成表 ''' 我们要定义两张 ...

  2. Android开发工具--AndroidStudio

    1.Android studio更改快捷键File->setttings  搜索key map就可以更改成自己喜欢的会计键风格了

  3. WPF第三方控件盘点

    WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评 ...

  4. Hibernate多对多两种情况

    Hibernate在做多对多映射的时候,除了原先的两张表外,会多出一个中间表做关联,根据中间表的会有两种不同的配置情况: 1.中间表不需要加入额外数据. 2.中间表有其他字段,需记录额外数据. 下面, ...

  5. sql参数化防止sql注入导致的暴露数据库问题

    #转载请联系 假如你在京东工作,你要做的任务就是做一个商品搜索的东西供用户使用. 然后你写出了这么一个程序的雏形. import pymysql def main(): conn = pymysql. ...

  6. Delphi New,Getmem,ReallocMem联系与区别

    来自:http://www.cnblogs.com/jsrgren/archive/2011/10/31/2270353.html ---------------------------------- ...

  7. PHP7中php.ini、php-fpm和www.conf的配置(转)

    根据前文 <2015博客升级记(五):CentOS 7.1编译安装PHP7> 的 configure 编译参数设定,安装后的PHP7配置文件所在路径是 /usr/local/php7/et ...

  8. shell字符串变量的特异功能:字符串的替换(${str/源模式/目标模式},${str//源模式/目标模式})、截断

    https://blog.csdn.net/wzb56_earl/article/details/6953612

  9. Rescue The Princess

    Description Several days ago, a beast caught a beautiful princess and the princess was put in prison ...

  10. 如何修改wamp目录【成功】

    Wampserver安装好后,“www目录”默认为X:/wamp/www,(这里的X是盘符)也就是wampserver安装目录下的www文件夹.实际使用中,默认设置往往不是我们想要的,可能改成其他文件 ...