网件WNR2200 Openwrt固件, 改进刷机方法

来源:互联网 发布:大数据视频教程51CTO 编辑:程序博客网 时间:2024/06/09 23:21

本文来源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.cindex 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_5V4+#define WNR2200_GPIO_LED_WLAN0+ #define WNR2200_GPIO_LED_LAN2_AMBER0 #define WNR2200_GPIO_LED_LAN4_AMBER1 #define WNR2200_GPIO_LED_WPS5@@ -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/Makefileindex 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= ; \

define Image/Build/Netgear那块修改的不好,粗鲁了一点,直接指定kernel分区大小为1572864,应该有更好的方法,没时间去找了

关于mach-wnr2200.c这个文件,在官方支持之前,是用的我自己写的,在官方支持之后,主要以修改该文件为主。

与此同时,openwrt的研究工作将告一段落,非常遗憾的一件事就是wnr2200的patch没有及时发出去,当时候都存草稿箱了。。。不然哥也留名到openwrt中了。

接下来我将转战Nuttx


原创粉丝点击