| 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):
|