Ref: http://sns.linuxpk.com/blog-25219-8731.html
openwrt 包结构
如果要修改文件系统中的etc/rc.d/rcS文件, 那么要按照一下步骤进行
如果要修改文件系统中的etc/rc.d/rcS文件, 那么要按照一下步骤进行
最终的文件系统位置:
build_mips/root/etc/rc.d/rcS
build_mips/root/etc/rc.d/rcS
实际的修改位置
/package/base-files/default/etc/rc.d/rcS
/package/base-files/default/etc/rc.d/rcS
修改后重新编译前要把下面的目录删除
rm -fr build_mips/linux-2.6-ar91xx/base-files
rm -fr build_mips/linux-2.6-ar91xx/base-files
重新编译:
make
make
重新配置kernel并编译
修改kernel的配置文件,位于:
ap81-openwrt/target/linux/ar91xx-2.6/config
修改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"
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);
#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的首地址,这样就能保证升级成功。
然后将kernel写到/dev/mtd/4中,这块的大小是1f0000,故制作img的时候要pad head -c 2031616
这样的话kernel写完后 文件指针就指向rootfs的首地址,这样就能保证升级成功。
checksum采用perl脚本appendsum填在最后一个字节
No comments:
Post a Comment