兼容WNR2200原版uboot的镜像打包

本文来源http://blog.csdn.net/gt945/article/details/12209105

由于openwrt编译出来的文件默认为通用格式的uImage,squashfs根文件系统是lzma压缩过的,这样的镜像烧到机器上是启动不起来的,Magic Number和Checksum无法通过。

解决方案有二:

1.修改uboot,使其支持openwrt的默认格式。

2.将镜像和根文件系统按照wnr2200的方式打包。

由于没有编程器,uboot刷坏了就砖了,而且修改uboot之后想要再换回官方固件非常麻烦,因此我采取的是方案2。


官方uboot在启动的时候,先检验flash中0x50000处的Magic Number,然后对整个分区进行校验。 0x50000处对应的其实是一个squashfs文件系统,当校验正确之后,就会通过fsload命令加载内核并启动。

我们要做的就是依葫芦画瓢,生成一个合法的分区即可,我将0x50000指定为kernel分区,大小为1.5M,能放下大部分内核了。kernel分区是一个squashfs文件系统,里面只放一个uImage,方便起见,弄了一个脚本。要注意,${BASE_DIR}/bin/目录下的程序一定要官方代码中生成的。

#!/bin/bash
BASE_DIR=${PWD}
OPENWRT_BIN=/home/tao/workspace/OpenWRT/openwrt/bin/ar71xx/
IMAGE_NAME="WNR2200 Openwrt"
MAX_IMAGE_SIZE=6750208
MKIMAGE=${BASE_DIR}/bin/mkimage
MKSQUASHFS=${BASE_DIR}/bin/mksquashfs-lzma
CHECKSIZE=${BASE_DIR}/bin/checksize
APPENDSUM=${BASE_DIR}/bin/appendsum

rm -rf ${BASE_DIR}/output
mkdir ${BASE_DIR}/output/root/image -p
cp ${OPENWRT_BIN}/openwrt-ar71xx-generic-root.squashfs ${BASE_DIR}/output/root.fs
${MKIMAGE}  -A mips -O linux -T kernel -a 80060000 -e 80060000 -C lzma -d ${OPENWRT_BIN}/openwrt-ar71xx-generic-vmlinux.lzma ${BASE_DIR}/output/root/image/uImage
${MKIMAGE}  -A mips -O linux -T kernel -a 80060000 -e 80060000 -C lzma -d ${OPENWRT_BIN}/openwrt-ar71xx-generic-vmlinux-initramfs.lzma ${BASE_DIR}/output/uImage-initramfs
${MKSQUASHFS} ${BASE_DIR}/output/root ${BASE_DIR}/output/root.squashfs -nopad -noappend -root-owned -be
dd if=${BASE_DIR}/output/root.squashfs of=${BASE_DIR}/output/tmpfile.1 bs=64k conv=sync
echo -ne '\xde\xad\xc0\xde' >> ${BASE_DIR}/output/tmpfile.1
dd of=${BASE_DIR}/output/root.squashfs if=${BASE_DIR}/output/tmpfile.1 bs=64k conv=sync
echo -ne '\xde\xad\xc0\xde' >> ${BASE_DIR}/output/root.squashfs
rm ${BASE_DIR}/output/tmpfile.1
${MKIMAGE} -A mips -O linux -T filesystem -C none -a 0x9f050000 -e 0x9f050000 -name "${IMAGE_NAME}"  -d ${BASE_DIR}/output/root.squashfs ${BASE_DIR}/output/image.pad
${CHECKSIZE} ${BASE_DIR}/output/image.pad ${MAX_IMAGE_SIZE}
${APPENDSUM} ${BASE_DIR}/output/image.pad ${BASE_DIR}/output/image.img
rm ${BASE_DIR}/output/image.pad

注意修改OPENWRT_BIN变量。

执行脚本之后会生成image.img,将该文件刷到0x50000,uboot就能正确验证,并加载内核。


为了兼容wnr2200, uImage的打包也不同,见脚本中的

${MKIMAGE}  -A mips -O linux -T kernel -a 80060000 -e 80060000 -C lzma -d ${OPENWRT_BIN}/openwrt-ar71xx-generic-vmlinux.lzma ${BASE_DIR}/output/root/image/uImage
做完以上工作,openwrt就能在wnr2200上正确启动了,剩下的就和常规openwrt一样了。


你可能感兴趣的:(openwrt,WNR2200)