本文来源http://blog.csdn.net/gt945/article/details/12710381
新固件下载
由于网件的bootloader是经过定制的,固件打包方式也不同,因此我一直以为openwrt直接编译出的固件不能直接刷在路由器上。后来有一次我无意中打开了openwrt生成的
openwrt-ar71xx-generic-wnr2200-squashfs-factory.img文件,发现里面的结构和官方的一模一样,可见openwrt按照网件官方固件的打包方式进行了打包,编译出来的固件可以直接刷入使用。
接下来我便深入了解了openwrt是如何针对网件进行打包固件的。其实其打包过程与我之前发的一个脚本相似,但是有一些不一样的地方。
一、分区拼接不一样,他在kernel分区后面紧跟着rootfs分区。
二、linux内核经过了patch,将bootargs固化进去,这样bootloader中的bootargs就不会影响内核启动,并且刷固件的时候也无需再修改bootargs。
问题二解决了我之前遇到的问题——刷固件必须修改bootargs
问题一却造成编译的固件无法正常启动,在openwrt官方的wnr2200配置中,mtdparts无法区分kernel和rootfs分区,在启动的时候造成无法mount rootfs。
经过修改,解决了问题,附个patch
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c
index bf7f9ee..40c8b3a 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c
@@ -23,6 +23,9 @@
#include "dev-usb.h"
#include "machtypes.h"
+#define WNR2200_GPIO_USB_5V 4
+#define WNR2200_GPIO_LED_WLAN 0
+
#define WNR2200_GPIO_LED_LAN2_AMBER 0
#define WNR2200_GPIO_LED_LAN4_AMBER 1
#define WNR2200_GPIO_LED_WPS 5
@@ -122,14 +125,13 @@ static void __init wnr2200_setup(void)
ath79_register_m25p80(NULL);
ap91_pci_init(art + WNR2200_PCIE_CALDATA_OFFSET, NULL);
-
+ ap9x_pci_setup_wmac_led_pin(0, WNR2200_GPIO_LED_WLAN);
+
ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr2200_leds_gpio),
wnr2200_leds_gpio);
/* enable power for the USB port */
- gpio_request_one(WNR2200_GPIO_USB_POWER,
- GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
- "USB power");
+ ap9x_pci_setup_wmac_gpio(0, BIT(WNR2200_GPIO_USB_5V), BIT(WNR2200_GPIO_USB_5V));
ath79_register_usb();
}
diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile
index 1b276c5..3c06db5 100644
--- a/target/linux/ar71xx/image/Makefile
+++ b/target/linux/ar71xx/image/Makefile
@@ -194,7 +194,7 @@ uap_pro_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,1536k(kernel)
ubdev_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,7488k(firmware),64k(certs),256k(cfg)ro,64k(EEPROM)ro
whrhpg300n_mtdlayout=mtdparts=spi0.0:248k(u-boot)ro,8k(u-boot-env)ro,3712k(firmware),64k(art)ro
wndap360_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,1728k(kernel),6016k(rootfs),64k(nvram)ro,64k(art)ro,7744k@0x50000(firmware)
-wnr2200_mtdlayout=mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,7680k(firmware),64k(art)ro
+wnr2200_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,14784k(firmware),64k(config),1024k(language_table),64k(pot),64k(traffic_meter),64k(art)ro,1536k@0x050000(kernel),13248k@0x1d0000(rootfs)
wnr2000v3_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,3712k(firmware),64k(art)ro
wndr3700_mtdlayout=mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,7680k(firmware),64k(art)ro
wndr3700v2_mtdlayout=mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,15872k(firmware),64k(art)ro
@@ -687,7 +687,7 @@ endef
define Image/Build/Netgear
$(eval fwsize=$(call mtdpartsize,firmware,$(4)))
- $(call CatFiles,$(KDIR_TMP)/vmlinux-$(2).uImage.squashfs,0,$(KDIR)/root.$(1),$(fwsize),$(call sysupname,$(1),$(2)),64)
+ $(call CatFiles,$(KDIR_TMP)/vmlinux-$(2).uImage.squashfs,1572864,$(KDIR)/root.$(1),$(fwsize),$(call sysupname,$(1),$(2)),64)
if [ -e $(call sysupname,$(1),$(2)) ]; then \
for r in $(7) ; do \
[ -n "$$$$r" ] && dashr="-$$$$r" || dashr= ; \
关于mach-wnr2200.c这个文件,在官方支持之前,是用的我自己写的,在官方支持之后,主要以修改该文件为主。
与此同时,openwrt的研究工作将告一段落,非常遗憾的一件事就是wnr2200的patch没有及时发出去,当时候都存草稿箱了。。。不然哥也留名到openwrt中了。
接下来我将转战Nuttx