Monday, October 17, 2011

OpenWRT buildroot玩法 (Upgrade code via httpd)

Ref: http://sns.linuxpk.com/blog-25219-8731.html

openwrt 包结构
如果要修改文件系统中的etc/rc.d/rcS文件, 那么要按照一下步骤进行

最终的文件系统位置:
build_mips/root/etc/rc.d/rcS

实际的修改位置
/package/base-files/default/etc/rc.d/rcS

修改后重新编译前要把下面的目录删除
rm -fr build_mips/linux-2.6-ar91xx/base-files

重新编译:
make

重新配置kernel并编译
修改kernel的配置文件,位于:
ap81-openwrt/target/linux/ar91xx-2.6/config

然后将下面的目录删除
rm build_mips/linux-2.6-ar91xx/ -fr
重新编译

固件升级方法:
cat /home/user/ap81-openwrt/bin/uImage /home/user/ap81-openwrt/bin/pad.img | head -c 2031616 > /home/user/ap81-openwrt/bin/linux.pad
cat /home/user/ap81-openwrt/bin/info.pad /home/user/ap81-openwrt/bin/linux.pad /home/user/ap81-openwrt/bin/root.burn > /home/user/ap81-openwrt/bin/WN802Tv2-no-crc.img
/home/user/ap81-openwrt/staging_dir_mips/../tools/appendsum /home/river/ap81-openwrt/bin/WN802Tv2-no-crc.img /home/user/ap81-openwrt/bin/WN802Tv2-V1.0.1_1.0.3"".img

firmware.img结构
============
-------------------
device:
version: 128byte
region:
-------------------
kernel(uboot format)
pad
--------------------
rootfs
pad
checksum


/ # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00400000 00010000 "rootfs"
mtd3: 00010000 00010000 "user-config"
mtd4: 001f0000 00010000 "uImage"
mtd5: 001b0000 00010000 "ART"

在升级前uhttp中的函数会先检查升级文件的合法性,首先检查checksum 然后检查device标志:
device标志在include/image.mk中的MODULE_NAME中定义。
升级函数采用mtd的方法把一个含有kernel和rootfs的文件写到对应的mtd块中
#define UPG_IMAGE_OFFSET 128
lseek(img_fd, UPG_IMAGE_OFFSET, SEEK_CUR);
sleep(5); /* wait for some seconds ... */
mtd_write(img_fd, len, UPG_MTD_LINUX);
mtd_write(img_fd, len, UPG_MTD_ROOTFS);
首先去掉头部信息。
然后将kernel写到/dev/mtd/4中,这块的大小是1f0000,故制作img的时候要pad head -c 2031616
这样的话kernel写完后 文件指针就指向rootfs的首地址,这样就能保证升级成功。
checksum采用perl脚本appendsum填在最后一个字节

No comments:

Post a Comment