From 33c7810e416e243c63fa02f99e4f75fff39bdf65 Mon Sep 17 00:00:00 2001 From: xiaolu Date: Thu, 5 Sep 2013 22:28:47 +0800 Subject: [PATCH] first commit --- README.md | 39 +++++++++++++- mkboot | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++ mkbootimg | Bin 0 -> 33282 bytes mkbootimg_dtb | Bin 0 -> 34831 bytes 4 files changed, 183 insertions(+), 1 deletion(-) create mode 100755 mkboot create mode 100755 mkbootimg create mode 100755 mkbootimg_dtb diff --git a/README.md b/README.md index 8dfe626..078f758 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,41 @@ mkbootimg_tools =============== -Unpack and repack boot.img,support dtb (qcdt). +Unpack and repack boot.img,support dtb(qcdt dt.img). + +xiaolu@xiaolu-ubuntu64:~/e330s$ mkboot recoveryksuamg5.img tmp +Unpack & decompress recoveryksuamg5.img to tmp + kernel : /home/xiaolu/work/initramfs/s4/e330s/tmp/zImage + ramdisk : /home/xiaolu/work/initramfs/s4/e330s/tmp/ramdisk.gz + page_size : 2048 + base_addr : 0x00000000 + kernel size : 6911360 + kernel_addr : 0x00008000 + ramdisk_size : 2685222 + ramdisk_addr : 0x02000000 + second_size : 0 + second_addr : 0x00f00000 + dtb_size : 1427456 + tags_addr : 0x01e00000 + cmdline : console=null androidboot.hardware=qcom user_debug=31 maxcpus=2 msm_rtb.filter=0x3F +Unpack completed. + +xiaolu@xiaolu-ubuntu64:~/e330s$ mkboot recoveryksuamg5.img ksuamg5/ramdisk recovery.img +Repack recoveryksuamg5.img & ramdisk ksuamg5/ramdisk to recovery.img + kernel : /tmp/mkboot.WdWc/zImage + ramdisk : /tmp/mkboot.WdWc/ramdisk.gz + page_size : 2048 + base_addr : 0x00000000 + kernel size : 6911360 + kernel_addr : 0x00008000 + ramdisk_size : 2685222 + ramdisk_addr : 0x02000000 + second_size : 0 + second_addr : 0x00f00000 + dtb_size : 1427456 + tags_addr : 0x01e00000 + cmdline : console=null androidboot.hardware=qcom user_debug=31 maxcpus=2 msm_rtb.filter=0x3F +Kernel size: 6911360, new ramdisk size: 3426199, recovery.img: 11767808. +recovery.img has been created. +cleanup.... + diff --git a/mkboot b/mkboot new file mode 100755 index 0000000..3464985 --- /dev/null +++ b/mkboot @@ -0,0 +1,145 @@ +#!/bin/bash + +#boot.img tools +trap "clean" 2 3 4 +workdir=$(pwd) +mkbootimg_dtb=./mkbootimg_dtb +mkbootimg=./mkbootimg + +C_H1="\033[1;32m" +C_CLEAR="\033[0;0m" + +pout() { + printf "${C_H1}${*}${C_CLEAR}\n" +} + +clean() +{ + rm -rf /tmp/mkboot.* + pout "cleanup...." + exit +} +if [ $# -lt 2 ] || [ ! -f $1 ] || ([ ! -z $3 ] && [ ! -e $2 ]); then + pout "Not enough parameters or parameter error!\n" + pout "repack boot.img:\n\t$(basename $0) [img] [ramdisk.gz or ramdisk dir] [newbootfile]" + pout "\t$(basename $0) boot.img ramdisk newboot.img" + pout "unpack boot.img & decompress ramdisk:\n\t$(basename $0) [img] [output dir]" + pout "\t$(basename $0) boot.img boot20130905" + clean +fi +#If only two parameters, unpack boot.img. +if [ -z $3 ]; then + tempdir="$(readlink -f $2)" + rm -rf $tempdir + mkdir -p $tempdir + pout "Unpack & decompress $1 to $2" +else + tempdir=$(mktemp -d /tmp/mkboot.XXXX) + pout "Repack $1 & ramdisk $2 to $3" +fi + + +cp -f $1 $tempdir/ +cd $tempdir +bootimg=$(basename $1) +offset=$(grep -abo ANDROID! $bootimg | cut -f 1 -d :) +[ -z $offset ] && clean +if [ $offset -gt 0 ]; then + dd if=$bootimg of=bootimg bs=$offset skip=1 2>/dev/null + bootimg=bootimg +fi +kernel_size=$(od -A n -D -j 8 -N 4 $bootimg | sed 's/ //g') +kernel_addr=0x$(od -A n -H -j 12 -N 4 $bootimg | sed 's/ //g') +base_addr=0x$(od -A n -h -j 14 -N 2 $bootimg | sed 's/ //g')0000 +ramdisk_size=$(od -A n -D -j 16 -N 4 $bootimg | sed 's/ //g') +ramdisk_addr=0x$(od -A n -H -j 20 -N 4 $bootimg | sed 's/ //g') +second_size=$(od -A n -D -j 24 -N 4 $bootimg | sed 's/ //g') +second_addr=0x$(od -A n -H -j 28 -N 4 $bootimg | sed 's/ //g') +tags_addr=0x$(od -A n -H -j 32 -N 4 $bootimg | sed 's/ //g') +page_size=$(od -A n -D -j 36 -N 4 $bootimg | sed 's/ //g') +dtb_size=$(od -A n -D -j 40 -N 4 $bootimg | sed 's/ //g') +#dtb_addr=0x$(od -A n -H -j 44 -N 4 $bootimg | sed 's/ //g') +cmd_line=$(od -A n --strings -j 64 -N 512 $bootimg) + +k_count=$(((kernel_size+page_size-1)/page_size)) +r_count=$(((ramdisk_size+page_size-1)/page_size)) +s_count=$(((second_size+page_size-1)/page_size)) +d_count=$(((dtb_size+page_size-1)/page_size)) +#k_offset=$page_size +#r_offset=$((k_offset+(n*page_size))) +#s_offset=$((r_offset+(m*page_size))) +#d_offset=$((s_offset+(o*page_size))) +k_offset=1 +r_offset=$((k_offset+k_count)) +s_offset=$((r_offset+r_count)) +d_offset=$((s_offset+s_count)) + +dd if=$bootimg of=zImage_tmp bs=$page_size skip=$k_offset count=$k_count 2>/dev/null +dd if=zImage_tmp of=zImage bs=$kernel_size count=1 2>/dev/null +if [ -z $3 ]; then + dd if=$bootimg of=ramdisk_tmp bs=$page_size skip=$r_offset count=$r_count 2>/dev/null + dd if=ramdisk_tmp of=ramdisk.gz bs=$ramdisk_size count=1 2>/dev/null +fi +if [ $dtb_size -gt 0 ]; then + dd if=$bootimg of=dt.img_tmp bs=$page_size skip=$d_offset count=$d_count 2>/dev/null + dd if=dt.img_tmp of=dt.img bs=$dtb_size count=1 2>/dev/null + dt="$tempdir/dt.img" +fi +rm -f *_tmp $(basename $1) $bootimg + +kernel="$tempdir/zImage" +ramdisk=$tempdir/ramdisk.gz +[ ! -f $kernel ] && clean +#print boot.img info +pout " kernel : $kernel" +pout " ramdisk : $ramdisk" +pout " page_size : $page_size" +pout " base_addr : $base_addr" +pout " kernel size : $kernel_size" +pout " kernel_addr : $kernel_addr" +pout " ramdisk_size : $ramdisk_size" +pout " ramdisk_addr : $ramdisk_addr" +pout " second_size : $second_size" +pout " second_addr : $second_addr" +if [ $dtb_size -gt 0 ]; then + pout " dtb_size : $dtb_size" + pout " tags_addr : $tags_addr" +fi +pout " cmdline : $cmd_line" + +#decompression ramdisk.gz +if [ -z $3 ]; then + mkdir ramdisk + cd ramdisk + gzip -d -c ../ramdisk.gz | cpio -i -d -m --no-absolute-filenames 2>/dev/null + #Unpack Finish to exit. + pout "Unpack completed." + exit +fi +cd $workdir +ramdisk=$2 +#if ramdisk is a directory,create ramdisk.gz +if [ -d $2 ]; then + cd $2 + find . | cpio -R 0:0 -H newc -o 2>/dev/null | gzip > $tempdir/ramdisk.gz + ramdisksize=$(stat -c "%s" $tempdir/ramdisk.gz) + ramdisk="$tempdir/ramdisk.gz" + cd $workdir +fi +rm -f $3 + +if [ $dtb_size -gt 0 ]; then + $mkbootimg_dtb --kernel $kernel --ramdisk $ramdisk \ + --base $base_addr --offset $ramdisk_addr \ + --tags-addr $tags_addr --cmdline "$cmd_line" --dt $dt -o $3 +else + $mkbootimg --kernel $kernel --ramdisk $ramdisk \ + --base $base_addr --ramdiskaddr $ramdisk_addr \ + --cmdline "$cmd_line" -o $3 +fi +ramdisksize=$(stat -c "%s" $ramdisk) +bootsize=$(stat -c "%s" $3) +pout "Kernel size: $kernel_size, new ramdisk size: $ramdisksize, $(basename $3): $bootsize." +pout "$(basename $3) has been created." +clean + diff --git a/mkbootimg b/mkbootimg new file mode 100755 index 0000000000000000000000000000000000000000..2d77c5a792895e130b7b17731878cf93772b69f8 GIT binary patch literal 33282 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 YnfY4t*W#l^pz{b%#E;2G*_q1!0So|#EdT%j literal 0 HcmV?d00001 diff --git a/mkbootimg_dtb b/mkbootimg_dtb new file mode 100755 index 0000000000000000000000000000000000000000..37b92a32f3a001237482f38e9554128608b4435b GIT binary patch literal 34831 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