| Line 839... |
Line 839... |
| 839 |
datafile = open(filenameprefix+"_data.bin", 'rb')
|
839 |
datafile = open(filenameprefix+"_data.bin", 'rb')
|
| 840 |
sparefile = open(filenameprefix+"_spare.bin", 'rb')
|
840 |
sparefile = open(filenameprefix+"_spare.bin", 'rb')
|
| 841 |
except IOError:
|
841 |
except IOError:
|
| 842 |
raise ArgumentError("Can not open input files!")
|
842 |
raise ArgumentError("Can not open input files!")
|
| 843 |
try:
|
843 |
try:
|
| 844 |
buf = self.emcore.memalign(0x10, banks * ppb * 0x844)
|
844 |
buf = self.emcore.memalign(0x10, 0x844)
|
| 845 |
for block in range(info["blocks"]):
|
845 |
for block in range(info["blocks"]):
|
| 846 |
for bank in range(info["banks"]):
|
846 |
for bank in range(info["banks"]):
|
| 847 |
self.logger.info("\r Erasing block %d bank %d" % (block, bank))
|
847 |
self.logger.info("\r Erasing block %d bank %d " % (block, bank))
|
| 848 |
self.emcore.ipodnano2g_nanderase(buf, block * banks + bank, 1)
|
848 |
self.emcore.ipodnano2g_nanderase(buf, block * banks + bank, 1)
|
| 849 |
rc = struct.unpack("<I", self.emcore.read(buf, 4))[0]
|
849 |
rc = struct.unpack("<I", self.emcore.read(buf, 4))[0]
|
| 850 |
if rc != 0: self.logger.info("\rBlock %d bank %d erase failed with RC %08X\n" % (block, bank, rc))
|
850 |
if rc != 0: self.logger.info("\rBlock %d bank %d erase failed with RC %08X\n" % (block, bank, rc))
|
| 851 |
self.logger.info("\r Uploading block %d data " % block)
|
- |
|
| 852 |
self.emcore.write(buf, datafile.read(banks * ppb * 2048))
|
- |
|
| 853 |
self.emcore.write(buf + banks * ppb * 2048, sparefile.read(banks * ppb * 64))
|
- |
|
| 854 |
self.logger.info("\rProgramming block %d " % block)
|
- |
|
| 855 |
self.emcore.ipodnano2g_nandwrite(buf, block * banks * ppb, banks * ppb, 0)
|
- |
|
| 856 |
rc = struct.unpack("<%dI" % (banks * ppb), self.emcore.read(buf + banks * ppb * 2112, banks * ppb * 4))
|
- |
|
| 857 |
for page in range(ppb):
|
851 |
for page in range(ppb):
|
| 858 |
for bank in range(banks):
|
852 |
for bank in range(banks):
|
| - |
|
853 |
data = datafile.read(2048) + sparefile.read(64)
|
| 859 |
if rc[banks * page + bank] != 0:
|
854 |
if data == "\xff" * 2112: continue
|
| - |
|
855 |
self.emcore.write(buf, data)
|
| - |
|
856 |
self.logger.info("\rProgramming block %d page %d bank %d" % (block, page, bank))
|
| - |
|
857 |
self.emcore.ipodnano2g_nandwrite(buf, ((block * ppb) + page) * banks + bank, 1, 0)
|
| - |
|
858 |
rc = struct.unpack("<I", self.emcore.read(buf + 2112, 4))[0]
|
| 860 |
self.logger.info("\rBlock %d bank %d page %d programming failed with RC %08X\n" % (block, bank, page, rc[banks * page + bank]))
|
859 |
if rc != 0: self.logger.info("\rBlock %d bank %d page %d programming failed with RC %08X\n" % (block, bank, page, rc))
|
| 861 |
finally:
|
860 |
finally:
|
| 862 |
self.emcore.free(buf)
|
861 |
self.emcore.free(buf)
|
| 863 |
datafile.close()
|
862 |
datafile.close()
|
| 864 |
sparefile.close()
|
863 |
sparefile.close()
|
| 865 |
self.logger.info("\rdone\n")
|
864 |
self.logger.info("\ndone\n")
|
| 866 |
|
865 |
|
| 867 |
@command
|
866 |
@command
|
| 868 |
def ipodnano2g_wipenand(self, filename, force=False):
|
867 |
def ipodnano2g_wipenand(self, filename, force=False):
|
| 869 |
"""
|
868 |
"""
|
| 870 |
Target-specific function: ipodnano2g
|
869 |
Target-specific function: ipodnano2g
|