CaryStudio

 找回密码
 立即注册
搜索
查看: 1627|回复: 0

WRTNode(MT7620n)USB启动总结

[复制链接]
发表于 2017-11-17 11:43:17 | 显示全部楼层 |阅读模式

请先登录

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一.修改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
  1. int of_get_mac_address_mtd(struct device_node *np, void *mac)
  2. {
  3.     struct device_node *mtd_np = NULL;
  4.     size_t retlen;
  5.     int size, ret;
  6.     struct mtd_info *mtd;
  7.     const char *part;
  8.     const __be32 *list;
  9.     phandle phandle;

  10.     list = of_get_property(np, "mtd-mac-address", &size);
  11.     if (!list || (size != (2 * sizeof(*list))))
  12.         return -ENOENT;

  13.     phandle = be32_to_cpup(list++);
  14.     if (phandle)
  15.         mtd_np = of_find_node_by_phandle(phandle);

  16.     if (!mtd_np)
  17.         return -ENOENT;

  18.     part = of_get_property(mtd_np, "label", NULL);
  19.     if (!part)
  20.         part = mtd_np->name;

  21.     mtd = get_mtd_device_nm(part);
  22.     if (IS_ERR(mtd))
  23.         return PTR_ERR(mtd);

  24.     ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, (u_char *) mac);
  25.     put_mtd_device(mtd);

  26.     return ret;
  27. }
复制代码
其中MTD中的mac地址位置定义在WRTNode.dts文件中
  1. ethernet@10100000 {
  2.     mtd-mac-address = <&factory 0x4>;
  3.     ralink,port-map = "wllll";
  4. };
复制代码
factory区(mtdblock3)内容如下:

                               
登录/注册后可看大图
我们可以看到,factory偏移4的mac地址是00:0C:43:76:20:A0
由于关闭了MTD驱动,现在的思路:通过bootargs来传递mac地址。
修改of_net.c代码为:
  1. #ifdef CONFIG_MTD
  2. int of_get_mac_address_mtd(struct device_node *np, void *mac)
  3. {
  4.     // 原始代码,从factory偏移4中获取mac地址
  5. }
  6. #else // #not define CONFIG_MTD
  7. // manfeel , mod to support cmdline mac address
  8. char mac_addr[ETH_ALEN];
  9. static int __init eth_addr_setup(char *str)
  10. {
  11.     int i;

  12.     if(str == NULL)
  13.         return 0;
  14.     for(i = 0; i < ETH_ALEN; i++)
  15.         mac_addr[i] = simple_strtol(&str[i*3], (char **)NULL, 16);
  16.     return 1;
  17. }

  18. /* Get MAC address from kernel boot parameter eth=AA:BB:CC:DD:EE:FF */
  19. __setup("eth=", eth_addr_setup);

  20. int of_get_mac_address_mtd(struct device_node *np, void *mac)
  21. {
  22.     int i;
  23.     for(i = 0; i < ETH_ALEN; i++)
  24.         ((u_char *) mac)[i] = mac_addr[i];

  25.     return 1;
  26. }
  27. #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中,修改如下:
  1. #include <linux/module.h>
  2. #include <linux/types.h>
  3. #include <linux/init.h>
  4. #include <linux/kernel.h>
  5. #include <linux/version.h>
  6. #include <linux/err.h>
  7. #include <linux/slab.h>
  8. #include <linux/delay.h>
  9. #include <linux/sched.h>
  10. #include <linux/backing-dev.h>
  11. #include <linux/compat.h>
  12. #include <linux/mount.h>

  13. //#include <linux/mtd/mtd.h>
  14. //#include <linux/mtd/map.h>
  15. //#include <linux/mtd/concat.h>
  16. //#include <linux/mtd/partitions.h>





  17. #include <linux/fs.h>
  18. #include <linux/string.h>
  19. #include <linux/mm.h>
  20. #include <linux/syscalls.h>
  21. #include <asm/unistd.h>
  22. #include <asm/uaccess.h>

  23. #define MY_FILE "/etc/config/eeprom"



  24. struct proc_dir_entry *procRegDir;
  25. /*
  26. * Flash API: ra_mtd_read, ra_mtd_write
  27. * Arguments:
  28. *   - num: specific the mtd number
  29. *   - to/from: the offset to read from or written to
  30. *   - len: length
  31. *   - buf: data to be read/written
  32. * Returns:
  33. *   - return -errno if failed
  34. *   - return the number of bytes read/written if successed
  35. */
  36. int ra_mtd_write_nm(char *name, loff_t to, size_t len, const u_char *buf)
  37. {
  38.     int ret = -1;
  39.     pr_info("NOT implement : mtd_write to %X len = %X\n", to , len);
  40.     return ret;
  41. }

  42. int ra_mtd_read_nm(char *name, loff_t from, size_t len, u_char *buf)
  43. {
  44.     int ret;
  45.     size_t rdlen = 0;
  46.     struct mtd_info *mtd;
  47.     pr_info("<=-=- mtd_read(%s,in file!) from %d len = %d\n", name, from , len);
  48.    
  49.     pr_info("begin to read factory file\n");

  50.     struct file *file = NULL;

  51.     mm_segment_t old_fs;   
  52.    
  53.     if(file == NULL)
  54.         file = filp_open(MY_FILE, O_RDWR, 0644);
  55.         if (IS_ERR(file)) {
  56.             printk("error occured while opening file %s, exiting...\n", MY_FILE);
  57.             return 0;
  58.         }

  59.      old_fs = get_fs();
  60.      set_fs(KERNEL_DS);
  61.      
  62.      file->f_pos = from;
  63.      rdlen = file->f_op->read(file, (char *)buf, len == 0 ? 0x400 : len, &file->f_pos);
  64.      set_fs(old_fs);
  65.      filp_close(file, NULL);  
  66.      file = NULL;
  67.      ret = 1;

  68.     pr_info("mtd_read rdlen = %X\n",rdlen);
  69.     if (rdlen != len)
  70.         printk("warning: ra_mtd_read_nm: rdlen is not equal to len\n");


  71.     return ret;
  72. }

  73. EXPORT_SYMBOL(ra_mtd_write_nm);
  74. EXPORT_SYMBOL(ra_mtd_read_nm);
  75. EXPORT_SYMBOL(procRegDir);

  76. MODULE_AUTHOR("Manfeel <manfeel@foxmail.com>");
  77. MODULE_DESCRIPTION("Ralink APSoC Flash Map");
  78. MODULE_LICENSE("GPL");
复制代码
内核驱动中读取/etc/config/eeprom文件的方式来实现,不符合kernel工作组的规范。后期想改成module parameter的方式,在insmod中,将eeprom内容通过数组参数的方式传递到内核驱动。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|CaryStudio ( 粤ICP备16022806号 )

GMT+8, 2023-6-8 10:40 , Processed in 0.087054 second(s), 12 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表