freemyipod r228 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r227‎ | r228 | r229 >
Date:01:31, 26 October 2010
Author:theseven
Status:new
Tags:
Comment:
embios.py: Add high-level wrappers for iPod Nano 2G NAND dumping and wiping
Modified paths:
  • /embios/trunk/tools/embios.py (modified) (history)

Diff [purge]

Index: embios/trunk/tools/embios.py
@@ -697,7 +697,7 @@
698698 doecc = int(doecc)
699699 checkempty = int(checkempty)
700700 self.logger.info("Reading "+self._hex(count)+" NAND pages starting at "+self._hex(start)+" to "+self._hex(addr)+"...")
701 - self.embios.lib.dev.timeout = 20000
 701+ self.embios.lib.dev.timeout = 30000
702702 self.embios.ipodnano2g_nandread(addr, start, count, doecc, checkempty)
703703 self.logger.info("done\n")
704704
@@ -712,7 +712,7 @@
713713 count = self._hexint(count)
714714 doecc = int(doecc)
715715 self.logger.info("Writing "+self._hex(count)+" NAND pages starting at "+self._hex(start)+" from "+self._hex(addr)+"...")
716 - self.embios.lib.dev.timeout = 20000
 716+ self.embios.lib.dev.timeout = 30000
717717 self.embios.ipodnano2g_nandwrite(addr, start, count, doecc)
718718 self.logger.info("done\n")
719719
@@ -726,10 +726,71 @@
727727 start = self._hexint(start)
728728 count = self._hexint(count)
729729 self.logger.info("Erasing "+self._hex(count)+" NAND blocks starting at "+self._hex(start)+" and logging to "+self._hex(addr)+"...")
730 - self.embios.lib.dev.timeout = 20000
 730+ self.embios.lib.dev.timeout = 30000
731731 self.embios.ipodnano2g_nanderase(addr, start, count)
732732 self.logger.info("done\n")
733733
 734+ @command
 735+ def ipodnano2g_dumpnand(self, filenameprefix):
 736+ """
 737+ Target-specific function: ipodnano2g
 738+ Dumps the whole NAND chip to four files
 739+ """
 740+ info = self.embios.ipodnano2g_getnandinfo()
 741+ self.logger.info("Dumping NAND contents...")
 742+ try:
 743+ infofile = open(filenameprefix+"_info.txt", 'wb')
 744+ datafile = open(filenameprefix+"_data.bin", 'wb')
 745+ sparefile = open(filenameprefix+"_spare.bin", 'wb')
 746+ statusfile = open(filenameprefix+"_status.bin", 'wb')
 747+ except IOError:
 748+ raise ArgumentError("Can not open file for writing!")
 749+ infofile.write("NAND chip type: "+self._hex(info["type"])+"\r\n")
 750+ infofile.write("Number of banks: "+str(info["banks"])+"\r\n")
 751+ infofile.write("Number of blocks: "+str(info["blocks"])+"\r\n")
 752+ infofile.write("Number of user blocks: "+str(info["userblocks"])+"\r\n")
 753+ infofile.write("Pages per block: "+str(info["pagesperblock"])+"\r\n")
 754+ self.embios.lib.dev.timeout = 30000
 755+ for i in range(info["banks"] * info["blocks"] * info["pagesperblock"] / 8192):
 756+ self.logger.info(".")
 757+ self.embios.ipodnano2g_nandread(0x08000000, i * 8192, 8192, 1, 1)
 758+ datafile.write(self.embios.read(0x08000000, 0x01000000))
 759+ sparefile.write(self.embios.read(0x09000000, 0x00080000))
 760+ statusfile.write(self.embios.read(0x09080000, 0x00008000))
 761+ infofile.close()
 762+ datafile.close()
 763+ sparefile.close()
 764+ statusfile.close()
 765+ self.logger.info("done\n")
 766+
 767+ @command
 768+ def ipodnano2g_wipenand(self, filename, force=False):
 769+ """
 770+ Target-specific function: ipodnano2g
 771+ Wipes the whole NAND chip and logs the result to a file
 772+ <force>: Use this flag to suppress the 5 seconds delay
 773+ """
 774+ self.logger.info("Wiping the whole NAND chip!\n")
 775+ if force == False:
 776+ self.logger.info("If this was not what you intended press Ctrl-C NOW")
 777+ for i in range(10):
 778+ self.logger.info(".")
 779+ time.sleep(1)
 780+ self.logger.info("\n")
 781+ info = self.embios.ipodnano2g_getnandinfo()
 782+ self.logger.info("Wiping NAND contents...")
 783+ try:
 784+ statusfile = open(filename, 'wb')
 785+ except IOError:
 786+ raise ArgumentError("Can not open file for writing!")
 787+ self.embios.lib.dev.timeout = 30000
 788+ for i in range(info["banks"] * info["blocks"] / 64):
 789+ self.logger.info(".")
 790+ self.embios.ipodnano2g_nanderase(0x08000000, i * 64, 64, 1, 1)
 791+ statusfile.write(self.embios.read(0x08000000, 0x00000100))
 792+ statusfile.close()
 793+ self.logger.info("done\n")
 794+
734795 if __name__ == "__main__":
735796 if len(sys.argv) < 2:
736797 usage("No command specified")