From 82787709bd0c943e5d0d2b4fce7e8464a0de0edb Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Thu, 15 Oct 2020 10:34:30 -0400 Subject: update the hibi patcher script to handle initial m3k stuff Change-Id: I63ed8443952888da3dafb23ff6e7daf9c7aca574 --- tools/hiby_patcher.pl | 267 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 160 insertions(+), 107 deletions(-) (limited to 'tools/hiby_patcher.pl') diff --git a/tools/hiby_patcher.pl b/tools/hiby_patcher.pl index af98cfdafc..e8ade006b1 100755 --- a/tools/hiby_patcher.pl +++ b/tools/hiby_patcher.pl @@ -9,7 +9,7 @@ # # Hiby patcher Copyright (C) 2020 Solomon Peachy # -# Licensed under the GNU GPLv2 (or newer) +# Licensed under the GNU GPLv2 (or later) # ################## @@ -29,6 +29,8 @@ my $rbbname = $ARGV[2]; my $prefix = "/tmp"; # XXX mktmp my $debug = 0; # Set to 1 to prevent cleaning up work dirs +my $hiby = 1; # 1 for hibyplayer-style updates, 0 for ingenic updates + #### Let's get to work my @ubiopts; @@ -42,6 +44,7 @@ if ($model eq 'rocker') { @ubiopts = ("-e", "124KiB", "-c", "1024", "-m", "2048", "-j", "8192KiB", "-U"); } elsif ($model eq 'm3k') { @ubiopts = ("-e", "124KiB", "-c", "2048", "-m", "2048", "-j", "8192KiB", "-U"); + $hiby = 0; } else { die ("Unknown hiby model: $model\n"); } @@ -52,69 +55,88 @@ my $isowork = "$prefix/iso.$uptname"; my $rootfsdir = "$prefix/rootfs.$uptname"; my $ubiname; my $ubinamenew; - - -my @sysargs; - - -### Extract outer ISO9660 image -system("rm -Rf $isowork"); -mkdir($isowork) || die ("Can't create '$isowork'"); -@sysargs = ("7z", "x", "-aoa", "-o$isowork", $inname); -system(@sysargs); - -### figure out the rootfs image filenames my $updatename; -if ( -e "$isowork/UPDATE.TXT") { - $updatename = "$isowork/UPDATE.TXT"; -} elsif ( -e "$isowork/update.txt") { - $updatename = "$isowork/update.txt"; -} my $versionname; -if ( -e "$isowork/VERSION.TXT") { - $versionname = "$isowork/VERSION.TXT"; -} elsif ( -e "$isowork/version.txt") { - $versionname = "$isowork/version.txt"; -} -open UPDATE, $updatename || die ("Can't open update.txt!");; +my @sysargs; + +#### Extract OF image wrapper +if ($hiby) { + system("rm -Rf $isowork"); + mkdir($isowork) || die ("Can't create '$isowork'"); + @sysargs = ("7z", "x", "-aoa", "-o$isowork", $inname); + system(@sysargs); + + ### figure out the rootfs image filenames + if ( -e "$isowork/UPDATE.TXT") { + $updatename = "$isowork/UPDATE.TXT"; + } elsif ( -e "$isowork/update.txt") { + $updatename = "$isowork/update.txt"; + } + if ( -e "$isowork/VERSION.TXT") { + $versionname = "$isowork/VERSION.TXT"; + } elsif ( -e "$isowork/version.txt") { + $versionname = "$isowork/version.txt"; + } -my $rootfs_found = 0; -while () { - chomp; - if ($rootfs_found) { - if (/file_path=(.*)/) { - $ubiname = basename($1); - last; + open UPDATE, $updatename || die ("Can't open update.txt!");; + + my $rootfs_found = 0; + while () { + chomp; + if ($rootfs_found) { + if (/file_path=(.*)/) { + $ubiname = basename($1); + last; + } + } else { + if (/rootfs/) { + $rootfs_found = 1; } - } else { - if (/rootfs/) { - $rootfs_found = 1; } } -} -close UPDATE; + close UPDATE; -if (! -e "$isowork/$ubiname") { - $ubiname =~ tr/[a-z]/[A-Z]/; - die("can't locate rootfs image ($ubiname)") if (! -e "$isowork/$ubiname"); -} + if (! -e "$isowork/$ubiname") { + $ubiname =~ tr/[a-z]/[A-Z]/; + die("can't locate rootfs image ($ubiname)") if (! -e "$isowork/$ubiname"); + } + + $ubiname = "$isowork/$ubiname"; +} else { + # Deconstruct original file + # TODO. Rough sequence: + +# unzip m3k.fw +# for x in recovery-update/nand/update*zip ; do unzip -o $x ; done +# rm -Rf *zip META-INF +# parse update000/update.xml: +# system.ubi +# ubifs +# ### ## total size, bytes +# ## ## max for each one I guess [optional, 0 def] +# ## ## add up [optional, 1 def] +# +# * Track name, start block +# * when we find the first ubifs block, record name, start block #, end block # +# +# alternatively, cat update*/$name* > combined.ubi -$ubiname = "$isowork/$ubiname"; + $ubiname = "$uptname"; +} -### Extract RootFS +#### Extract RootFS system("rm -Rf $rootfsdir"); mkdir($rootfsdir) || die ("Can't create '$rootfsdir'"); @sysargs = ("ubireader_extract_files", "-k", "-o", $rootfsdir, $ubiname); system(@sysargs); -# exit(0); -### Mangle RootFS - -# Generate rb_bootloader.sh my $rbbasename = basename($rbbname); -my $bootloader_sh = + +#### Mangle RootFS +if ($hiby) { + my $bootloader_sh = "#!/bin/sh #mkdir -p /mnt/sd_0 @@ -135,21 +157,21 @@ killall -9 $rbbasename &>/dev/null sleep 1 reboot "; -open FILE, ">$rootfsdir/usr/bin/hiby_player.sh" || die ("can't write bootloader script!"); -print FILE $bootloader_sh; -close FILE; -chmod 0755, "$rootfsdir/usr/bin/hiby_player.sh"; - -# Auto mount/unmount external USB drives and SD card -open FILE, ">>$rootfsdir/etc/mdev.conf" || die ("can't access mdev conf!"); -print FILE "sd[a-z][0-9]+ 0:0 664 @ /etc/rb_inserting.sh\n"; -print FILE "mmcblk[0-9]p[0-9] 0:0 664 @ /etc/rb_inserting.sh\n"; -print FILE "mmcblk[0-9] 0:0 664 @ /etc/rb_inserting.sh\n"; -print FILE "sd[a-z] 0:0 664 \$ /etc/rb_removing.sh"; -print FILE "mmcblk[0-9] 0:0 664 \$ /etc/rb_removing.sh\n"; -close FILE; - -my $insert_sh = ' + open FILE, ">$rootfsdir/usr/bin/hiby_player.sh" || die ("can't write bootloader script!"); + print FILE $bootloader_sh; + close FILE; + chmod 0755, "$rootfsdir/usr/bin/hiby_player.sh"; + + # Auto mount/unmount external USB drives and SD card + open FILE, ">>$rootfsdir/etc/mdev.conf" || die ("can't access mdev conf!"); + print FILE "sd[a-z][0-9]+ 0:0 664 @ /etc/rb_inserting.sh\n"; + print FILE "mmcblk[0-9]p[0-9] 0:0 664 @ /etc/rb_inserting.sh\n"; + print FILE "mmcblk[0-9] 0:0 664 @ /etc/rb_inserting.sh\n"; + print FILE "sd[a-z] 0:0 664 \$ /etc/rb_removing.sh"; + print FILE "mmcblk[0-9] 0:0 664 \$ /etc/rb_removing.sh\n"; + close FILE; + + my $insert_sh = ' #!/bin/sh # $MDEV is the device @@ -169,25 +191,51 @@ fi mount $MDEV $MNT_POINT '; -open FILE, ">$rootfsdir/etc/rb_inserting.sh" || die("can't write hotplug helpers!"); -print FILE $insert_sh; -close FILE; -chmod 0755, "$rootfsdir/etc/rb_inserting.sh"; + open FILE, ">$rootfsdir/etc/rb_inserting.sh" || die("can't write hotplug helpers!"); + print FILE $insert_sh; + close FILE; + chmod 0755, "$rootfsdir/etc/rb_inserting.sh"; -my $remove_sh = ' + my $remove_sh = ' #!/bin/sh # $MDEV is the device sync; unmount -f $MDEV; '; -open FILE, ">$rootfsdir/etc/rb_removing.sh" || die("can't write hotplug helpers!"); -print FILE $remove_sh; -close FILE; -chmod 0755, "$rootfsdir/etc/rb_removing.sh"; + open FILE, ">$rootfsdir/etc/rb_removing.sh" || die("can't write hotplug helpers!"); + print FILE $remove_sh; + close FILE; + chmod 0755, "$rootfsdir/etc/rb_removing.sh"; -# Deal with a nasty race condition in automount scripts -system("perl -pni -e 's/rm -rf/#rm -Rf/;' $rootfsdir/etc/init.d/S50sys_server"); + # Deal with a nasty race condition in automount scripts + system("perl -pni -e 's/rm -rf/#rm -Rf/;' $rootfsdir/etc/init.d/S50sys_server"); +} else { + my $bootloader_sh = + "#!/bin/sh + +killall $rbbasename &>/dev/null +killall -9 $rbbasename &>/dev/null + +source /etc/profile + +# Try to save the flash +if ! [ -L /data/userfs/app.log ] ; then + rm -f /data/userfs/app.log + ln -s /dev/null /data/userfs/app.log +fi + +# Rockbox launcher! +/usr/bin/$rbbasename +sleep 1 +reboot +"; + open FILE, ">$rootfsdir/usr/project/bin/play.sh" || die ("can't write bootloader script!"); + print FILE $bootloader_sh; + close FILE; + chmod 0755, "$rootfsdir/usr/project/bin/play.sh"; + +} # Copy bootloader over @sysargs=("cp", "$rbbname", "$rootfsdir/usr/bin/$rbbasename"); @@ -201,49 +249,54 @@ system(@sysargs); system("rm -Rf $rootfsdir") if (!$debug); -# md5sum -my $md5 = `md5sum $ubinamenew | cut -d ' ' -f 1`; +if ($hiby) { + # md5sum + my $md5 = `md5sum $ubinamenew | cut -d ' ' -f 1`; -system("mv $ubinamenew $ubiname"); + system("mv $ubinamenew $ubiname"); -### Generate new ISO9660 update image + ### Generate new ISO9660 update image -# Correct md5sum for new rootfs image -open UPDATE, "<$updatename" || die ("Can't open update.txt!"); -open UPDATEO, ">$updatename.new" || die ("Can't open update.txt!"); + # Correct md5sum for new rootfs image + open UPDATE, "<$updatename" || die ("Can't open update.txt!"); + open UPDATEO, ">$updatename.new" || die ("Can't open update.txt!"); -$rootfs_found = 0; -while () { - if ($rootfs_found) { - if (s/md5=.*/md5=$md5/) { - $rootfs_found=0; - } - } else { - if (/rootfs/) { - $rootfs_found = 1; + my $rootfs_found = 0; + while () { + if ($rootfs_found) { + if (s/md5=.*/md5=$md5/) { + $rootfs_found=0; + } + } else { + if (/rootfs/) { + $rootfs_found = 1; + } } + print UPDATEO; } - print UPDATEO; -} -close UPDATE; -close UPDATEO; -system("mv $updatename.new $updatename"); + close UPDATE; + close UPDATEO; + system("mv $updatename.new $updatename"); -# Fix up version text, if needed (AGPTek Rocker 1.31 beta) + # Fix up version text, if needed (AGPTek Rocker 1.31 beta) -open UPDATE, "<$versionname" || die ("Can't open version.txt!");; -open UPDATEO, ">$versionname.new" || die ("Can't open version.txt!"); + open UPDATE, "<$versionname" || die ("Can't open version.txt!");; + open UPDATEO, ">$versionname.new" || die ("Can't open version.txt!"); -while () { - s/ver=1\.0\.0\.0/ver=2018-10-07T00:00:00+08:00/; - print UPDATEO; -} + while () { + s/ver=1\.0\.0\.0/ver=2018-10-07T00:00:00+08:00/; + print UPDATEO; + } -close UPDATE; -close UPDATEO; -system("mv $versionname.new $versionname"); + close UPDATE; + close UPDATEO; + system("mv $versionname.new $versionname"); -@sysargs = ("mkisofs", "-volid", "CDROM", "-o", $uptnamenew, $isowork); -system(@sysargs); + @sysargs = ("mkisofs", "-volid", "CDROM", "-o", $uptnamenew, $isowork); + system(@sysargs); -system("rm -Rf $isowork") if (!$debug); + system("rm -Rf $isowork") if (!$debug); +} else { + # Reconstruct fiio/ingenic firmware update image + # very TODO +} -- cgit v1.2.3