| Line 118... |
Line 118... |
| 118 |
|
118 |
|
| 119 |
|
119 |
|
| 120 |
class Logger(object):
|
120 |
class Logger(object):
|
| 121 |
"""
|
121 |
"""
|
| 122 |
Simple stdout logger.
|
122 |
Simple stdout logger.
|
| 123 |
Loglevel 4 is most verbose, Loglevel 0 only say something if there is an error.
|
123 |
Loglevel 4 is most verbose, Loglevel 0: Only say something if there is an error.
|
| - |
|
124 |
The log function doesn't care about the loglevel and always logs to stdout.
|
| 124 |
"""
|
125 |
"""
|
| 125 |
def __init__(self):
|
126 |
def __init__(self):
|
| 126 |
# Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
|
127 |
# Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
|
| 127 |
self.loglevel = 3
|
128 |
self.loglevel = 3
|
| 128 |
|
129 |
|
| 129 |
def log(self, text):
|
130 |
def log(self, text):
|
| 130 |
sys.stdout.write(text)
|
131 |
sys.stdout.write(text)
|
| 131 |
|
132 |
|
| 132 |
def debug(self, text):
|
133 |
def debug(self, text):
|
| 133 |
if self.loglevel >= 3:
|
134 |
if self.loglevel >= 3:
|
| 134 |
self.log(text)
|
135 |
self.log("DEBUG: " + text)
|
| 135 |
|
136 |
|
| 136 |
def info(self, text):
|
137 |
def info(self, text):
|
| 137 |
if self.loglevel >= 2:
|
138 |
if self.loglevel >= 2:
|
| 138 |
self.log(text)
|
139 |
self.log(text)
|
| 139 |
|
140 |
|
| 140 |
def warning(self, text):
|
141 |
def warn(self, text):
|
| 141 |
if self.loglevel >= 1:
|
142 |
if self.loglevel >= 1:
|
| 142 |
self.log("WARNING: " + text)
|
143 |
self.log("WARNING: " + text)
|
| 143 |
|
144 |
|
| 144 |
def error(self, text):
|
145 |
def error(self, text):
|
| 145 |
self.log("ERROR: " + text)
|
146 |
self.log("ERROR: " + text)
|
| Line 267... |
Line 268... |
| 267 |
if infotype == "version":
|
268 |
if infotype == "version":
|
| 268 |
try:
|
269 |
try:
|
| 269 |
hwtype = libembiosdata.hwtypes[self.embios.lib.dev.hwtypeid]
|
270 |
hwtype = libembiosdata.hwtypes[self.embios.lib.dev.hwtypeid]
|
| 270 |
except KeyError:
|
271 |
except KeyError:
|
| 271 |
hwtype = "UNKNOWN (ID = " + self._hex(self.embios.lib.dev.hwtypeid) + ")"
|
272 |
hwtype = "UNKNOWN (ID = " + self._hex(self.embios.lib.dev.hwtypeid) + ")"
|
| - |
|
273 |
self.logger.info("Connected to " + \
|
| 272 |
self.logger.info("Connected to "+libembiosdata.swtypes[self.embios.lib.dev.swtypeid] + " v" + str(self.embios.lib.dev.version.majorv) + "." + str(self.embios.lib.dev.version.minorv) +
|
274 |
libembiosdata.swtypes[self.embios.lib.dev.swtypeid] + \
|
| - |
|
275 |
" v" + str(self.embios.lib.dev.version.majorv) + \
|
| - |
|
276 |
"." + str(self.embios.lib.dev.version.minorv) + \
|
| - |
|
277 |
"." + str(self.embios.lib.dev.version.patchv) + \
|
| 273 |
"." + str(self.embios.lib.dev.version.patchv) + " r" + str(self.embios.lib.dev.version.revision) + " running on " + hwtype + "\n")
|
278 |
" r" + str(self.embios.lib.dev.version.revision) + \
|
| - |
|
279 |
" running on " + hwtype + "\n")
|
| 274 |
|
280 |
|
| 275 |
elif infotype == "packetsize":
|
281 |
elif infotype == "packetsize":
|
| 276 |
self.logger.info("Maximum packet sizes: \n command out: " + str(self.embios.lib.dev.packetsizelimit.cout) + "\n command in: " + str(self.embios.lib.dev.packetsizelimit.cin) + "\n data in: " + str(self.embios.lib.dev.packetsizelimit.din) + "\n data out: " + str(self.embios.lib.dev.packetsizelimit.dout))
|
282 |
self.logger.info("Maximum packet sizes: \n command out: " + str(self.embios.lib.dev.packetsizelimit.cout) + \
|
| - |
|
283 |
"\n command in: " + str(self.embios.lib.dev.packetsizelimit.cin) + \
|
| - |
|
284 |
"\n data in: " + str(self.embios.lib.dev.packetsizelimit.din) + \
|
| - |
|
285 |
"\n data out: " + str(self.embios.lib.dev.packetsizelimit.dout))
|
| 277 |
|
286 |
|
| 278 |
elif infotype == "usermemrange":
|
287 |
elif infotype == "usermemrange":
|
| 279 |
resp = self.embios.getusermemrange()
|
288 |
resp = self.embios.getusermemrange()
|
| - |
|
289 |
self.logger.info("The user memory range is " + \
|
| - |
|
290 |
self._hex(self.embios.lib.dev.usermem.lower) + \
|
| - |
|
291 |
" - " + \
|
| 280 |
self.logger.info("The user memory range is "+self._hex(self.embios.lib.dev.usermem.lower)+" - "+self._hex(self.embios.lib.dev.usermem.upper - 1))
|
292 |
self._hex(self.embios.lib.dev.usermem.upper - 1))
|
| - |
|
293 |
|
| 281 |
else:
|
294 |
else:
|
| 282 |
raise ArgumentTypeError("one out of 'version', 'packetsize', 'usermemrange'", infotype)
|
295 |
raise ArgumentTypeError("one out of 'version', 'packetsize', 'usermemrange'", infotype)
|
| 283 |
|
296 |
|
| 284 |
@command
|
297 |
@command
|
| 285 |
def reset(self, force=False):
|
298 |
def reset(self, force=False):
|
| Line 315... |
Line 328... |
| 315 |
addr = self._hexint(addr)
|
328 |
addr = self._hexint(addr)
|
| 316 |
try:
|
329 |
try:
|
| 317 |
f = open(filename, 'rb')
|
330 |
f = open(filename, 'rb')
|
| 318 |
except IOError:
|
331 |
except IOError:
|
| 319 |
raise ArgumentError("File not readable. Does it exist?")
|
332 |
raise ArgumentError("File not readable. Does it exist?")
|
| 320 |
self.logger.info("Writing file '"+filename+"' to memory at "+self._hex(addr)+"...")
|
333 |
self.logger.info("Writing file '" + filename + \
|
| - |
|
334 |
"' to memory at " + self._hex(addr) + "...")
|
| 321 |
with f:
|
335 |
with f:
|
| 322 |
self.embios.write(addr, f.read())
|
336 |
self.embios.write(addr, f.read())
|
| 323 |
f.close()
|
337 |
f.close()
|
| 324 |
self.logger.info("done\n")
|
338 |
self.logger.info("done\n")
|
| 325 |
|
339 |
|
| Line 335... |
Line 349... |
| 335 |
size = self._hexint(size)
|
349 |
size = self._hexint(size)
|
| 336 |
try:
|
350 |
try:
|
| 337 |
f = open(filename, 'wb')
|
351 |
f = open(filename, 'wb')
|
| 338 |
except IOError:
|
352 |
except IOError:
|
| 339 |
raise ArgumentError("Can not open file for write!")
|
353 |
raise ArgumentError("Can not open file for write!")
|
| 340 |
self.logger.info("Reading data from address "+self._hex(addr)+" with the size "+self._hex(size)+" to '"+filename+"'...")
|
354 |
self.logger.info("Reading data from address " + self._hex(addr) + \
|
| - |
|
355 |
" with the size " + self._hex(size) + \
|
| - |
|
356 |
" to '"+filename+"'...")
|
| 341 |
with f:
|
357 |
with f:
|
| 342 |
f.write(self.embios.read(addr, size))
|
358 |
f.write(self.embios.read(addr, size))
|
| 343 |
f.close()
|
359 |
f.close()
|
| 344 |
self.logger.info("done\n")
|
360 |
self.logger.info("done\n")
|
| 345 |
|
361 |
|
| Line 354... |
Line 370... |
| 354 |
integer = self._hexint(integer)
|
370 |
integer = self._hexint(integer)
|
| 355 |
if integer > 0xFFFFFFFF:
|
371 |
if integer > 0xFFFFFFFF:
|
| 356 |
raise ArgumentError("Specified integer too long")
|
372 |
raise ArgumentError("Specified integer too long")
|
| 357 |
data = struct.pack("I", integer)
|
373 |
data = struct.pack("I", integer)
|
| 358 |
self.embios.write(addr, data)
|
374 |
self.embios.write(addr, data)
|
| - |
|
375 |
self.logger.info("Integer '" + self._hex(integer) + \
|
| 359 |
self.logger.info("Integer '"+self._hex(integer)+"' written successfully to "+self._hex(addr)+"\n")
|
376 |
"' written successfully to " + self._hex(addr) + "\n")
|
| 360 |
|
377 |
|
| 361 |
@command
|
378 |
@command
|
| 362 |
def downloadint(self, addr):
|
379 |
def downloadint(self, addr):
|
| 363 |
"""
|
380 |
"""
|
| 364 |
Downloads a single integer from the device and prints it to the console window
|
381 |
Downloads a single integer from the device and prints it to the console window
|
| 365 |
<addr>: the address to download the integer from
|
382 |
<addr>: the address to download the integer from
|
| 366 |
"""
|
383 |
"""
|
| 367 |
addr = self._hexint(addr)
|
384 |
addr = self._hexint(addr)
|
| 368 |
data = self.embios.read(addr, 4)
|
385 |
data = self.embios.read(addr, 4)
|
| 369 |
integer = struct.unpack("I", data)[0]
|
386 |
integer = struct.unpack("I", data)[0]
|
| 370 |
self.logger.info("Integer '"+self._hex(integer)+"' read from address "+self._hex(addr)+"\n")
|
387 |
self.logger.info("Integer '" + self._hex(integer) + \
|
| - |
|
388 |
"' read from address " + self._hex(addr) + "\n")
|
| 371 |
|
389 |
|
| 372 |
@command
|
390 |
@command
|
| 373 |
def i2cread(self, bus, slave, addr, size):
|
391 |
def i2cread(self, bus, slave, addr, size):
|
| 374 |
"""
|
392 |
"""
|
| 375 |
Reads data from an I2C device
|
393 |
Reads data from an I2C device
|
| Line 451... |
Line 469... |
| 451 |
bitmask = self._hexint(bitmask)
|
469 |
bitmask = self._hexint(bitmask)
|
| 452 |
text = ""
|
470 |
text = ""
|
| 453 |
for word in args:
|
471 |
for word in args:
|
| 454 |
text += word + " "
|
472 |
text += word + " "
|
| 455 |
text = text[:-1]
|
473 |
text = text[:-1]
|
| - |
|
474 |
self.logger.info("Writing '" + text + \
|
| 456 |
self.logger.info("Writing '"+text+"' to the device consoles identified with "+self._hex(bitmask)+"\n")
|
475 |
"' to the device consoles identified with " + self._hex(bitmask) + "\n")
|
| 457 |
self.embios.cwrite(text, bitmask)
|
476 |
self.embios.cwrite(text, bitmask)
|
| 458 |
|
477 |
|
| 459 |
@command
|
478 |
@command
|
| 460 |
def flushconsolebuffers(self, bitmask):
|
479 |
def flushconsolebuffers(self, bitmask):
|
| 461 |
"""
|
480 |
"""
|
| 462 |
flushes one or more of the device consoles' buffers.
|
481 |
flushes one or more of the device consoles' buffers.
|
| 463 |
<bitmask>: the bitmask of the consoles to be flushed
|
482 |
<bitmask>: the bitmask of the consoles to be flushed
|
| 464 |
"""
|
483 |
"""
|
| 465 |
bitmask = self._hexint(bitmask)
|
484 |
bitmask = self._hexint(bitmask)
|
| 466 |
self.logger.info("Flushing consoles identified with the bitmask "+self._hex(bitmask)+"\n")
|
485 |
self.logger.info("Flushing consoles identified with the bitmask " + \
|
| - |
|
486 |
self._hex(bitmask) + "\n")
|
| 467 |
self.embios.cflush(bitmask)
|
487 |
self.embios.cflush(bitmask)
|
| 468 |
|
488 |
|
| 469 |
@command
|
489 |
@command
|
| 470 |
def getprocinfo(self):
|
490 |
def getprocinfo(self):
|
| 471 |
"""
|
491 |
"""
|
| 472 |
Fetches data on the currently running processes
|
492 |
Fetches data on the currently running processes
|
| 473 |
"""
|
493 |
"""
|
| 474 |
import datetime
|
494 |
import datetime
|
| 475 |
threads = self.embios.getprocinfo()
|
495 |
threads = self.embios.getprocinfo()
|
| - |
|
496 |
cpuload = 1
|
| - |
|
497 |
threadload = 0
|
| - |
|
498 |
idleload = 0
|
| - |
|
499 |
for thread in threads:
|
| - |
|
500 |
if thread.priority != 0:
|
| - |
|
501 |
threadload += (thread.cpuload*100)/255
|
| - |
|
502 |
else:
|
| - |
|
503 |
idleload += (thread.cpuload*100)/255
|
| - |
|
504 |
coreload = 1 - (threadload + idleload)
|
| - |
|
505 |
cpuload = threadload + coreload
|
| 476 |
self.logger.info("The device has "+str(len(threads))+" running threads:\n\n")
|
506 |
self.logger.info("The device has " + str(len(threads)) + " running threads.\n" + \
|
| - |
|
507 |
"It is running at " + str(cpuload * 100) + "% cpu load with a core load of " + \
|
| - |
|
508 |
str(coreload * 100) + "%, a thread load of " + str(threadload * 100) + "% " + \
|
| - |
|
509 |
"and an idle load of " + str(idleload * 100) + "%\n\n")
|
| - |
|
510 |
self.logger.info("Thread dump:\n")
|
| 477 |
for thread in threads:
|
511 |
for thread in threads:
|
| 478 |
self.logger.info(" "+thread.name+":\n")
|
512 |
self.logger.info(" "+thread.name+":\n")
|
| 479 |
self.logger.info(" Thread id: "+str(thread.id)+"\n")
|
513 |
self.logger.info(" Thread id: " + str(thread.id)+"\n")
|
| 480 |
self.logger.info(" Thread type: "+thread.type+"\n")
|
514 |
self.logger.info(" Thread type: " + thread.type+"\n")
|
| 481 |
self.logger.info(" Thread state: "+thread.state+"\n")
|
515 |
self.logger.info(" Thread state: " + thread.state+"\n")
|
| 482 |
self.logger.info(" Block type: "+thread.block_type+"\n")
|
516 |
self.logger.info(" Block type: " + thread.block_type+"\n")
|
| 483 |
self.logger.info(" Blocked by: "+self._hex(thread.blocked_by_ptr)+"\n")
|
517 |
self.logger.info(" Blocked by: " + self._hex(thread.blocked_by_ptr)+"\n")
|
| 484 |
self.logger.info(" Priority: "+str(thread.priority)+"/255\n")
|
518 |
self.logger.info(" Priority: " + str(thread.priority)+"/255\n")
|
| 485 |
self.logger.info(" Current CPU load: "+str((thread.cpuload*100)/255)+"%\n")
|
519 |
self.logger.info(" Current CPU load: "+str((thread.cpuload*100)/255)+"%\n")
|
| 486 |
self.logger.info(" CPU time (total): "+str(datetime.timedelta(microseconds=thread.cputime_total))+"\n")
|
520 |
self.logger.info(" CPU time (total): "+str(datetime.timedelta(microseconds=thread.cputime_total))+"\n")
|
| 487 |
self.logger.info(" Stack address: "+self._hex(thread.stackaddr)+"\n")
|
521 |
self.logger.info(" Stack address: " + self._hex(thread.stackaddr)+"\n")
|
| 488 |
self.logger.info(" Registers:\n")
|
522 |
self.logger.info(" Registers:\n")
|
| 489 |
for registerrange in range(4):
|
523 |
for registerrange in range(4):
|
| 490 |
self.logger.info(" ")
|
524 |
self.logger.info(" ")
|
| 491 |
for register in range(registerrange, 16, 4):
|
525 |
for register in range(registerrange, 16, 4):
|
| 492 |
registerrepr = "r"+str(register)
|
526 |
registerrepr = "r"+str(register)
|
| Line 555... |
Line 589... |
| 555 |
stackpointer = self._hexint(stackpointer)
|
589 |
stackpointer = self._hexint(stackpointer)
|
| 556 |
stacksize = self._hexint(stacksize)
|
590 |
stacksize = self._hexint(stacksize)
|
| 557 |
priority = self._hexint(priority)
|
591 |
priority = self._hexint(priority)
|
| 558 |
data = self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state)
|
592 |
data = self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state)
|
| 559 |
name = self.embios.readstring(nameptr)
|
593 |
name = self.embios.readstring(nameptr)
|
| - |
|
594 |
self.logger.info("Created a thread with the threadid " + data.id + \
|
| - |
|
595 |
", the name \"" + name + "\"" + \
|
| - |
|
596 |
", the entrypoint at " + self._hex(entrypoint) + \
|
| - |
|
597 |
", the stack at " + self._hex(stackpointer) + \
|
| - |
|
598 |
" with a size of " + self._hex(stacksize) + \
|
| 560 |
self.logger.info("Created a thread with the threadid " + data.id + ", the name \"" + name + "\", the entrypoint at " + self._hex(entrypoint) + ", the stack at " + self._hex(stackpointer) + " with a size of " + self._hex(stacksize) + " and a priority of " + self._hex(priority) + "\n")
|
599 |
" and a priority of " + self._hex(priority) + "\n")
|
| 561 |
|
600 |
|
| 562 |
@command
|
601 |
@command
|
| 563 |
def run(self, filename):
|
602 |
def run(self, filename):
|
| 564 |
"""
|
603 |
"""
|
| 565 |
Uploads the emBIOS application <filename> to
|
604 |
Uploads the emBIOS application <filename> to
|
| Line 618... |
Line 657... |
| 618 |
"""
|
657 |
"""
|
| 619 |
addr_flash = self._hexint(addr_flash)
|
658 |
addr_flash = self._hexint(addr_flash)
|
| 620 |
addr_mem = self._hexint(addr_mem)
|
659 |
addr_mem = self._hexint(addr_mem)
|
| 621 |
size = self._hexint(size)
|
660 |
size = self._hexint(size)
|
| 622 |
force = self._bool(force)
|
661 |
force = self._bool(force)
|
| 623 |
self.logger.info("Writing boot flash from the memory in "+self._hex(addr_mem)+" - "+
|
662 |
self.logger.warn("Writing boot flash from the memory in "+self._hex(addr_mem)+" - "+
|
| 624 |
hex(addr_mem+size)+" to "+self._hex(addr_flash)+" - "+self._hex(addr_flash+size)+"\n")
|
663 |
hex(addr_mem+size)+" to "+self._hex(addr_flash)+" - "+self._hex(addr_flash+size)+"\n")
|
| 625 |
if force == False:
|
664 |
if force == False:
|
| 626 |
self.logger.info("If this was not what you intended press Ctrl-C NOW")
|
665 |
self.logger.warn("If this was not what you intended press Ctrl-C NOW")
|
| 627 |
for i in range(10):
|
666 |
for i in range(10):
|
| 628 |
self.logger.info(".")
|
667 |
self.logger.info(".")
|
| 629 |
time.sleep(1)
|
668 |
time.sleep(1)
|
| 630 |
self.logger.info("\n")
|
669 |
self.logger.info("\n")
|
| 631 |
self.embios.lib.dev.timeout = 30000
|
670 |
self.embios.lib.dev.timeout = 30000
|
| Line 679... |
Line 718... |
| 679 |
"""
|
718 |
"""
|
| 680 |
addr = self._hexint(addr)
|
719 |
addr = self._hexint(addr)
|
| 681 |
size = self._hexint(size)
|
720 |
size = self._hexint(size)
|
| 682 |
destination = self._hexint(destination)
|
721 |
destination = self._hexint(destination)
|
| 683 |
sha1size = 0x14
|
722 |
sha1size = 0x14
|
| 684 |
self.logger.info("Generating hmac-sha1 hash from the buffer at "+self._hex(addr)+" with the size "+self._hex(size)+
|
723 |
self.logger.info("Generating hmac-sha1 hash from the buffer at " + self._hex(addr) + \
|
| - |
|
724 |
" with the size " + self._hex(size) + " and saving it to " + \
|
| 685 |
" and saving it to "+self._hex(destination)+" - "+self._hex(destination+sha1size)+"...")
|
725 |
self._hex(destination) + " - " + self._hex(destination+sha1size) + "...")
|
| 686 |
self.embios.lib.dev.timeout = 30000
|
726 |
self.embios.lib.dev.timeout = 30000
|
| 687 |
self.embios.hmac_sha1(addr, size, destination)
|
727 |
self.embios.hmac_sha1(addr, size, destination)
|
| 688 |
self.logger.info("done\n")
|
728 |
self.logger.info("done\n")
|
| 689 |
data = self.embios.read(destination, sha1size)
|
729 |
data = self.embios.read(destination, sha1size)
|
| 690 |
hash = ord(data)
|
730 |
hash = ord(data)
|
| Line 695... |
Line 735... |
| 695 |
"""
|
735 |
"""
|
| 696 |
Target-specific function: ipodnano2g
|
736 |
Target-specific function: ipodnano2g
|
| 697 |
Gathers some information about the NAND chip used
|
737 |
Gathers some information about the NAND chip used
|
| 698 |
"""
|
738 |
"""
|
| 699 |
data = self.embios.ipodnano2g_getnandinfo()
|
739 |
data = self.embios.ipodnano2g_getnandinfo()
|
| 700 |
self.logger.info("NAND chip type: "+self._hex(data["type"])+"\n")
|
740 |
self.logger.info("NAND chip type: " + self._hex(data["type"])+"\n")
|
| 701 |
self.logger.info("Number of banks: "+str(data["banks"])+"\n")
|
741 |
self.logger.info("Number of banks: " + str(data["banks"])+"\n")
|
| 702 |
self.logger.info("Number of blocks: "+str(data["blocks"])+"\n")
|
742 |
self.logger.info("Number of blocks: " + str(data["blocks"])+"\n")
|
| 703 |
self.logger.info("Number of user blocks: "+str(data["userblocks"])+"\n")
|
743 |
self.logger.info("Number of user blocks: " + str(data["userblocks"])+"\n")
|
| 704 |
self.logger.info("Pages per block: "+str(data["pagesperblock"]))
|
744 |
self.logger.info("Pages per block: " + str(data["pagesperblock"]))
|
| 705 |
|
745 |
|
| 706 |
@command
|
746 |
@command
|
| 707 |
def ipodnano2g_nandread(self, addr, start, count, doecc, checkempty):
|
747 |
def ipodnano2g_nandread(self, addr, start, count, doecc, checkempty):
|
| 708 |
"""
|
748 |
"""
|
| 709 |
Target-specific function: ipodnano2g
|
749 |
Target-specific function: ipodnano2g
|
| Line 712... |
Line 752... |
| 712 |
addr = self._hexint(addr)
|
752 |
addr = self._hexint(addr)
|
| 713 |
start = self._hexint(start)
|
753 |
start = self._hexint(start)
|
| 714 |
count = self._hexint(count)
|
754 |
count = self._hexint(count)
|
| 715 |
doecc = int(doecc)
|
755 |
doecc = int(doecc)
|
| 716 |
checkempty = int(checkempty)
|
756 |
checkempty = int(checkempty)
|
| 717 |
self.logger.info("Reading "+self._hex(count)+" NAND pages starting at "+self._hex(start)+" to "+self._hex(addr)+"...")
|
757 |
self.logger.info("Reading " + self._hex(count) + " NAND pages starting at " + \
|
| - |
|
758 |
self._hex(start) + " to " + self._hex(addr) + "...")
|
| 718 |
self.embios.lib.dev.timeout = 30000
|
759 |
self.embios.lib.dev.timeout = 30000
|
| 719 |
self.embios.ipodnano2g_nandread(addr, start, count, doecc, checkempty)
|
760 |
self.embios.ipodnano2g_nandread(addr, start, count, doecc, checkempty)
|
| 720 |
self.logger.info("done\n")
|
761 |
self.logger.info("done\n")
|
| 721 |
|
762 |
|
| 722 |
@command
|
763 |
@command
|
| Line 727... |
Line 768... |
| 727 |
"""
|
768 |
"""
|
| 728 |
addr = self._hexint(addr)
|
769 |
addr = self._hexint(addr)
|
| 729 |
start = self._hexint(start)
|
770 |
start = self._hexint(start)
|
| 730 |
count = self._hexint(count)
|
771 |
count = self._hexint(count)
|
| 731 |
doecc = int(doecc)
|
772 |
doecc = int(doecc)
|
| 732 |
self.logger.info("Writing "+self._hex(count)+" NAND pages starting at "+self._hex(start)+" from "+self._hex(addr)+"...")
|
773 |
self.logger.info("Writing " + self._hex(count) + " NAND pages starting at " + \
|
| - |
|
774 |
self._hex(start) + " from " + self._hex(addr) + "...")
|
| 733 |
self.embios.lib.dev.timeout = 30000
|
775 |
self.embios.lib.dev.timeout = 30000
|
| 734 |
self.embios.ipodnano2g_nandwrite(addr, start, count, doecc)
|
776 |
self.embios.ipodnano2g_nandwrite(addr, start, count, doecc)
|
| 735 |
self.logger.info("done\n")
|
777 |
self.logger.info("done\n")
|
| 736 |
|
778 |
|
| 737 |
@command
|
779 |
@command
|
| Line 741... |
Line 783... |
| 741 |
Erases blocks on the NAND chip and stores the results to memory
|
783 |
Erases blocks on the NAND chip and stores the results to memory
|
| 742 |
"""
|
784 |
"""
|
| 743 |
addr = self._hexint(addr)
|
785 |
addr = self._hexint(addr)
|
| 744 |
start = self._hexint(start)
|
786 |
start = self._hexint(start)
|
| 745 |
count = self._hexint(count)
|
787 |
count = self._hexint(count)
|
| 746 |
self.logger.info("Erasing "+self._hex(count)+" NAND blocks starting at "+self._hex(start)+" and logging to "+self._hex(addr)+"...")
|
788 |
self.logger.info("Erasing " + self._hex(count) + " NAND blocks starting at " + \
|
| - |
|
789 |
self._hex(start) + " and logging to " + self._hex(addr) + "...")
|
| 747 |
self.embios.lib.dev.timeout = 30000
|
790 |
self.embios.lib.dev.timeout = 30000
|
| 748 |
self.embios.ipodnano2g_nanderase(addr, start, count)
|
791 |
self.embios.ipodnano2g_nanderase(addr, start, count)
|
| 749 |
self.logger.info("done\n")
|
792 |
self.logger.info("done\n")
|
| 750 |
|
793 |
|
| 751 |
@command
|
794 |
@command
|
| Line 761... |
Line 804... |
| 761 |
datafile = open(filenameprefix+"_data.bin", 'wb')
|
804 |
datafile = open(filenameprefix+"_data.bin", 'wb')
|
| 762 |
sparefile = open(filenameprefix+"_spare.bin", 'wb')
|
805 |
sparefile = open(filenameprefix+"_spare.bin", 'wb')
|
| 763 |
statusfile = open(filenameprefix+"_status.bin", 'wb')
|
806 |
statusfile = open(filenameprefix+"_status.bin", 'wb')
|
| 764 |
except IOError:
|
807 |
except IOError:
|
| 765 |
raise ArgumentError("Can not open file for writing!")
|
808 |
raise ArgumentError("Can not open file for writing!")
|
| 766 |
infofile.write("NAND chip type: "+self._hex(info["type"])+"\r\n")
|
809 |
infofile.write("NAND chip type: " + self._hex(info["type"]) + "\r\n")
|
| 767 |
infofile.write("Number of banks: "+str(info["banks"])+"\r\n")
|
810 |
infofile.write("Number of banks: " + str(info["banks"]) + "\r\n")
|
| 768 |
infofile.write("Number of blocks: "+str(info["blocks"])+"\r\n")
|
811 |
infofile.write("Number of blocks: " + str(info["blocks"]) + "\r\n")
|
| 769 |
infofile.write("Number of user blocks: "+str(info["userblocks"])+"\r\n")
|
812 |
infofile.write("Number of user blocks: "+ str(info["userblocks"]) + "\r\n")
|
| 770 |
infofile.write("Pages per block: "+str(info["pagesperblock"])+"\r\n")
|
813 |
infofile.write("Pages per block: " + str(info["pagesperblock"]) + "\r\n")
|
| 771 |
self.embios.lib.dev.timeout = 30000
|
814 |
self.embios.lib.dev.timeout = 30000
|
| 772 |
for i in range(info["banks"] * info["blocks"] * info["pagesperblock"] / 8192):
|
815 |
for i in range(info["banks"] * info["blocks"] * info["pagesperblock"] / 8192):
|
| 773 |
self.logger.info(".")
|
816 |
self.logger.info(".")
|
| 774 |
self.embios.ipodnano2g_nandread(0x08000000, i * 8192, 8192, 1, 1)
|
817 |
self.embios.ipodnano2g_nandread(0x08000000, i * 8192, 8192, 1, 1)
|
| 775 |
datafile.write(self.embios.read(0x08000000, 0x01000000))
|
818 |
datafile.write(self.embios.read(0x08000000, 0x01000000))
|
| Line 786... |
Line 829... |
| 786 |
"""
|
829 |
"""
|
| 787 |
Target-specific function: ipodnano2g
|
830 |
Target-specific function: ipodnano2g
|
| 788 |
Wipes the whole NAND chip and logs the result to a file
|
831 |
Wipes the whole NAND chip and logs the result to a file
|
| 789 |
<force>: Use this flag to suppress the 5 seconds delay
|
832 |
<force>: Use this flag to suppress the 5 seconds delay
|
| 790 |
"""
|
833 |
"""
|
| 791 |
self.logger.info("Wiping the whole NAND chip!\n")
|
834 |
self.logger.warn("Wiping the whole NAND chip!\n")
|
| 792 |
if force == False:
|
835 |
if force == False:
|
| 793 |
self.logger.info("If this was not what you intended press Ctrl-C NOW")
|
836 |
self.logger.warn("If this was not what you intended press Ctrl-C NOW")
|
| 794 |
for i in range(10):
|
837 |
for i in range(10):
|
| 795 |
self.logger.info(".")
|
838 |
self.logger.info(".")
|
| 796 |
time.sleep(1)
|
839 |
time.sleep(1)
|
| 797 |
self.logger.info("\n")
|
840 |
self.logger.info("\n")
|
| 798 |
info = self.embios.ipodnano2g_getnandinfo()
|
841 |
info = self.embios.ipodnano2g_getnandinfo()
|
| Line 1036... |
Line 1079... |
| 1036 |
self.embios.dir_close(handle)
|
1079 |
self.embios.dir_close(handle)
|
| 1037 |
|
1080 |
|
| 1038 |
if __name__ == "__main__":
|
1081 |
if __name__ == "__main__":
|
| 1039 |
if len(sys.argv) < 2:
|
1082 |
if len(sys.argv) < 2:
|
| 1040 |
usage("No command specified")
|
1083 |
usage("No command specified")
|
| 1041 |
interface = Commandline()
|
- |
|
| 1042 |
interface._parsecommand(sys.argv[1], sys.argv[2:])
|
- |
|
| 1043 |
|
1084 |
try:
|
| - |
|
1085 |
interface = Commandline()
|
| - |
|
1086 |
interface._parsecommand(sys.argv[1], sys.argv[2:])
|
| - |
|
1087 |
except KeyboardInterrupt:
|
| - |
|
1088 |
sys.exit()
|
| - |
|
1089 |
|
| 1044 |
|
1090 |
|