Subversion Repositories freemyipod

Rev

Rev 381 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 381 Rev 382
Line 118... Line 118...
118
 
118
 
119
 
119
 
120
class Logger(object):
120
class Logger(object):
121
    """
121
    """
122
        Simple stdout logger.
122
        Simple stdout logger.
123
        Loglevel 4 is most verbose, Loglevel 0 only say something if there is an error.
123
        Loglevel 4 is most verbose, Loglevel 0: Only say something if there is an error.
-
 
124
        The log function doesn't care about the loglevel and always logs to stdout.
124
    """
125
    """
125
    def __init__(self):
126
    def __init__(self):
126
        # Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
127
        # Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
127
        self.loglevel = 3
128
        self.loglevel = 3
128
        
129
        
129
    def log(self, text):
130
    def log(self, text):
130
        sys.stdout.write(text)
131
        sys.stdout.write(text)
131
    
132
    
132
    def debug(self, text):
133
    def debug(self, text):
133
        if self.loglevel >= 3:
134
        if self.loglevel >= 3:
134
            self.log(text)
135
            self.log("DEBUG: " + text)
135
    
136
    
136
    def info(self, text):
137
    def info(self, text):
137
        if self.loglevel >= 2:
138
        if self.loglevel >= 2:
138
            self.log(text)
139
            self.log(text)
139
    
140
    
140
    def warning(self, text):
141
    def warn(self, text):
141
        if self.loglevel >= 1:
142
        if self.loglevel >= 1:
142
            self.log("WARNING: " + text)
143
            self.log("WARNING: " + text)
143
    
144
    
144
    def error(self, text):
145
    def error(self, text):
145
        self.log("ERROR: " + text)
146
        self.log("ERROR: " + text)
Line 267... Line 268...
267
        if infotype == "version":
268
        if infotype == "version":
268
            try:
269
            try:
269
                hwtype = libembiosdata.hwtypes[self.embios.lib.dev.hwtypeid]
270
                hwtype = libembiosdata.hwtypes[self.embios.lib.dev.hwtypeid]
270
            except KeyError:
271
            except KeyError:
271
                hwtype = "UNKNOWN (ID = " + self._hex(self.embios.lib.dev.hwtypeid) + ")"
272
                hwtype = "UNKNOWN (ID = " + self._hex(self.embios.lib.dev.hwtypeid) + ")"
-
 
273
            self.logger.info("Connected to " + \
272
            self.logger.info("Connected to "+libembiosdata.swtypes[self.embios.lib.dev.swtypeid] + " v" + str(self.embios.lib.dev.version.majorv) + "." + str(self.embios.lib.dev.version.minorv) +
274
                             libembiosdata.swtypes[self.embios.lib.dev.swtypeid] + \
-
 
275
                             " v" + str(self.embios.lib.dev.version.majorv) + \
-
 
276
                             "." + str(self.embios.lib.dev.version.minorv) + \
-
 
277
                             "." + str(self.embios.lib.dev.version.patchv) + \
273
                             "." + str(self.embios.lib.dev.version.patchv) + " r" + str(self.embios.lib.dev.version.revision) + " running on " + hwtype + "\n")
278
                             " r" + str(self.embios.lib.dev.version.revision) + \
-
 
279
                             " running on " + hwtype + "\n")
274
        
280
        
275
        elif infotype == "packetsize":
281
        elif infotype == "packetsize":
276
            self.logger.info("Maximum packet sizes: \n command out: " + str(self.embios.lib.dev.packetsizelimit.cout) + "\n command in: " + str(self.embios.lib.dev.packetsizelimit.cin) + "\n data in: " + str(self.embios.lib.dev.packetsizelimit.din) + "\n data out: " + str(self.embios.lib.dev.packetsizelimit.dout))
282
            self.logger.info("Maximum packet sizes: \n command out: " + str(self.embios.lib.dev.packetsizelimit.cout) + \
-
 
283
                             "\n command in: " + str(self.embios.lib.dev.packetsizelimit.cin) + \
-
 
284
                             "\n data in: " + str(self.embios.lib.dev.packetsizelimit.din) + \
-
 
285
                             "\n data out: " + str(self.embios.lib.dev.packetsizelimit.dout))
277
        
286
        
278
        elif infotype == "usermemrange":
287
        elif infotype == "usermemrange":
279
            resp = self.embios.getusermemrange()
288
            resp = self.embios.getusermemrange()
-
 
289
            self.logger.info("The user memory range is " + \
-
 
290
                             self._hex(self.embios.lib.dev.usermem.lower) + \
-
 
291
                             " - " + \
280
            self.logger.info("The user memory range is "+self._hex(self.embios.lib.dev.usermem.lower)+" - "+self._hex(self.embios.lib.dev.usermem.upper - 1))
292
                             self._hex(self.embios.lib.dev.usermem.upper - 1))
-
 
293
        
281
        else:
294
        else:
282
            raise ArgumentTypeError("one out of 'version', 'packetsize', 'usermemrange'", infotype)
295
            raise ArgumentTypeError("one out of 'version', 'packetsize', 'usermemrange'", infotype)
283
    
296
    
284
    @command
297
    @command
285
    def reset(self, force=False):
298
    def reset(self, force=False):
Line 315... Line 328...
315
        addr = self._hexint(addr)
328
        addr = self._hexint(addr)
316
        try:
329
        try:
317
            f = open(filename, 'rb')
330
            f = open(filename, 'rb')
318
        except IOError:
331
        except IOError:
319
            raise ArgumentError("File not readable. Does it exist?")
332
            raise ArgumentError("File not readable. Does it exist?")
320
        self.logger.info("Writing file '"+filename+"' to memory at "+self._hex(addr)+"...")
333
        self.logger.info("Writing file '" + filename + \
-
 
334
                         "' to memory at " + self._hex(addr) + "...")
321
        with f:
335
        with f:
322
            self.embios.write(addr, f.read())
336
            self.embios.write(addr, f.read())
323
        f.close()
337
        f.close()
324
        self.logger.info("done\n")
338
        self.logger.info("done\n")
325
    
339
    
Line 335... Line 349...
335
        size = self._hexint(size)
349
        size = self._hexint(size)
336
        try:
350
        try:
337
            f = open(filename, 'wb')
351
            f = open(filename, 'wb')
338
        except IOError:
352
        except IOError:
339
            raise ArgumentError("Can not open file for write!")
353
            raise ArgumentError("Can not open file for write!")
340
        self.logger.info("Reading data from address "+self._hex(addr)+" with the size "+self._hex(size)+" to '"+filename+"'...")
354
        self.logger.info("Reading data from address " + self._hex(addr) + \
-
 
355
                         " with the size " + self._hex(size) + \
-
 
356
                         " to '"+filename+"'...")
341
        with f:
357
        with f:
342
            f.write(self.embios.read(addr, size))
358
            f.write(self.embios.read(addr, size))
343
        f.close()
359
        f.close()
344
        self.logger.info("done\n")
360
        self.logger.info("done\n")
345
 
361
 
Line 354... Line 370...
354
        integer = self._hexint(integer)
370
        integer = self._hexint(integer)
355
        if integer > 0xFFFFFFFF:
371
        if integer > 0xFFFFFFFF:
356
            raise ArgumentError("Specified integer too long")
372
            raise ArgumentError("Specified integer too long")
357
        data = struct.pack("I", integer)
373
        data = struct.pack("I", integer)
358
        self.embios.write(addr, data)
374
        self.embios.write(addr, data)
-
 
375
        self.logger.info("Integer '" + self._hex(integer) + \
359
        self.logger.info("Integer '"+self._hex(integer)+"' written successfully to "+self._hex(addr)+"\n")
376
                         "' written successfully to " + self._hex(addr) + "\n")
360
 
377
 
361
    @command
378
    @command
362
    def downloadint(self, addr):
379
    def downloadint(self, addr):
363
        """
380
        """
364
            Downloads a single integer from the device and prints it to the console window
381
            Downloads a single integer from the device and prints it to the console window
365
            <addr>: the address to download the integer from
382
            <addr>: the address to download the integer from
366
        """
383
        """
367
        addr = self._hexint(addr)
384
        addr = self._hexint(addr)
368
        data = self.embios.read(addr, 4)
385
        data = self.embios.read(addr, 4)
369
        integer = struct.unpack("I", data)[0]
386
        integer = struct.unpack("I", data)[0]
370
        self.logger.info("Integer '"+self._hex(integer)+"' read from address "+self._hex(addr)+"\n")
387
        self.logger.info("Integer '" + self._hex(integer) + \
-
 
388
                         "' read from address " + self._hex(addr) + "\n")
371
 
389
 
372
    @command
390
    @command
373
    def i2cread(self, bus, slave, addr, size):
391
    def i2cread(self, bus, slave, addr, size):
374
        """
392
        """
375
            Reads data from an I2C device
393
            Reads data from an I2C device
Line 451... Line 469...
451
        bitmask = self._hexint(bitmask)
469
        bitmask = self._hexint(bitmask)
452
        text = ""
470
        text = ""
453
        for word in args:
471
        for word in args:
454
            text += word + " "
472
            text += word + " "
455
        text = text[:-1]
473
        text = text[:-1]
-
 
474
        self.logger.info("Writing '" + text + \
456
        self.logger.info("Writing '"+text+"' to the device consoles identified with "+self._hex(bitmask)+"\n")
475
                         "' to the device consoles identified with " + self._hex(bitmask) + "\n")
457
        self.embios.cwrite(text, bitmask)
476
        self.embios.cwrite(text, bitmask)
458
 
477
 
459
    @command
478
    @command
460
    def flushconsolebuffers(self, bitmask):
479
    def flushconsolebuffers(self, bitmask):
461
        """
480
        """
462
            flushes one or more of the device consoles' buffers.
481
            flushes one or more of the device consoles' buffers.
463
            <bitmask>: the bitmask of the consoles to be flushed
482
            <bitmask>: the bitmask of the consoles to be flushed
464
        """
483
        """
465
        bitmask = self._hexint(bitmask)
484
        bitmask = self._hexint(bitmask)
466
        self.logger.info("Flushing consoles identified with the bitmask "+self._hex(bitmask)+"\n")
485
        self.logger.info("Flushing consoles identified with the bitmask " + \
-
 
486
                         self._hex(bitmask) + "\n")
467
        self.embios.cflush(bitmask)
487
        self.embios.cflush(bitmask)
468
 
488
 
469
    @command
489
    @command
470
    def getprocinfo(self):
490
    def getprocinfo(self):
471
        """
491
        """
472
            Fetches data on the currently running processes
492
            Fetches data on the currently running processes
473
        """
493
        """
474
        import datetime
494
        import datetime
475
        threads = self.embios.getprocinfo()
495
        threads = self.embios.getprocinfo()
-
 
496
        cpuload = 1
-
 
497
        threadload = 0
-
 
498
        idleload = 0
-
 
499
        for thread in threads:
-
 
500
            if thread.priority != 0:
-
 
501
                threadload += (thread.cpuload*100)/255
-
 
502
            else:
-
 
503
                idleload += (thread.cpuload*100)/255
-
 
504
        coreload = 1 - (threadload + idleload)
-
 
505
        cpuload = threadload + coreload
476
        self.logger.info("The device has "+str(len(threads))+" running threads:\n\n")
506
        self.logger.info("The device has " + str(len(threads)) + " running threads.\n" + \
-
 
507
                         "It is running at " + str(cpuload * 100) + "% cpu load with a core load of " + \
-
 
508
                         str(coreload * 100) + "%, a thread load of " + str(threadload * 100) + "% " + \
-
 
509
                         "and an idle load of " + str(idleload * 100) + "%\n\n")
-
 
510
        self.logger.info("Thread dump:\n")
477
        for thread in threads:
511
        for thread in threads:
478
            self.logger.info("  "+thread.name+":\n")
512
            self.logger.info("  "+thread.name+":\n")
479
            self.logger.info("    Thread id: "+str(thread.id)+"\n")
513
            self.logger.info("    Thread id: "      + str(thread.id)+"\n")
480
            self.logger.info("    Thread type: "+thread.type+"\n")
514
            self.logger.info("    Thread type: "    + thread.type+"\n")
481
            self.logger.info("    Thread state: "+thread.state+"\n")
515
            self.logger.info("    Thread state: "   + thread.state+"\n")
482
            self.logger.info("    Block type: "+thread.block_type+"\n")
516
            self.logger.info("    Block type: "     + thread.block_type+"\n")
483
            self.logger.info("    Blocked by: "+self._hex(thread.blocked_by_ptr)+"\n")
517
            self.logger.info("    Blocked by: "     + self._hex(thread.blocked_by_ptr)+"\n")
484
            self.logger.info("    Priority: "+str(thread.priority)+"/255\n")
518
            self.logger.info("    Priority: "       + str(thread.priority)+"/255\n")
485
            self.logger.info("    Current CPU load: "+str((thread.cpuload*100)/255)+"%\n")
519
            self.logger.info("    Current CPU load: "+str((thread.cpuload*100)/255)+"%\n")
486
            self.logger.info("    CPU time (total): "+str(datetime.timedelta(microseconds=thread.cputime_total))+"\n")
520
            self.logger.info("    CPU time (total): "+str(datetime.timedelta(microseconds=thread.cputime_total))+"\n")
487
            self.logger.info("    Stack address: "+self._hex(thread.stackaddr)+"\n")
521
            self.logger.info("    Stack address: "  + self._hex(thread.stackaddr)+"\n")
488
            self.logger.info("    Registers:\n")
522
            self.logger.info("    Registers:\n")
489
            for registerrange in range(4):
523
            for registerrange in range(4):
490
                self.logger.info("      ")
524
                self.logger.info("      ")
491
                for register in range(registerrange, 16, 4):
525
                for register in range(registerrange, 16, 4):
492
                    registerrepr = "r"+str(register)
526
                    registerrepr = "r"+str(register)
Line 555... Line 589...
555
        stackpointer = self._hexint(stackpointer)
589
        stackpointer = self._hexint(stackpointer)
556
        stacksize = self._hexint(stacksize)
590
        stacksize = self._hexint(stacksize)
557
        priority = self._hexint(priority)
591
        priority = self._hexint(priority)
558
        data = self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state)
592
        data = self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state)
559
        name = self.embios.readstring(nameptr)
593
        name = self.embios.readstring(nameptr)
-
 
594
        self.logger.info("Created a thread with the threadid " + data.id + \
-
 
595
                         ", the name \"" + name + "\"" + \
-
 
596
                         ", the entrypoint at " + self._hex(entrypoint) + \
-
 
597
                         ", the stack at " + self._hex(stackpointer) + \
-
 
598
                         " with a size of " + self._hex(stacksize) + \
560
        self.logger.info("Created a thread with the threadid " + data.id + ", the name \"" + name + "\", the entrypoint at " + self._hex(entrypoint) + ", the stack at " + self._hex(stackpointer) + " with a size of " + self._hex(stacksize) + " and a priority of " + self._hex(priority) + "\n")
599
                         " and a priority of " + self._hex(priority) + "\n")
561
    
600
    
562
    @command
601
    @command
563
    def run(self, filename):
602
    def run(self, filename):
564
        """
603
        """
565
            Uploads the emBIOS application <filename> to
604
            Uploads the emBIOS application <filename> to
Line 618... Line 657...
618
        """
657
        """
619
        addr_flash = self._hexint(addr_flash)
658
        addr_flash = self._hexint(addr_flash)
620
        addr_mem = self._hexint(addr_mem)
659
        addr_mem = self._hexint(addr_mem)
621
        size = self._hexint(size)
660
        size = self._hexint(size)
622
        force = self._bool(force)
661
        force = self._bool(force)
623
        self.logger.info("Writing boot flash from the memory in "+self._hex(addr_mem)+" - "+
662
        self.logger.warn("Writing boot flash from the memory in "+self._hex(addr_mem)+" - "+
624
                         hex(addr_mem+size)+" to "+self._hex(addr_flash)+" - "+self._hex(addr_flash+size)+"\n")
663
                         hex(addr_mem+size)+" to "+self._hex(addr_flash)+" - "+self._hex(addr_flash+size)+"\n")
625
        if force == False:
664
        if force == False:
626
            self.logger.info("If this was not what you intended press Ctrl-C NOW")
665
            self.logger.warn("If this was not what you intended press Ctrl-C NOW")
627
            for i in range(10):
666
            for i in range(10):
628
                self.logger.info(".")
667
                self.logger.info(".")
629
                time.sleep(1)
668
                time.sleep(1)
630
            self.logger.info("\n")
669
            self.logger.info("\n")
631
        self.embios.lib.dev.timeout = 30000
670
        self.embios.lib.dev.timeout = 30000
Line 679... Line 718...
679
        """
718
        """
680
        addr = self._hexint(addr)
719
        addr = self._hexint(addr)
681
        size = self._hexint(size)
720
        size = self._hexint(size)
682
        destination = self._hexint(destination)
721
        destination = self._hexint(destination)
683
        sha1size = 0x14
722
        sha1size = 0x14
684
        self.logger.info("Generating hmac-sha1 hash from the buffer at "+self._hex(addr)+" with the size "+self._hex(size)+
723
        self.logger.info("Generating hmac-sha1 hash from the buffer at " + self._hex(addr) + \
-
 
724
                         " with the size " + self._hex(size) + " and saving it to " + \
685
                         " and saving it to "+self._hex(destination)+" - "+self._hex(destination+sha1size)+"...")
725
                         self._hex(destination) + " - " + self._hex(destination+sha1size) + "...")
686
        self.embios.lib.dev.timeout = 30000
726
        self.embios.lib.dev.timeout = 30000
687
        self.embios.hmac_sha1(addr, size, destination)
727
        self.embios.hmac_sha1(addr, size, destination)
688
        self.logger.info("done\n")
728
        self.logger.info("done\n")
689
        data = self.embios.read(destination, sha1size)
729
        data = self.embios.read(destination, sha1size)
690
        hash = ord(data)
730
        hash = ord(data)
Line 695... Line 735...
695
        """
735
        """
696
            Target-specific function: ipodnano2g
736
            Target-specific function: ipodnano2g
697
            Gathers some information about the NAND chip used
737
            Gathers some information about the NAND chip used
698
        """
738
        """
699
        data = self.embios.ipodnano2g_getnandinfo()
739
        data = self.embios.ipodnano2g_getnandinfo()
700
        self.logger.info("NAND chip type: "+self._hex(data["type"])+"\n")
740
        self.logger.info("NAND chip type: "         + self._hex(data["type"])+"\n")
701
        self.logger.info("Number of banks: "+str(data["banks"])+"\n")
741
        self.logger.info("Number of banks: "        + str(data["banks"])+"\n")
702
        self.logger.info("Number of blocks: "+str(data["blocks"])+"\n")
742
        self.logger.info("Number of blocks: "       + str(data["blocks"])+"\n")
703
        self.logger.info("Number of user blocks: "+str(data["userblocks"])+"\n")
743
        self.logger.info("Number of user blocks: "  + str(data["userblocks"])+"\n")
704
        self.logger.info("Pages per block: "+str(data["pagesperblock"]))
744
        self.logger.info("Pages per block: "        + str(data["pagesperblock"]))
705
 
745
 
706
    @command
746
    @command
707
    def ipodnano2g_nandread(self, addr, start, count, doecc, checkempty):
747
    def ipodnano2g_nandread(self, addr, start, count, doecc, checkempty):
708
        """
748
        """
709
            Target-specific function: ipodnano2g
749
            Target-specific function: ipodnano2g
Line 712... Line 752...
712
        addr = self._hexint(addr)
752
        addr = self._hexint(addr)
713
        start = self._hexint(start)
753
        start = self._hexint(start)
714
        count = self._hexint(count)
754
        count = self._hexint(count)
715
        doecc = int(doecc)
755
        doecc = int(doecc)
716
        checkempty = int(checkempty)
756
        checkempty = int(checkempty)
717
        self.logger.info("Reading "+self._hex(count)+" NAND pages starting at "+self._hex(start)+" to "+self._hex(addr)+"...")
757
        self.logger.info("Reading " + self._hex(count) + " NAND pages starting at " + \
-
 
758
                         self._hex(start) + " to " + self._hex(addr) + "...")
718
        self.embios.lib.dev.timeout = 30000
759
        self.embios.lib.dev.timeout = 30000
719
        self.embios.ipodnano2g_nandread(addr, start, count, doecc, checkempty)
760
        self.embios.ipodnano2g_nandread(addr, start, count, doecc, checkempty)
720
        self.logger.info("done\n")
761
        self.logger.info("done\n")
721
 
762
 
722
    @command
763
    @command
Line 727... Line 768...
727
        """
768
        """
728
        addr = self._hexint(addr)
769
        addr = self._hexint(addr)
729
        start = self._hexint(start)
770
        start = self._hexint(start)
730
        count = self._hexint(count)
771
        count = self._hexint(count)
731
        doecc = int(doecc)
772
        doecc = int(doecc)
732
        self.logger.info("Writing "+self._hex(count)+" NAND pages starting at "+self._hex(start)+" from "+self._hex(addr)+"...")
773
        self.logger.info("Writing " + self._hex(count) + " NAND pages starting at " + \
-
 
774
                         self._hex(start) + " from " + self._hex(addr) + "...")
733
        self.embios.lib.dev.timeout = 30000
775
        self.embios.lib.dev.timeout = 30000
734
        self.embios.ipodnano2g_nandwrite(addr, start, count, doecc)
776
        self.embios.ipodnano2g_nandwrite(addr, start, count, doecc)
735
        self.logger.info("done\n")
777
        self.logger.info("done\n")
736
 
778
 
737
    @command
779
    @command
Line 741... Line 783...
741
            Erases blocks on the NAND chip and stores the results to memory
783
            Erases blocks on the NAND chip and stores the results to memory
742
        """
784
        """
743
        addr = self._hexint(addr)
785
        addr = self._hexint(addr)
744
        start = self._hexint(start)
786
        start = self._hexint(start)
745
        count = self._hexint(count)
787
        count = self._hexint(count)
746
        self.logger.info("Erasing "+self._hex(count)+" NAND blocks starting at "+self._hex(start)+" and logging to "+self._hex(addr)+"...")
788
        self.logger.info("Erasing " + self._hex(count) + " NAND blocks starting at " + \
-
 
789
                         self._hex(start) + " and logging to " + self._hex(addr) + "...")
747
        self.embios.lib.dev.timeout = 30000
790
        self.embios.lib.dev.timeout = 30000
748
        self.embios.ipodnano2g_nanderase(addr, start, count)
791
        self.embios.ipodnano2g_nanderase(addr, start, count)
749
        self.logger.info("done\n")
792
        self.logger.info("done\n")
750
 
793
 
751
    @command
794
    @command
Line 761... Line 804...
761
            datafile = open(filenameprefix+"_data.bin", 'wb')
804
            datafile = open(filenameprefix+"_data.bin", 'wb')
762
            sparefile = open(filenameprefix+"_spare.bin", 'wb')
805
            sparefile = open(filenameprefix+"_spare.bin", 'wb')
763
            statusfile = open(filenameprefix+"_status.bin", 'wb')
806
            statusfile = open(filenameprefix+"_status.bin", 'wb')
764
        except IOError:
807
        except IOError:
765
            raise ArgumentError("Can not open file for writing!")
808
            raise ArgumentError("Can not open file for writing!")
766
        infofile.write("NAND chip type: "+self._hex(info["type"])+"\r\n")
809
        infofile.write("NAND chip type: "       + self._hex(info["type"]) + "\r\n")
767
        infofile.write("Number of banks: "+str(info["banks"])+"\r\n")
810
        infofile.write("Number of banks: "      + str(info["banks"]) + "\r\n")
768
        infofile.write("Number of blocks: "+str(info["blocks"])+"\r\n")
811
        infofile.write("Number of blocks: "     + str(info["blocks"]) + "\r\n")
769
        infofile.write("Number of user blocks: "+str(info["userblocks"])+"\r\n")
812
        infofile.write("Number of user blocks: "+ str(info["userblocks"]) + "\r\n")
770
        infofile.write("Pages per block: "+str(info["pagesperblock"])+"\r\n")
813
        infofile.write("Pages per block: "      + str(info["pagesperblock"]) + "\r\n")
771
        self.embios.lib.dev.timeout = 30000
814
        self.embios.lib.dev.timeout = 30000
772
        for i in range(info["banks"] * info["blocks"] * info["pagesperblock"] / 8192):
815
        for i in range(info["banks"] * info["blocks"] * info["pagesperblock"] / 8192):
773
            self.logger.info(".")
816
            self.logger.info(".")
774
            self.embios.ipodnano2g_nandread(0x08000000, i * 8192, 8192, 1, 1)
817
            self.embios.ipodnano2g_nandread(0x08000000, i * 8192, 8192, 1, 1)
775
            datafile.write(self.embios.read(0x08000000, 0x01000000))
818
            datafile.write(self.embios.read(0x08000000, 0x01000000))
Line 786... Line 829...
786
        """
829
        """
787
            Target-specific function: ipodnano2g
830
            Target-specific function: ipodnano2g
788
            Wipes the whole NAND chip and logs the result to a file
831
            Wipes the whole NAND chip and logs the result to a file
789
            <force>: Use this flag to suppress the 5 seconds delay
832
            <force>: Use this flag to suppress the 5 seconds delay
790
        """
833
        """
791
        self.logger.info("Wiping the whole NAND chip!\n")
834
        self.logger.warn("Wiping the whole NAND chip!\n")
792
        if force == False:
835
        if force == False:
793
            self.logger.info("If this was not what you intended press Ctrl-C NOW")
836
            self.logger.warn("If this was not what you intended press Ctrl-C NOW")
794
            for i in range(10):
837
            for i in range(10):
795
                self.logger.info(".")
838
                self.logger.info(".")
796
                time.sleep(1)
839
                time.sleep(1)
797
            self.logger.info("\n")
840
            self.logger.info("\n")
798
        info = self.embios.ipodnano2g_getnandinfo()
841
        info = self.embios.ipodnano2g_getnandinfo()
Line 1036... Line 1079...
1036
        self.embios.dir_close(handle)
1079
        self.embios.dir_close(handle)
1037
 
1080
 
1038
if __name__ == "__main__":
1081
if __name__ == "__main__":
1039
    if len(sys.argv) < 2:
1082
    if len(sys.argv) < 2:
1040
        usage("No command specified")
1083
        usage("No command specified")
1041
    interface = Commandline()
-
 
1042
    interface._parsecommand(sys.argv[1], sys.argv[2:])
-
 
1043
1084
    try:
-
 
1085
        interface = Commandline()
-
 
1086
        interface._parsecommand(sys.argv[1], sys.argv[2:])
-
 
1087
    except KeyboardInterrupt:
-
 
1088
        sys.exit()
-
 
1089
1044
1090