| Index: embios/trunk/tools/misc.py |
| — | — | @@ -27,6 +27,7 @@ |
| 28 | 28 | """
|
| 29 | 29 |
|
| 30 | 30 | import sys
|
| | 31 | +import libembiosdata
|
| 31 | 32 |
|
| 32 | 33 | class Logger(object):
|
| 33 | 34 | """
|
| — | — | @@ -87,6 +88,14 @@ |
| 88 | 89 | return repr(self.value)
|
| 89 | 90 |
|
| 90 | 91 |
|
| | 92 | +def gethwname(id):
|
| | 93 | + try:
|
| | 94 | + hwtype = libembiosdata.hwtypes[id]
|
| | 95 | + except KeyError:
|
| | 96 | + hwtype = "UNKNOWN (ID = " + self._hex(id) + ")"
|
| | 97 | + return hwtype
|
| | 98 | +
|
| | 99 | +
|
| 91 | 100 | def trimdoc(docstring):
|
| 92 | 101 | """
|
| 93 | 102 | Trims whitespace from docstrings
|
| Index: embios/trunk/tools/embios.py |
| — | — | @@ -31,7 +31,7 @@ |
| 32 | 32 |
|
| 33 | 33 | import libembios
|
| 34 | 34 | import libembiosdata
|
| 35 | | -from misc import Error, Logger, getfuncdoc
|
| | 35 | +from misc import Error, Logger, getfuncdoc, gethwname
|
| 36 | 36 |
|
| 37 | 37 |
|
| 38 | 38 | class NotImplementedError(Error):
|
| — | — | @@ -206,10 +206,7 @@ |
| 207 | 207 | <infotype> may be either of 'version', 'packetsize', 'usermemrange'.
|
| 208 | 208 | """
|
| 209 | 209 | if infotype == "version":
|
| 210 | | - try:
|
| 211 | | - hwtype = libembiosdata.hwtypes[self.embios.lib.dev.hwtypeid]
|
| 212 | | - except KeyError:
|
| 213 | | - hwtype = "UNKNOWN (ID = " + self._hex(self.embios.lib.dev.hwtypeid) + ")"
|
| | 210 | + hwtype = gethwname(self.embios.lib.dev.hwtypeid)
|
| 214 | 211 | self.logger.info("Connected to " + \
|
| 215 | 212 | libembiosdata.swtypes[self.embios.lib.dev.swtypeid] + \
|
| 216 | 213 | " v" + str(self.embios.lib.dev.version.majorv) + \
|
| Index: embios/trunk/tools/libembios.py |
| — | — | @@ -26,7 +26,7 @@ |
| 27 | 27 | import usb.core
|
| 28 | 28 | import libembiosdata
|
| 29 | 29 |
|
| 30 | | -from misc import Bunch, Error
|
| | 30 | +from misc import Bunch, Error, gethwname
|
| 31 | 31 | from functools import wraps
|
| 32 | 32 |
|
| 33 | 33 | class ArgumentError(Error):
|
| — | — | @@ -45,7 +45,7 @@ |
| 46 | 46 | pass
|
| 47 | 47 |
|
| 48 | 48 |
|
| 49 | | -def command(timeout = None):
|
| | 49 | +def command(timeout = None, target = None):
|
| 50 | 50 | """
|
| 51 | 51 | Decorator for all commands.
|
| 52 | 52 | It adds the "timeout" variable to all commands.
|
| — | — | @@ -57,8 +57,11 @@ |
| 58 | 58 | def decorator(func):
|
| 59 | 59 | @wraps(func)
|
| 60 | 60 | def wrapper(*args, **kwargs):
|
| | 61 | + self = args[0] # little cheat as it expects self being always the first argument
|
| 61 | 62 | # precommand stuff
|
| 62 | | - self = args[0] # little cheat as it expects self being always the first argument
|
| | 63 | + if target is not None:
|
| | 64 | + if self.lib.dev.hwtypeid != target:
|
| | 65 | + raise DeviceError("Wrong device for target-specific command. Expected \'" + gethwname(target) + "\' but got \'" + gethwname(self.lib.dev.hwtypeid) + "\'")
|
| 63 | 66 | timeout = None
|
| 64 | 67 | if "timeout" in kwargs.keys():
|
| 65 | 68 | timeout = kwargs['timeout']
|
| — | — | @@ -521,62 +524,55 @@ |
| 522 | 525 | """ Generates a HMAC-SHA1 hash of the buffer and saves it to 'destination' """
|
| 523 | 526 | return self.lib.monitorcommand(struct.pack("IIII", 26, addr, size, destination), "III", (None, None, None))
|
| 524 | 527 |
|
| 525 | | - @command()
|
| | 528 | + @command(target = 0x47324e49)
|
| 526 | 529 | def ipodnano2g_getnandinfo(self):
|
| 527 | 530 | """ Target-specific function: ipodnano2g
|
| 528 | 531 | Gathers some information about the NAND chip used
|
| 529 | 532 | """
|
| 530 | | - if self.lib.dev.hwtypeid != 0x47324e49: raise DeviceError("Wrong device for target-specific command.")
|
| 531 | 533 | return self.lib.monitorcommand(struct.pack("IIII", 0xffff0001, 0, 0, 0), "IHHHH", ("type", "pagesperblock", "banks", "userblocks", "blocks"))
|
| 532 | 534 |
|
| 533 | | - @command(timeout = 30000)
|
| | 535 | + @command(timeout = 30000, target = 0x47324e49)
|
| 534 | 536 | def ipodnano2g_nandread(self, addr, start, count, doecc, checkempty):
|
| 535 | 537 | """ Target-specific function: ipodnano2g
|
| 536 | 538 | Reads data from the NAND chip into memory
|
| 537 | 539 | """
|
| 538 | | - if self.lib.dev.hwtypeid != 0x47324e49: raise DeviceError("Wrong device for target-specific command.")
|
| 539 | 540 | return self.lib.monitorcommand(struct.pack("IIII", 0xffff0002, addr | (0x80000000 if doecc != 0 else 0) | (0x40000000 if checkempty != 0 else 0), start, count), "III", (None, None, None))
|
| 540 | 541 |
|
| 541 | | - @command(timeout = 30000)
|
| | 542 | + @command(timeout = 30000, target = 0x47324e49)
|
| 542 | 543 | def ipodnano2g_nandwrite(self, addr, start, count, doecc):
|
| 543 | 544 | """ Target-specific function: ipodnano2g
|
| 544 | 545 | Writes data to the NAND chip
|
| 545 | 546 | """
|
| 546 | | - if self.lib.dev.hwtypeid != 0x47324e49: raise DeviceError("Wrong device for target-specific command.")
|
| 547 | 547 | return self.lib.monitorcommand(struct.pack("IIII", 0xffff0003, addr | (0x80000000 if doecc != 0 else 0), start, count), "III", (None, None, None))
|
| 548 | 548 |
|
| 549 | | - @command(timeout = 30000)
|
| | 549 | + @command(timeout = 30000, target = 0x47324e49)
|
| 550 | 550 | def ipodnano2g_nanderase(self, addr, start, count):
|
| 551 | 551 | """ Target-specific function: ipodnano2g
|
| 552 | 552 | Erases blocks on the NAND chip and stores the results to memory
|
| 553 | 553 | """
|
| 554 | | - if self.lib.dev.hwtypeid != 0x47324e49: raise DeviceError("Wrong device for target-specific command.")
|
| 555 | 554 | return self.lib.monitorcommand(struct.pack("IIII", 0xffff0004, addr, start, count), "III", (None, None, None))
|
| 556 | 555 |
|
| 557 | | - @command()
|
| | 556 | + @command(target = 0x4c435049)
|
| 558 | 557 | def ipodclassic_gethddinfo(self):
|
| 559 | 558 | """ Target-specific function: ipodclassic
|
| 560 | 559 | Gather information about the hard disk drive
|
| 561 | 560 | """
|
| 562 | | - if self.lib.dev.hwtypeid != 0x4c435049: raise DeviceError("Wrong device for target-specific command.")
|
| 563 | 561 | return self.lib.monitorcommand(struct.pack("IIII", 0xffff0001, 0, 0, 0), "IQQII", ("identifyptr", "totalsectors", "virtualsectors", "bbtptr", "bbtsize"))
|
| 564 | 562 |
|
| 565 | | - @command(timeout = 30000)
|
| | 563 | + @command(timeout = 30000, target = 0x4c435049)
|
| 566 | 564 | def ipodclassic_hddaccess(self, type, sector, count, addr):
|
| 567 | 565 | """ Target-specific function: ipodclassic
|
| 568 | 566 | Access the hard disk, type = 0 (read) / 1 (write)
|
| 569 | 567 | """
|
| 570 | | - if self.lib.dev.hwtypeid != 0x4c435049: raise DeviceError("Wrong device for target-specific command.")
|
| 571 | 568 | rc = self.lib.monitorcommand(struct.pack("IIQIIII", 0xffff0002, type, sector, count, addr, 0, 0), "III", ("rc", None, None))
|
| 572 | 569 | if (rc > 0x80000000):
|
| 573 | 570 | raise DeviceError("HDD access (type=%d, sector=%d, count=%d, addr=0x%08X) failed with RC 0x%08X" % (type, sector, count, addr, rc))
|
| 574 | 571 |
|
| 575 | | - @command()
|
| | 572 | + @command(target = 0x4c435049)
|
| 576 | 573 | def ipodclassic_writebbt(self, bbt, tempaddr):
|
| 577 | 574 | """ Target-specific function: ipodclassic
|
| 578 | 575 | Write hard drive bad block table
|
| 579 | 576 | """
|
| 580 | | - if self.lib.dev.hwtypeid != 0x4c435049: raise DeviceError("Wrong device for target-specific command.")
|
| 581 | 577 | try:
|
| 582 | 578 | bbtheader = struct.unpack("<8s2024sQII512I", bbt[:4096])
|
| 583 | 579 | except struct.error:
|