欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AR9531 产品级适配方案(基础篇)

程序员文章站 2024-02-22 09:44:22
...

准备工作

1、明确适配的目的

选一款合适的硬件。本次适配的目的是物联网网关,因此使用了一块9531核心板,按照需求做成几块不同的底板。

2、给固件取一个名字

定一个产品型号。不要随便起一个名字。后面改起来基本上就跟重新适配一次一样。本例的产品名字是monkfish,产品的型号叫做IOT-GW100。

3、准备一个访问国外速度快的接入线路或者让自己变得非常有耐心

我自己用的是移动送的宽带,下载一次openwrt的更新文件,断断续续、反反复复。有人说了,你怎么不用电信的呢? 这话就戳人心窝子了。自古以来,”遍身罗绮者,不是养蚕人”。其实笔者也通过改过的VPN(别问我为啥改)尝试过,电信IDC机房的情况也只能说是“五十步笑百步”尔。

4、保持和硬件厂家良好的关系

我们这些玩着openwrt吃软饭的人。很多时候并不知道硬件设计、制造的细节。尤其是那些在软硬交界处的资源布局在具体的板子上如何的布局。因此,得到硬件厂家良好的技术支持是必不可少的。否则,你可能工作起来就像是大海捞针一样。
这是我选择的硬件:
AR9531 产品级适配方案(基础篇)

二、定制过程

1、删除不需要的硬件支持

openwrt默认支持很多的硬件,可以全部都删除,这样自己添加的产品型号就一目了然,不管是做系列产品还是OEM都非常方便。所有关于板子的硬件描述都在 openwrt 安装目录的/target/linux/ar71xx/目录下。下面除非特别指出,所有路径都是基于openwrt的安装目录。
/target/linux/ar71xx/image下新增monkfish.mk文件,内容如下:

define LegacyDevice/GW100
        DEVICE_TITLE := IOT-GW100
        DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-storage
endef
LEGACY_DEVICES += GW100

这是Make文件,务必注意行首的空白是Tab而不是空格。

有了我们自己的产品型号后,屏蔽掉系统默认的产品型号,打开 /target/linux/ar71xx/image/Makefile。注释掉默认的,添加自己的。

ifeq ($(SUBTARGET),generic)
#include ./generic.mk
#include ./generic-legacy-devices.mk
#include ./generic-senao.mk
#include ./generic-tp-link.mk
#include ./generic-ubnt.mk
include  ./monkfish.mk
endif

到这一步,我们运行make menuconfig就可以看到自定义的型号了。

2、给自己的型号添加FLASH配置

openwrt里那些自带的型号可不是空穴来风,其中就包含高通的参考设计。我们选择的AR9xxx是一大类。本次使用的板子是9531。添加自己型号配置的时候,要问清楚硬件厂家对应的参考设计是哪一个。9531对应的参考设计就是AP143。我们所有的配置都是以AP143为蓝本进行修改,依葫芦画瓢。如果你的供应商不告诉你,笔者建议还是换一家。没有硬件支持的软件开发,前途未卜。

在image/legacy.mk中添加这个型号的flash配置。这两行分别添加在AP143 配置的附近。这是为了在出错的时候好对比AP143的配置进行修改。搜索ap143 然后在它下面添加:

*gw100_mtdlayout*=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,1408k(kernel),14528k(rootfs),64k(monkfish),64k(art)ro,aaa@qq.com(firmware)

搜索AP143 ,在它下面添加这一行。

$(eval $(call SingleProfile,AthLzma,64k,GW100,gw100,GW100,ttyS0,115200,$$(*gw100_mtdlayout*),KRuImage))

斜体部分的字符串要严格对应。最后面的KRuImage 是表示内核在前,文件系统(RootFS)在后。这两行为什么要这样写来自于两个方面:
1、原先板子的u-boot启动参数是什么样的。这是主要因素。如果你不想改u-boot那么最好按照板子原始的boot参数来适配。那么,板子的原始启动参数怎么获得呢?可以在板子的u-boot中运行printenv获得,也可以问板子的供应商。
、根据业务需求自己设计。在上述Flash布局中,有一个monkfish分区,这就是为了产品保存一些持久化的信息而设置的。比如产品ID。或者其他一些什么信息。这部分信息在更新固件的过程中是不会被擦除的。

3、给自己的型号添加板子配置

一共有三个地方要加,请务必注意三个地方同样颜色字符串的一致性。
第一个地方在 /target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt 。
找到AP143的配置,在下面添加:

config ATH79_MACH_GW100
        bool "IOT-GW100"
        select SOC_QCA953X
        select ATH79_DEV_GPIO_BUTTONS
        select ATH79_DEV_LEDS_GPIO
        select ATH79_DEV_SPI
        select ATH79_DEV_USB
        select ATH79_DEV_WMAC
        select ATH79_DEV_ETH
        select ATH79_DEV_M25P80

同样要注意行首是Tab,而不是空格。
第二个地方在/target/linux/ar71xx/files/arch/mips/ath79/mach-gw100.c
mach-gw100.c这个文件是不存在的,把mach-ap143.c拷贝成mach-ap143.c然后再进行修改。在这个文件的最后一行:

MIPS_MACHINE(ATH79_MACH_GW100, “GW100", "IOT-GW100",gw100_setup);    

请注意"IOT-GW100"字符串对应关系。另外,把这个文件里所有的AP143都修改为GW100。把ap143都改为gw100 。可以使用vi的查找替换命令。 %s/AP143/GW100/g 和 %s/ap143/gw100/g 。

第三个地方在 /target/linux/ar71xx/base-files/lib/ar71xx.sh 中找到AP143,在后面添加:

*”IOT-GW100")
        name=“gw100"
        ;;
      "IOT-GW100"部分要对应第一个、第二个文件中的。

4、为这个型号增加网络、LED、Reset配置

下面的内容所涉及到的参数都是从硬件供应商那里获得的。如果没有这些信息,适配将变得比较困难。但是也不是不能做。笔者将会在另外的文章中阐述。

指定固件的魔术字,/target/linux/ar71xx/base-files/lib/upgrade/platform.sh 中找到xd3200(这个文件里没有ap143)在前面添加:

  gw100|\

第二个地方 /target/linux/ar71xx/files/arch/mips/ath79/mach-gw100.c

 #define GW100_GPIO_BTN_RESET             4
 增加reset 按钮的配置,  这个 4  也是硬件厂商提供的。

设置reset按键的结构体。
    static struct gpio_keys_button gw100_gpio_keys[] __initdata = {
        {
                .desc           = "Reset button",
                .type           = EV_KEY,
                .code           = KEY_RESTART,
                .debounce_interval = GW100_KEYS_DEBOUNCE_INTERVAL,
                .gpio           = GW100_GPIO_BTN_RESET,
                .active_low     = 0,
        },
};

其他关于默认LED的结构体,初始化代码请自行注释掉。比如,gw100_gpio_led_setup() 的调用。关于以太口的配置完全是依赖硬件设计的,必须要咨询硬件的设计才能修改。
这是适配工作关键步骤,也是需要硬件厂家支持最多的地方。

5、增加该型号的机器文件

在 /target/linux/ar71xx/files/arch/mips/ath79/Makefile 中AP143后面增加 :

 obj-$(CONFIG_ATH79_MACH_GW100)                   += mach-gw100.o

在 /target/linux/ar71xx/files/arch/mips/ath79/machtypes.h 中AP143后面增加:

ATH79_MACH_GW100,                       /* MonkFish IOT-GW100 board */

在/target/linux/ar71xx/config-4.4中 AP143后面增加:

CONFIG_ATH79_MACH_GW100=y

/target/linux/ar71xx/generic/config-default 中 AP143后面增加:

 CONFIG_ATH79_MACH_GW100=y

三、开始编译

如果是全新编译,包括下载等时间,至少在得5个小时以上。编译完毕后就可以烧写Flash了。u-boot烧写命令:

setenv serverip 192.168.100.242  && 
setenv ipaddr 192.168.100.144 && 
setenv bootfile   openwrt-ar71xx-generic-gw100-squashfs-sysupgrade.bin  && 
tftp && erase 0x9f050000 +$filesize && 
cp.b 0x81000000 0x9f050000 $filesize && 
reset;

其中0x9f050000是从u-boot中运行printenv获得的。就是 bootm的值。

四、基本测试

1、查看网卡是否都驱动了。这款板子有2个100M以太口,一个2.4G的无线网卡。通过ifconfig都要可以看到。
2、网卡工作是否正常。给网卡配置IP地址,从外面是否可以正常访问。
3、网卡的MAC地址是否正确。网卡的MAC保存在Flash的Art分区中,无线网卡从这里读去MAC地址后,eth0,eth1分别加一配置自己。怎么读取要咨询具体的硬件厂家。如果MAC地址识别错误,每次启动后MAC都不一样,并且意味着无线的信号肯定不正常,因为ART分区中保存了无线的工作参数。
4、是否能登录web管理界面(如果安装了的话)。

相关标签: OpenWrt