WRTNode(MT7620n)USB启动总结
一.改动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_MTDint 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 addresschar 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启动总结的更多相关文章
- Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码
Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码 文/玄魂 目录 Kali Linux Web 渗透测试视频教—第二十课-利用 ...
- 简单制作 OS X Yosemite 10.10 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
原文地址: http://www.iplaysoft.com/osx-yosemite.html 简单制作 Mac OS X Yosemite 正式版 USB 启动盘的方法教程: 其实制作 OS X ...
- 制作win10 usb 启动盘
Rufus 是一个开源的USB启动盘制作程序.其特点就是快速,且支持各种系统,包括各种windows系统,linux系统,使用也很简单. Rufus主页: http://rufus.akeo.ie/ ...
- 轻松制作X86 OPENWRT USB启动盘
本文介绍了一个x86 live USBi启动盘的制作方法. 该方法有如下特点: 1. 可在winXP/win 7/win vista上制作, U盘采用fat格式, 即使对于linux经验较少者, 也 ...
- Rufus 制作 USB 启动盘简单教程
制作 Windows 10 启动盘 U盘 / USB 安装盘图文教程 http://rufus.akeo.ie/downloads/rufus-2.2p.exe 1.将U盘连接到电脑,以管理员身份运 ...
- 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
方法一:使用命令行创建制作 macOS High Sierra 正式版 USB 安装盘 首先,准备一个 8GB 或更大容量的 U盘,并备份好里面的所有资料. 下载好 macOS High Sierra ...
- 使用 DD 命令制作 USB 启动盘
Windows 下有很多很好用的 USB 启动盘制作工具,比如 Rufus,但是 MacOS 下这个类型的工具就少了很多,这里记录下在 MacOS 中用 DD 命令制作 Linux USB 启动盘的操 ...
- Raspberry Pi:树莓派开发板配置USB启动系统
准备材料 树莓派4B U盘 TF卡 树莓派基础镜像2020-08-20稳定版(这个系统是必须的并拷录在TF卡) Kali树莓派系统(这个是我想要学习的系统,大家可以准备自己的系统,拷录在U盘的) SD ...
- 制作 macOS Sierra 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
使用命令行创建制作 macOS Sierra 正式版 USB 安装盘 1.准备一个 8GB 或更大容量的 U盘,并备份好里面的所有资料. 2.下载好 macOS Sierra 正式版的安装程序(app ...
随机推荐
- Asp.Net Core 项目实战参考
Asp.Net Core 项目实战链接 http://www.cnblogs.com/fonour/p/5904530.html
- python高阶函数,map,filter,reduce,ord,以及lambda表达式
为什么我突然扯出这么几个函数,是因为我今天在看流畅的python这本书的时候,里面有一部分内容看的有点懵逼. >>> symbols = '$¢£¥€¤' >>> ...
- k8s的DamonSet使用
Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. 1.Daemo ...
- 使用CreateRemoteThread把代码远程注入指定exe执行
由于本人也是新手,如果有朋友不懂windows api相关知识,我相信查阅书籍或者百度会比我说有帮助的多,下面就我所做简单复述一下过程,欢迎指正缺点. 效果图示如下: 做的这个例子首先是创建了一个MF ...
- 利用ResultFilter实现asp.net mvc3 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- HDU 1251 统计难题 (字典树)(查询是否为前缀)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- 7、Django实战第7天:用form实现登录
Django提供了form对表单进行验证,比如今天要完成的限定登录的时候用户名和密码不能为空,通过这个操作,数据进入到数据库查询之前,我们就可以过滤很多错误,避免不必要的查询. 在users目录下新建 ...
- ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...
- Spring中BeanFactory和ApplicationContext的区别
1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期. 2. ApplicationContext除了提供上述BeanF ...
- 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘
[BZOJ3167][Heoi2013]Sao Description WelcometoSAO(StrangeandAbnormalOnline).这是一个VRMMORPG,含有n个关卡.但是,挑战 ...