AR9531 产品级适配方案(基础篇)
准备工作
1、明确适配的目的
选一款合适的硬件。本次适配的目的是物联网网关,因此使用了一块9531核心板,按照需求做成几块不同的底板。
2、给固件取一个名字
定一个产品型号。不要随便起一个名字。后面改起来基本上就跟重新适配一次一样。本例的产品名字是monkfish,产品的型号叫做IOT-GW100。
3、准备一个访问国外速度快的接入线路或者让自己变得非常有耐心
我自己用的是移动送的宽带,下载一次openwrt的更新文件,断断续续、反反复复。有人说了,你怎么不用电信的呢? 这话就戳人心窝子了。自古以来,”遍身罗绮者,不是养蚕人”。其实笔者也通过改过的VPN(别问我为啥改)尝试过,电信IDC机房的情况也只能说是“五十步笑百步”尔。
4、保持和硬件厂家良好的关系
我们这些玩着openwrt吃软饭的人。很多时候并不知道硬件设计、制造的细节。尤其是那些在软硬交界处的资源布局在具体的板子上如何的布局。因此,得到硬件厂家良好的技术支持是必不可少的。否则,你可能工作起来就像是大海捞针一样。
这是我选择的硬件:
二、定制过程
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管理界面(如果安装了的话)。
推荐阅读