Index: embios/trunk/tools/embios.py |
— | — | @@ -825,6 +825,107 @@ |
826 | 826 | self.logger.info(" done\n")
|
827 | 827 |
|
828 | 828 | @command
|
| 829 | + def getvolumeinfo(self, volume):
|
| 830 | + """
|
| 831 | + Gathers some information about a storage volume used
|
| 832 | + """
|
| 833 | + volume = self._hexint(volume)
|
| 834 | + data = self.embios.storage_get_info(volume)
|
| 835 | + self.logger.info("Sector size: "+str(data["sectorsize"])+"\n")
|
| 836 | + self.logger.info("Number of sectors: "+str(data["numsectors"])+"\n")
|
| 837 | + self.logger.info("Vendor: "+data["vendor"]+"\n")
|
| 838 | + self.logger.info("Product: "+data["product"]+"\n")
|
| 839 | + self.logger.info("Revision: "+data["revision"])
|
| 840 | +
|
| 841 | + @command
|
| 842 | + def readrawstorage(self, volume, sector, count, addr):
|
| 843 | + """
|
| 844 | + Reads <count> sectors starting at <sector> from storage <volume> to memory at <addr>.
|
| 845 | + """
|
| 846 | + volume = self._hexint(volume)
|
| 847 | + sector = self._hexint(sector)
|
| 848 | + count = self._hexint(count)
|
| 849 | + addr = self._hexint(addr)
|
| 850 | + self.logger.info("Reading volume %s sectors %X - %X to %08X..." % (volume, sector, sector + count - 1, addr))
|
| 851 | + self.embios.lib.dev.timeout = 50000
|
| 852 | + self.embios.storage_read_sectors_md(volume, sector, count, addr)
|
| 853 | + self.logger.info("done\n")
|
| 854 | +
|
| 855 | + @command
|
| 856 | + def writerawstorage(self, volume, sector, count, addr):
|
| 857 | + """
|
| 858 | + Writes memory contents at <addr> to <count> sectors starting at <sector> on storage <volume>.
|
| 859 | + """
|
| 860 | + volume = self._hexint(volume)
|
| 861 | + sector = self._hexint(sector)
|
| 862 | + count = self._hexint(count)
|
| 863 | + addr = self._hexint(addr)
|
| 864 | + self.logger.info("Writing %08X to volume %s sectors %X - %X..." % (addr, volume, sector, sector + count - 1))
|
| 865 | + self.embios.lib.dev.timeout = 50000
|
| 866 | + self.embios.storage_write_sectors_md(volume, sector, count, addr)
|
| 867 | + self.logger.info("done\n")
|
| 868 | +
|
| 869 | + @command
|
| 870 | + def readrawstoragefile(self, volume, sector, count, file, buffer = False, buffsize = "100000"):
|
| 871 | + """
|
| 872 | + Reads <count> sectors starting at <sector> from storage <volume> to file <file>,
|
| 873 | + buffering them in memory at <buffer> in chunks of <buffsize> bytes (both optional).
|
| 874 | + """
|
| 875 | + volume = self._hexint(volume)
|
| 876 | + sector = self._hexint(sector)
|
| 877 | + count = self._hexint(count)
|
| 878 | + if buffer == False: buffer = self.embios.lib.dev.usermem.lower
|
| 879 | + else: buffer = self._hexint(buffer)
|
| 880 | + buffsize = self._hexint(buffsize)
|
| 881 | + try:
|
| 882 | + f = open(file, 'wb')
|
| 883 | + except IOError:
|
| 884 | + raise ArgumentError("Could not open local file for writing.")
|
| 885 | + self.logger.info("Reading volume %s sectors %X - %X to %s..." % (volume, sector, sector + count - 1, file))
|
| 886 | + self.embios.lib.dev.timeout = 50000
|
| 887 | + storageinfo = self.embios.storage_get_info(volume)
|
| 888 | + while count > 0:
|
| 889 | + sectors = min(count, int(buffsize / storageinfo.sectorsize))
|
| 890 | + self.embios.storage_read_sectors_md(volume, sector, sectors, buffer)
|
| 891 | + f.write(self.embios.read(buffer, storageinfo.sectorsize * sectors))
|
| 892 | + sector = sector + sectors
|
| 893 | + count = count - sectors
|
| 894 | + f.close()
|
| 895 | + self.logger.info("done\n")
|
| 896 | +
|
| 897 | + @command
|
| 898 | + def writerawstoragefile(self, volume, sector, count, file, buffer = False, buffsize = "100000"):
|
| 899 | + """
|
| 900 | + Writes contents of <file> to <count> sectors starting at <sector> on storage <volume>,
|
| 901 | + buffering them in memory at <buffer> in chunks of <buffsize> bytes (both optional).
|
| 902 | + """
|
| 903 | + volume = self._hexint(volume)
|
| 904 | + sector = self._hexint(sector)
|
| 905 | + count = self._hexint(count)
|
| 906 | + if buffer == False: buffer = self.embios.lib.dev.usermem.lower
|
| 907 | + else: buffer = self._hexint(buffer)
|
| 908 | + buffsize = self._hexint(buffsize)
|
| 909 | + try:
|
| 910 | + f = open(file, 'rb')
|
| 911 | + except IOError:
|
| 912 | + raise ArgumentError("Could not open local file for reading.")
|
| 913 | + self.logger.info("Writing %s to volume %s sectors %X - %X..." % (file, volume, sector, sector + count - 1))
|
| 914 | + self.embios.lib.dev.timeout = 50000
|
| 915 | + storageinfo = self.embios.storage_get_info(volume)
|
| 916 | + while count > 0:
|
| 917 | + sectors = min(count, int(buffsize / storageinfo.sectorsize))
|
| 918 | + bytes = storageinfo.sectorsize * sectors
|
| 919 | + data = f.read(bytes)
|
| 920 | + if len(data) == 0: break
|
| 921 | + while len(data) < bytes: data = data + f.read(bytes - len(data))
|
| 922 | + self.embios.write(buffer, data)
|
| 923 | + self.embios.storage_write_sectors_md(volume, sector, sectors, buffer)
|
| 924 | + sector = sector + sectors
|
| 925 | + count = count - sectors
|
| 926 | + f.close()
|
| 927 | + self.logger.info("done\n")
|
| 928 | +
|
| 929 | + @command
|
829 | 930 | def mkdir(self, dirname):
|
830 | 931 | """
|
831 | 932 | Creates a directory
|
Index: embios/trunk/tools/libembios.py |
— | — | @@ -538,11 +538,14 @@ |
539 | 539 | count = 1
|
540 | 540 | self.ipodclassic_hddaccess(1, sector, count, tempaddr + offset)
|
541 | 541 |
|
542 | | - def storage_get_info(self):
|
| 542 | + def storage_get_info(self, volume):
|
543 | 543 | """ Get information about a storage device """
|
544 | | - result = self.lib.monitorcommand(struct.pack("IIII", 27, 0, 0, 0), "IIIIIIII", ("version", None, None, "sectorsize", "numsectors", "vendorptr", "productptr", "revisionptr"))
|
| 544 | + result = self.lib.monitorcommand(struct.pack("IIII", 27, volume, 0, 0), "IIIIIIII", ("version", None, None, "sectorsize", "numsectors", "vendorptr", "productptr", "revisionptr"))
|
545 | 545 | if result.version != 1:
|
546 | 546 | raise ValueError("Unknown version of storage_info struct: %d" % result.version)
|
| 547 | + result.vendor = self.readstring(result.vendorptr)
|
| 548 | + result.product = self.readstring(result.productptr)
|
| 549 | + result.revision = self.readstring(result.revisionptr)
|
547 | 550 | return result
|
548 | 551 |
|
549 | 552 | def storage_read_sectors_md(self, volume, sector, count, addr):
|