恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
小博无线
查看: 15589|回复: 23

在OpenWRT里添加自定义(新)机型

    [复制链接]
发表于 2016-4-18 19:22 | 显示全部楼层 |阅读模式
本帖最后由 hell、梦魇 于 2016-4-18 19:26 编辑

  有的时候买到一个MIPS系列开发板,上面带有Led、以太网以及wifi功能,并且支持Openwrt系统,但是网上没有对应的固件,这时候就需要自己修改源代码添加Openwrt系统对开发板的兼容。下面我用身边的一块MT7620A开发板做个例子。
1、   首先需要找到板子需要的不死Uboot,这里推荐用H大的Breed,Breed有许多对MT7620A系统的版本,我们需要用编程器写入Flash一个个的测试,直到测试到插入网线电脑能识别。
2、   网口能识别后,现在就需要找一个差不多能用(网口可用,但是led不正常)的机型了,这也需要一个个测试MT7620A系列的固件,这里有一个技巧,根据板子Flash类型(Nand flash、SPI flash)的不同,以及Breed系列的不同,可以快速挑选出固件,这里我找到一个机型,华硕(asus)RT-N14。
3、   找到合适的机型后,我们来确定板子上Led的GPIO号,这里我们可以用Breed的一个功能测试。
a)  重启板子,在启动界面不停输入回车,直到出现breed控制台 2.png
b)  然后输入 btntst ,进入GPIO测试界面。 3.png
c)  拿一根镊子或者其他导电物品,轻轻触摸led两侧的引脚,这时候就会出现led的gpio组号、组内编号以及GPIO号(不懂得见下面)。
      i.     在OpenWrt/Linux里面,对GPIO的操作都是通过寄存器操作的,详细可以看每个板子的DTSI文件,在DTSI文件里描述了板子寄存器的地址。
    ii.     以MT7620A为例,GPIO一共有72个,一共分了四组,组号为0~3。0组拥有24个GPIO,GPIO号为0~23;1组拥有16个GPIO,GPIO号为24~39;2组拥有32个GPIO,GPIO号为40~71,;3组仅拥有一个GPIO—GPIO72。因此,GPIO号=GPIO组号基址+GPIO组内编号。
d)  触碰led引脚后记下GPIO的组号以及组内编号。 4.png
4、   前面准备工作完成后下面就开始更改源代码了。OpenWrt对设备的定义是在./target/linux下的,Linux目录下面对应的各个平台,我这个板子是MT7620A的,那么久对应的是Rampis,                          输入grep –rn “rt-n14” ./ 查看包含rt-n14的项,设备声明项的文件如下 1.png 5.png
5、   我将这个开发板命名为huang-7620a(下面修改的文件都是用这个名字)下面对文件进行更改:
      i.     Diag.sh文件不用更改,这个是给led标志名称的。
    ii.     Board.d 下的02_network为网络配置脚本,我们可以看到,这个脚本基于shell语言脚本,用case语句匹配型号设定led,包括下面的led脚本也是。我们在ramips_setup_interfaces函数里面的in语句后面加入
   huang-7620a )
      ucidef_set_interface_lan "eth0"
      ;;
注意:eth0是你测试rt-n14固件得出来的值,大概意思就是让系统将eth0配置为lan。
   iii.     01_leds文件为led的配置脚本,在in语句后面加入
huang-7620a)
      ucidef_set_led_default"power" "power" "huang:blue:power" "1"
      ucidef_set_led_interafce"lan" "huang:blue:lan"
      ucidef_set_led_netdev"eth" "ETH" "huang:blue:wan" "eth0"
      set_wifi_led"huang:blue:air"
      set_usb_led"huang:blue:usb"
   ;;
注意:这里我写的有点问题,有的项开机不配置。_(:з)∠)_
    iv.     Platform.sh文件是 机型的固件头,在刷机的时候,系统就是根据固件头判断固件是否适合该机型,我们只需要找到rt-n14u,复制这一行放到下一行,将rt-n14u改成huang-7620a。
      v.     Rampis.sh文件,这个文件非常重要,系统识别当前机型就是通过这个文件,大概原理有兴趣的可以仔细看看里面代码。固件启动后会在/tmp/sysinfo目录生成一个board_name文件,该文件会被led network配置脚本引用,通过case语句匹配然后配置网口以及led。我们找到rt-n14u,将这几行复制放到下一行,将rt-n14u更改为huang-7620a。如下:
  *"huang-7620a")
      name="huang-7620a"
      ;;
    vi.     .DTS文件,这个文件是device tree source简拼,是Linux里面对设备硬件信息描述的一个文件,里面涉及了系统flash类型(nand flash、spi flash)、系统分区、网口寄存器、led gpio声明等。具体的可以到网上查相关的资料。我们这里要改的不多,只需要复制一份RT-N14U.dts,更名为huang-7620a.dts。然后打开文件,进行编辑。
1.  找到
compatible= "asus,rt-n14u", "ralink,mt7620n-soc";
   model = "Asus RT-N14U";
改成
   compatible ="huang-7620a", "ralink,mt7620a-soc";
   model = "huang-7620a";
2.  找到gpio-leds这部分,这里面是对led gpio 的声明
3.  Label是led的名称,对应01_leds里面的led名称,自己可以随便更改,但是这两个文件里面的leds名称必须一致。
4.  Gpios就是对应的gpio号了,这里填上前面用breed测试出的组号以及组内编号,不能有错。
   gpio-leds{
      compatible= "gpio-leds";
      wan{
         label= "huang:blue:wan";
         gpios= <&gpio2 12 1>;
      };
      lan{
         label= "huang:blue:lan";
         gpios= <&gpio2 15 1>;
      };
      usb{
         label= "huang:blue:usb";
         gpios= <&gpio2 8 1>;
      };
      power{
         label= "huang:blue:power";
         gpios= <&gpio2 14 1>;
      };
      air{
         label= "huang:blue:air";
         gpios= <&gpio2 10 1>;
      };
   };
   vii.     Mt7620a.mk,这个文件是对机型的一些描述,包括固件空间的最大值。
1.  找到Image/Build/Profile/RT-N14U=$(callBuildFirmware/Default8M/$(1),$(1),rt-n14u,RT-N14U),这一行,在下面添加Image/Build/Profile/huang-7620a=$(call BuildFirmware/Default16M/$(1),$(1),huang-7620a,huang-7620a)这一行,Default后面是你的固件空间最大值,可以自行修改。
2.  找到$(call Image/Build/Profile/RT-N14U,$(1)),在下面一行添加$(call Image/Build/Profile/huang-7620a,$(1))
  viii.     最后的,我们需要添加机型的profiles信息,在mt7620\profiles下面(OpenWrt的每个版本可能不一样)新建一个huang-7620a.mk文件,这个文件是为了在menuconfig里面显示的,里面写入
define Profile/huang-7620a
   NAME:=HUANG-EvilBox-7620A
   PACKAGES:=\
      kmod-usb-corekmod-usb2 kmod-usb-ohci \
      kmod-ledtrig-usbdev
endef
defineProfile/Default/Description
   Huangevilbox 7620a
endef
$(eval $(callProfile,huang-7620a))
6、   更改完毕后,删除编译目录下的tmp,然后输入make menuconfig,Target System选择Ralink RT288x/RT3xxx,Subtarget选择(MT7620 based boards),在Target Profile里面应该就能看见HUANG-EvilBox-7620A,然后简单的选择下,编译,不出错的话就能在bin里面看到固件了。
注意: led gpio配置需要更改/build_dir/target-mipsel_24kec+dsp_musl-1.1.14/linux-ramips_mt7620/linux-4.4.6/arch/mips/ralink下的mt7620.c文件,更改static struct rt2880_pmx_funcwled_grp[] = { FUNC("wled", 0, 72, 1) };这一行,72改成led gpio最小的号码,1改成连续占用的gpio个数,比如,我led用了4849 55 51,这四个号,那么72就应该改成48,1改成55-48=7

2.png

评分

参与人数 5恩山币 +11 收起 理由
muzhi + 1 率全体恩山路由党以及党魁向你学习!
momuma + 1 亲,你太牛逼了,走,我请你吃鳇鱼头去~~~
郁闷d + 1 亲,你太牛逼了,走,我请你吃鳇鱼头去~~~
vic-dou + 3 我手抖了下,加分变扣分了!
ZHIZAI100 + 5 一看就是觉得高端、大气、上档次!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2016-4-18 19:26 | 显示全部楼层
五分钟惨案_(:з」∠)_
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-18 22:08 | 显示全部楼层
收藏学习。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-18 22:16 | 显示全部楼层
这个必须mark
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-18 22:51 | 显示全部楼层
赞一个
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2016-4-19 15:58 来自手机 | 显示全部楼层
不开森QAQ
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-19 16:59 来自手机 | 显示全部楼层
写的真好,小白看懂了
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-19 17:17 来自手机 | 显示全部楼层
这个高手啊
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-21 09:07 来自手机 | 显示全部楼层
感谢楼主分享
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-21 09:25 来自手机 | 显示全部楼层
mark
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-22 06:47 来自手机 | 显示全部楼层
马克,准备想折腾一下
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-22 09:05 | 显示全部楼层
不明觉厉
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-22 19:50 来自手机 | 显示全部楼层
太厉害了
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-22 23:56 | 显示全部楼层
感谢分享,好东西
我的恩山、我的无线 The best wifi forum is right here.
发表于 2016-4-25 11:26 | 显示全部楼层
先顶再看,以前就注意到这个帖子了了,不过木有需求,
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛 ( 苏ICP备05084872号-1 )

GMT+8, 2019-1-20 23:01

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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