Subversion Repositories freemyipod

Rev

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

Rev 343 Rev 346
Line 25... Line 25...
25
import os
25
import os
26
import inspect
26
import inspect
27
import re
27
import re
28
import time
28
import time
29
import struct
29
import struct
-
 
30
import locale
30
 
31
 
31
from functools import wraps
32
from functools import wraps
32
 
33
 
33
import libembios
34
import libembios
34
from libembios import Error
35
from libembios import Error
Line 476... Line 477...
476
        for thread in threads:
477
        for thread in threads:
477
            self.logger.info("  "+thread.name+":\n")
478
            self.logger.info("  "+thread.name+":\n")
478
            self.logger.info("    Thread id: "+str(thread.id)+"\n")
479
            self.logger.info("    Thread id: "+str(thread.id)+"\n")
479
            self.logger.info("    Thread type: "+thread.type+"\n")
480
            self.logger.info("    Thread type: "+thread.type+"\n")
480
            self.logger.info("    Thread state: "+thread.state+"\n")
481
            self.logger.info("    Thread state: "+thread.state+"\n")
-
 
482
            self.logger.info("    Block type: "+thread.block_type+"\n")
-
 
483
            self.logger.info("    Blocked by: "+self._hex(thread.blocked_by_ptr)+"\n")
481
            self.logger.info("    Priority: "+str(thread.priority)+"/256\n")
484
            self.logger.info("    Priority: "+str(thread.priority)+"/256\n")
482
            self.logger.info("    Current CPU load: "+str((thread.cpuload*100)/255)+"%\n")
485
            self.logger.info("    Current CPU load: "+str((thread.cpuload*100)/255)+"%\n")
483
            self.logger.info("    CPU time (total): "+str(datetime.timedelta(microseconds=thread.cputime_total))+"\n")
486
            self.logger.info("    CPU time (total): "+str(datetime.timedelta(microseconds=thread.cputime_total))+"\n")
484
            self.logger.info("    Stack address: "+self._hex(thread.stackaddr)+"\n")
487
            self.logger.info("    Stack address: "+self._hex(thread.stackaddr)+"\n")
485
            self.logger.info("    Registers:\n")
488
            self.logger.info("    Registers:\n")
Line 801... Line 804...
801
            self.embios.ipodnano2g_nanderase(0x08000000, i * 64, 64)
804
            self.embios.ipodnano2g_nanderase(0x08000000, i * 64, 64)
802
            statusfile.write(self.embios.read(0x08000000, 0x00000100))
805
            statusfile.write(self.embios.read(0x08000000, 0x00000100))
803
        statusfile.close()
806
        statusfile.close()
804
        self.logger.info("done\n")
807
        self.logger.info("done\n")
805
 
808
 
-
 
809
    @command
-
 
810
    def ipodclassic_writebbt(self, tempaddr, filename):
-
 
811
        """
-
 
812
            Target-specific function: ipodclassic
-
 
813
            Uploads the bad block table <filename> to
-
 
814
            memory at <tempaddr> and writes it to the hard disk
-
 
815
        """
-
 
816
        tempaddr = self._hexint(tempaddr)
-
 
817
        try:
-
 
818
            f = open(filename, 'rb')
-
 
819
        except IOError:
-
 
820
            raise ArgumentError("File not readable. Does it exist?")
-
 
821
        self.embios.lib.dev.timeout = 30000
-
 
822
        self.logger.info("Writing bad block table to disk...")
-
 
823
        data = self.embios.ipodclassic_writebbt(f.read(), tempaddr)
-
 
824
        f.close()
-
 
825
        self.logger.info(" done\n")
-
 
826
 
-
 
827
    @command
-
 
828
    def mkdir(self, dirname):
-
 
829
        """
-
 
830
            Creates a directory
-
 
831
        """
-
 
832
        self.embios.lib.dev.timeout = 30000
-
 
833
        self.logger.info("Creating directory " + dirname + "...")
-
 
834
        self.embios.dir_create(dirname)
-
 
835
        self.logger.info(" done\n")
-
 
836
 
-
 
837
    @command
-
 
838
    def rmdir(self, dirname):
-
 
839
        """
-
 
840
            Removes an empty directory
-
 
841
        """
-
 
842
        self.embios.lib.dev.timeout = 30000
-
 
843
        self.logger.info("Removing directory " + dirname + "...")
-
 
844
        self.embios.dir_remove(dirname)
-
 
845
        self.logger.info(" done\n")
-
 
846
 
-
 
847
    @command
-
 
848
    def unlink(self, filename):
-
 
849
        """
-
 
850
            Removes a file
-
 
851
        """
-
 
852
        self.embios.lib.dev.timeout = 30000
-
 
853
        self.logger.info("Removing file " + filename + "...")
-
 
854
        self.embios.file_unlink(filename)
-
 
855
        self.logger.info(" done\n")
-
 
856
 
-
 
857
    @command
-
 
858
    def get(self, buffer, buffsize, remotename, localname):
-
 
859
        """
-
 
860
            Downloads a file
-
 
861
        """
-
 
862
        buffer = self._hexint(buffer)
-
 
863
        buffsize = self._hexint(buffsize)
-
 
864
        try:
-
 
865
            f = open(localname, 'wb')
-
 
866
        except IOError:
-
 
867
            raise ArgumentError("Could not open local file for writing.")
-
 
868
        self.embios.lib.dev.timeout = 30000
-
 
869
        self.logger.info("Downloading file " + remotename + " to " + localname + "...")
-
 
870
        fd = self.embios.file_open(remotename, 0)
-
 
871
        size = self.embios.file_size(fd)
-
 
872
        while size > 0:
-
 
873
            bytes = self.embios.file_read(fd, buffer, buffsize)
-
 
874
            f.write(self.embios.read(buffer, bytes))
-
 
875
            size = size - bytes
-
 
876
        self.embios.file_close(fd)
-
 
877
        f.close()
-
 
878
        self.logger.info(" done\n")
-
 
879
 
-
 
880
    @command
-
 
881
    def put(self, buffer, buffsize, localname, remotename):
-
 
882
        """
-
 
883
            Uploads a file
-
 
884
        """
-
 
885
        buffer = self._hexint(buffer)
-
 
886
        buffsize = self._hexint(buffsize)
-
 
887
        try:
-
 
888
            f = open(localname, 'rb')
-
 
889
        except IOError:
-
 
890
            raise ArgumentError("Could not open local file for reading.")
-
 
891
        self.embios.lib.dev.timeout = 30000
-
 
892
        self.logger.info("Uploading file " + localname + " to " + remotename + "...")
-
 
893
        fd = self.embios.file_open(remotename, 0x15)
-
 
894
        while True:
-
 
895
            data = f.read(buffsize)
-
 
896
            if len(data) == 0: break
-
 
897
            self.embios.write(buffer, data)
-
 
898
            bytes = 0
-
 
899
            while bytes < len(data):
-
 
900
                bytes = bytes + self.embios.file_write(fd, buffer + bytes, len(data) - bytes)
-
 
901
        self.embios.file_close(fd)
-
 
902
        f.close()
-
 
903
        self.logger.info(" done\n")
-
 
904
 
-
 
905
    @command
-
 
906
    def ls(self, path):
-
 
907
        """
-
 
908
            Lists all files in the specified path
-
 
909
        """
-
 
910
        self.embios.lib.dev.timeout = 30000
-
 
911
        handle = self.embios.dir_open(path)
-
 
912
        self.logger.info("Directory listing of " + path + ":\n")
-
 
913
        while True:
-
 
914
            try:
-
 
915
                entry = self.embios.dir_read(handle)
-
 
916
                if entry.attributes & 0x10: size = "DIR"
-
 
917
                else: size = locale.format("%d", entry.size, True).rjust(13)
-
 
918
                self.logger.info(entry.name.ljust(50) + " - " + size + "\n")
-
 
919
            except: break
-
 
920
        self.embios.dir_close(handle)
-
 
921
 
806
if __name__ == "__main__":
922
if __name__ == "__main__":
807
    if len(sys.argv) < 2:
923
    if len(sys.argv) < 2:
808
        usage("No command specified")
924
        usage("No command specified")
809
    interface = Commandline()
925
    interface = Commandline()
810
    interface._parsecommand(sys.argv[1], sys.argv[2:])
926
    interface._parsecommand(sys.argv[1], sys.argv[2:])
811
927