2013年12月12日木曜日

メモ C1605 boot.img を作る

スポンサーリンク

------------------------------------------

環境
ubuntuで作成
必要なファイル群は色々

xdaのこちらを参考にCWMとTWRP入りのものを作成。

1.boot.imgを探す
端末とPCをつないで
  
adb shell
cat /proc/partitions
major minor  #blocks  name

179        0    3817472 mmcblk0
179        1       1024 mmcblk0p1
179        2       2048 mmcblk0p2
179        3      20480 mmcblk0p3   ←boot.imgこれ
179        4          1 mmcblk0p4
179        5      30720 mmcblk0p5
179        6       8192 mmcblk0p6
179        7       5120 mmcblk0p7
179        8       8192 mmcblk0p8
179        9       8192 mmcblk0p9
179       10      16384 mmcblk0p10     ←lta-label
179       11     665600 mmcblk0p11    ←system
179       12     163840 mmcblk0p12   ←cache
179       13       3072 mmcblk0p13
179       14       3072 mmcblk0p14
179       15       3072 mmcblk0p15
179       16     768000 mmcblk0p16     ←data
179       17    2103296 mmcblk0p17
179       32    7875584 mmcblk1
179       33    7871488 mmcblk1p1     ←ext_card

XDAの公開されていたxperia_e_jb_cwm.elfをばらし、ramdisk/sbin/etc/recovery.fstabの中にmount point下のように示してあったので、boot.imgはmmcblk0p3で間違いなし
# mount point fstypedevice [device2]   fstype2

/boot emmc/dev/block/mmcblk0p3
/system ext4/dev/block/mmcblk0p11
/cache ext4/dev/block/mmcblk0p12
/data ext4/dev/block/mmcblk0p16
/sdcard vfat/dev/block/mmcblk0p17
/external_sd vfat/dev/block/mmcblk1p1/dev/block/mmcblk1

2.boot.imgをSDカードに抜き取り、SDcardのboot.imgをPCに保存する

# adb shell
$ su
# dd if=/dev/block/mmcblk0p3 of=/sdcard/sony_boot.img
 
# adb pull /sdcard/sony_boot.img
保存場所は作業ディレクトリをつくるなど

3.boot.imgを解体

$ hexdump -C sony_boot.img > dump
$ head dump
00000000  7f 45 4c 36 01 01 01 61  00 00 00 00 00 00 00 00  |.ELF...a........|
00000010  02 00 28 00 01 00 00 00  00 80 20 00 34 00 00 00  |..(....... .4...|
00000020  00 00 00 00 00 00 00 00  34 00 20 00 04 00 00 00  |........4. .....|
00000030  00 00 00 00 01 00 00 00  00 10 00 00 00 80 20 00  |.............. .|  <== Byte 9/10/11: is   kernel start (after 4k sin header)
00000040  00 80 20 00 28 88 40 00  28 88 40 00 00 00 00 00  |.. .(.@.(.@.....|  <== Byte   9/10/11: is kernel length
00000050  00 00 00 00 01 00 00 00  28 98 40 00 00 00 50 01  |........(.@...P.|  <== Byte 9/10/11: is ramdisk start
00000060  00 00 50 01 b1 73 18 00  b1 73 18 00 00 00 00 80  |..P..s...s......|  <== Byte 9/10/11: is ramdisk length
00000070  00 00 00 00 04 00 00 00 d9 0b 59 00 00 00 00 00  |..........Y.....|  <== Byte 9/10/11: is cmdline start
00000080  00 00 00 00 95 00 00 00  95 00 00 00 00 00 00 20  |............... |  <== Byte 9/10/11: is cmdline length (512 characters)
00000090  00 00 00 00 53 49 4e 21  b4 00 00 00 00 00 00 00  |....SIN!........|

上とXDAの触れ書き(下)を参考にして(同機種であっても各端末によって違うらしいので面倒だがメモなりする)sony_kernel.imgsony_ramdisk.img.gzsony_cmdline.imgにunpackする。
00 10 00 => is 0x001000
68 70 3c => is 0x3c7068

68 80 3c => is 0x3c8068
c6 1b 15 => is 0x151bc6

2e 9c 51 => is 0x519c2e
00 02 00 => is 0x000200
↑のようにするらしいので
$ dd skip=$((0x001000)) count=$((0x408828)) bs=1 if=sony_boot.img of=sony_kernel.img
4229160+0 記録始め
4229160+0 記録終わり
4229160 バイト (4.2 MB) コピー終了, 19.6939 s, 215 kB/s

$ dd skip=$((0x409828)) count=$((0x1873b1)) bs=1 if=sony_boot.img of=sony_ramdisk.img.gz
1602481+0 記録始め
1602481+0 記録終わり
1602481 バイト (1.6 MB) コピー終了, 32.3733 s, 49.5 kB/s

$ dd skip=$((0x590bd9)) count=$((0x000095)) bs=1 if=sony_boot.img of=sony_cmdline.img
149+0 記録始め
149+0 記録終わり
149 バイト (149 B) コピー終了, 0.000796749 s, 187 kB/s

$ hexdump -C sony_ramdisk.img.gz | head
$ gunzip sony_ramdisk.img.gz
$ mkdir ramdisk
$ cd ramdisk/
/ramdisk$ cpio -i < ../sony_ramdisk.img
4586 blocks
でramdiskが出来る

  ↑ramdiskの中身(画像左のramdisk-twrpがmountしているのは間違いですね,,,)


4.ramdisk.cpioを作る

どこかホームなどにramdiskをコピペして
$ find | cpio -o -H newc > ../ramdisk.cpio
4586 blocks
ramdisk.cpioができあがる(後で使う)

5.XDAのdualboot.imgをunpackする

XDAにあったdualrecoveryカーネルをdualboot.imgをunpackしTWRPとCWM入りのramdiskをお借りする。
unpackはsplit_bootimgを使用?忘れた
unpckboot.imgで検索すればでてくる

unpck後
ramdisk内は
・sbin
・init
・sonylogo.rle
だけ

さらにsbin内に
・bootrec-device
・busybox
・init.sh ←これを覗いてみると感心する
・ramdisk.cpio(FW11.3.A.2.1)
・ramdisk.cwm.cpio
・ramdisk.twrp.cpio
↓のような状態

で、ここramdisk/sbin/に4.で作ったramdisk.cpioを上書き保存し
3.で作ったsony_kernel.imgがあるディレクトリにramdiskを保存、全て置き換える

6.boot.imgをrepack

ramdisk.img.gzを作る
$ cd ramdisk
/ramdisk$ find . | cpio --quiet -H newc -o | gzip > ../my_ramdisk.img.gz

boot.imgを作る(mkelf.pyが必要)
$ python mkelf.py -o my_boot.img sony_kernel.img@0x00208000 my_ramdisk.img.gz@0x01500000,ramdisk sony_cmdline.img@0x0,cmdline
python: can't open file 'mkelf.py': [Errno 2] No such file or directory

とmkelf.pyに実行権限を与え忘れて怒られる

$ python mkelf.py -o my_boot.img sony_kernel.img@0x00208000 my_ramdisk.img.gz@0x01500000,ramdisk sony_cmdline.img@0x0,cmdline

my_boot.imgできあがり

7.boot.imgをflash


fastboot flash boot ./my_boot.img

sending 'boot' (11672 KB)...
(bootloader) USB download speed was 5149kB/s
OKAY [  2.361s]
writing 'boot'...
(bootloader) Flash of partition 'boot' requested
(bootloader) S1 partID 0x00000003, block 0x00002000-0x0000bfff
(bootloader) Erase operation complete, 0 bad blocks encountered
(bootloader) Flashing...
(bootloader) Flash operation complete
OKAY [  1.273s]
finished. total time: 3.634s


無事起動できればOK?

XDAのhsr0さんpurplemazeさんに感謝いたします。
あれやこれやと仮定してから作っているので誤っている部分があるかもしれません、ご指摘いただけたら幸いで御座います。

このやり方で間違いないのであれば、OS4.3なり、4.4のアップデートがきてもSONYのソース公開を待たずしてTWRPやCWMがポート出来るのかも

Related Posts Plugin for WordPress, Blogger...

スポンサーリンク

------------------------------------------

0 件のコメント :

コメントを投稿