flash just some files from update
[android-command-line.git] / rockchip-flash-helper.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use Getopt::Long;
6
7 my @files = @ARGV;
8 my $mode = lc(shift @files) || die "usage: $0 (backup|restore|update|flash /path/to/file.img)\n";
9
10 my $cmdline = <DATA>;
11 my $rkflashtool = '/virtual/android/android-command-line/rkflashtool/rkflashtool';
12
13 die "rkflashtool not found: $!" unless -x $rkflashtool;
14
15 $cmdline =~ s/^.*mtdparts=\w+:([^\s]+)\s.*$/$1/;
16 warn $cmdline;
17
18 foreach ( split(/,/,$cmdline) ) {
19         print "$_\n";
20         my ($size,$start,$name) = split(/[\@\(\)]/, $_, 4);
21
22         my $cmd;
23
24         my $backup_file = "$start-$size-$name";
25
26         if ( $mode eq 'backup' ) {
27
28                 $cmd = "$rkflashtool r $start $size > $backup_file";
29
30         } elsif ( $mode eq 'restore' ) {
31
32                 if ( -e $backup_file && -s $backup_file ) {
33                         $cmd = "$rkflashtool w $start $size < $backup_file";
34                 } else {
35                         warn "SKIP $backup_file restore: $!\n";
36                         next;
37                 }
38
39         } elsif ( $mode eq 'update' ) {
40
41                 if ( -e "$name.img" ) {
42                         $cmd = "$rkflashtool w $start $size < $name.img";
43                 } else {
44                         warn "SKIP $start $size $name - not found in update\n";
45                         next;
46                 }
47
48         } elsif ( $mode eq 'flash' ) {
49
50                 foreach my $file ( @files ) {
51                         if (  $file =~ m/$name/ && -e $file ) {
52                                 $cmd = "$rkflashtool w $start $size < $file";
53                         } else {
54                                 next;
55                         }
56                 }
57
58                 next if ! $cmd;
59
60         } else {
61                 die "unknown mode $mode\n";
62         }
63
64         warn "# $cmd\n";
65         system($cmd) == 0 || die $!;
66 }
67
68 if ( $mode eq 'update' || $mode eq 'restore' ) {
69         warn "# reboot Android\n";
70         system("$rkflashtool b");
71 }
72
73 __DATA__
74 console=ttyFIQ0 androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00200000 mtdparts=rk29xxnand:0x00002000@0x00002000(misc),0x00004000@0x00004000(kernel),0x00008000@0x00008000(boot),0x00008000@0x00010000(recovery),0x000C0000@0x00018000(backup),0x00040000@0x000D8000(cache),0x00300000@0x00118000(userdata),0x00002000@0x00418000(kpanic),0x00100000@0x0041A000(system),-@0x0053A000(user) bootver=2012-08-08#1.14 firmware_ver=4.0.4