Index: emcore/trunk/tools/emcore.py |
— | — | @@ -170,6 +170,8 @@ |
171 | 171 | """
|
172 | 172 | if type(something) == bool:
|
173 | 173 | return something
|
| 174 | + if something is None:
|
| 175 | + return False
|
174 | 176 | elif type(something) == int or type(something) == long:
|
175 | 177 | return bool(something)
|
176 | 178 | elif type(something == str):
|
— | — | @@ -195,7 +197,7 @@ |
196 | 198 | return int(something, 16)
|
197 | 199 | except ValueError:
|
198 | 200 | raise ArgumentTypeError("hexadecimal coded integer", "'"+str(something)+"'")
|
199 | | - elif type(something) == NoneType:
|
| 201 | + elif something is None:
|
200 | 202 | return None
|
201 | 203 | else:
|
202 | 204 | raise ArgumentTypeError("hexadecimal coded integer", "'"+str(something)+"'")
|
— | — | @@ -261,11 +263,11 @@ |
262 | 264 | self.emcore.poweroff(force)
|
263 | 265 |
|
264 | 266 | @command
|
265 | | - def uploadfile(self, addr, filename):
|
| 267 | + def uploadfile(self, filename, addr = None):
|
266 | 268 | """
|
267 | 269 | Uploads a file to the device
|
268 | | - <offset>: the address to upload the file to
|
269 | | - <filename>: the path to the file
|
| 270 | + <filename>: The path to the file
|
| 271 | + [addr]: The address to upload the file to. Allocates a chunk of memory if not given.
|
270 | 272 | """
|
271 | 273 | addr = self._hexint(addr)
|
272 | 274 | try:
|
— | — | @@ -272,12 +274,20 @@ |
273 | 275 | f = open(filename, 'rb')
|
274 | 276 | except IOError:
|
275 | 277 | raise ArgumentError("File not readable. Does it exist?")
|
276 | | - self.logger.info("Writing file '" + filename + \
|
277 | | - "' to memory at " + self._hex(addr) + "...")
|
| 278 | + if addr is not None:
|
| 279 | + self.logger.info("Writing file '" + filename + \
|
| 280 | + "' to memory at " + self._hex(addr) + "...\n")
|
| 281 | + else:
|
| 282 | + self.logger.info("Writing file '" + filename + " to an allocated memory region...\n")
|
278 | 283 | with f:
|
279 | | - self.emcore.write(addr, f.read())
|
| 284 | + if addr is not None:
|
| 285 | + self.emcore.write(addr, f.read())
|
| 286 | + else:
|
| 287 | + addr = self.emcore.upload(f.read())
|
| 288 | + size = f.tell()
|
280 | 289 | f.close()
|
281 | | - self.logger.info("done\n")
|
| 290 | + self.logger.info("Done uploading " + str(size) + " bytes to 0x" + self._hex(addr) + "\n")
|
| 291 | + return addr, size
|
282 | 292 |
|
283 | 293 | @command
|
284 | 294 | def downloadfile(self, addr, size, filename):
|
— | — | @@ -608,23 +618,23 @@ |
609 | 619 | self.emcore.bootflashwrite(addr_mem, addr_flash, size)
|
610 | 620 |
|
611 | 621 | @command
|
612 | | - def runfirmware(self, addr, filename):
|
| 622 | + def runfirmware(self, targetaddr, filename):
|
613 | 623 | """
|
614 | 624 | Uploads the firmware in <filename>
|
615 | | - to the address at <addr> and executes it.
|
| 625 | + to an allocated buffer and executes it at <targetaddr>.
|
616 | 626 | """
|
617 | | - addr = self._hexint(addr)
|
618 | | - self.uploadfile(addr, filename)
|
619 | | - self.execfirmware(addr)
|
| 627 | + targetaddr = self._hexint(targetaddr)
|
| 628 | + addr, size = self.uploadfile(filename)
|
| 629 | + self.execfirmware(targetaddr, addr, size)
|
620 | 630 |
|
621 | 631 | @command
|
622 | | - def execfirmware(self, addr):
|
| 632 | + def execfirmware(self, targetaddr, addr, size):
|
623 | 633 | """
|
624 | | - Executes the firmware at <addr>
|
| 634 | + Moves the firmware at <addr> with <size> to <targetaddr> and executes it
|
625 | 635 | """
|
626 | 636 | addr = self._hexint(addr)
|
627 | | - self.logger.info("Running firmware at "+self._hex(addr)+". Bye.")
|
628 | | - self.emcore.execfirmware(addr)
|
| 637 | + self.logger.info("Running firmware at "+self._hex(targetaddr)+". Bye.\n")
|
| 638 | + self.emcore.execfirmware(targetaddr, addr, size)
|
629 | 639 |
|
630 | 640 | @command
|
631 | 641 | def aesencrypt(self, addr, size, keyindex):
|
Index: emcore/trunk/tools/libemcore.py |
— | — | @@ -267,6 +267,16 @@ |
268 | 268 | return data
|
269 | 269 |
|
270 | 270 | @command()
|
| 271 | + def upload(self, data):
|
| 272 | + """ Allocates memory of the size of 'data' and uploads 'data' to that memory region.
|
| 273 | + Returns the address where 'data' is stored
|
| 274 | + """
|
| 275 | + addr = self.malloc(len(data))
|
| 276 | + self.logger.debug("Uploading %d bytes to 0x%x\n" % (len(data), addr))
|
| 277 | + self.write(addr, data)
|
| 278 | + return addr
|
| 279 | +
|
| 280 | + @command()
|
271 | 281 | def readstring(self, addr, maxlength = 256):
|
272 | 282 | """ Reads a zero terminated string from memory
|
273 | 283 | Reads only a maximum of 'maxlength' chars.
|
— | — | @@ -521,9 +531,10 @@ |
522 | 532 | return self.lib.monitorcommand(struct.pack("IIII", 23, memaddr, flashaddr, size), "III", (None, None, None))
|
523 | 533 |
|
524 | 534 | @command()
|
525 | | - def execfirmware(self, addr):
|
526 | | - """ Executes the firmware at 'addr' and passes all control to it. """
|
527 | | - return self.lib.monitorcommand(struct.pack("IIII", 24, addr, 0, 0))
|
| 535 | + def execfirmware(self, targetaddr, addr, size):
|
| 536 | + """ Moves the firmware at 'addr' with size 'size' to 'targetaddr' and passes all control to it. """
|
| 537 | + self.logger.debug("Moving firmware at 0x%x with the size %d to 0x%x and executing it\n" % (addr, size, targetaddr))
|
| 538 | + return self.lib.monitorcommand(struct.pack("IIII", 24, targetaddr, addr, size))
|
528 | 539 |
|
529 | 540 | @command(timeout = 30000)
|
530 | 541 | def aesencrypt(self, addr, size, keyindex):
|
— | — | @@ -823,13 +834,17 @@ |
824 | 835 | @command()
|
825 | 836 | def malloc(self, size):
|
826 | 837 | """ Allocates 'size' bytes and returns a pointer to the allocated memory """
|
| 838 | + self.logger.debug("Allocating %d bytes of memory\n" % size)
|
827 | 839 | result = self.lib.monitorcommand(struct.pack("IIII", 52, size, 0, 0), "III", ("ptr", None, None))
|
| 840 | + self.logger.debug("Allocated %d bytes of memory at 0x%x\n" % (size, result.ptr))
|
828 | 841 | return result.ptr
|
829 | 842 |
|
830 | 843 | @command()
|
831 | 844 | def memalign(self, align, size):
|
832 | 845 | """ Allocates 'size' bytes aligned to 'align' and returns a pointer to the allocated memory """
|
| 846 | + self.logger.debug("Allocating %d bytes of memory aligned to 0x%x\n" % (size, align))
|
833 | 847 | result = self.lib.monitorcommand(struct.pack("IIII", 53, align, size, 0), "III", ("ptr", None, None))
|
| 848 | + self.logger.debug("Allocated %d bytes of memory at 0x%x\n" % (size, result.ptr))
|
834 | 849 | return result.ptr
|
835 | 850 |
|
836 | 851 | @command()
|
— | — | @@ -838,17 +853,21 @@ |
839 | 854 | expanding or reducing the amount of memory available in the block.
|
840 | 855 | Returns a pointer to the reallocated memory.
|
841 | 856 | """
|
| 857 | + self.logger.debug("Reallocating 0x%x to have the new size %d\n" % (ptr, size))
|
842 | 858 | result = self.lib.monitorcommand(struct.pack("IIII", 54, ptr, size, 0), "III", ("ptr", None, None))
|
| 859 | + self.logger.debug("Reallocated memory at 0x%x to 0x%x with the new size %d\n" % (ptr, result.ptr, size))
|
843 | 860 | return result.ptr
|
844 | 861 |
|
845 | 862 | @command()
|
846 | 863 | def reownalloc(self, ptr, owner):
|
847 | 864 | """ Changes the owner of the memory allocation 'ptr' to the thread struct at addr 'owner' """
|
| 865 | + self.logger.debug("Changing owner of the memory region 0x%x to 0x%x" % (ptr, owner))
|
848 | 866 | return self.lib.monitorcommand(struct.pack("IIII", 55, ptr, owner, 0), "III", (None, None, None))
|
849 | 867 |
|
850 | 868 | @command()
|
851 | 869 | def free(self, ptr):
|
852 | 870 | """ Frees the memory space pointed to by 'ptr' """
|
| 871 | + self.logger.debug("Freeing the memory region at 0x%x\n" % ptr)
|
853 | 872 | return self.lib.monitorcommand(struct.pack("IIII", 56, addr, 0, 0), "III", (None, None, None))
|
854 | 873 |
|
855 | 874 |
|
— | — | @@ -868,7 +887,7 @@ |
869 | 888 | self.connected = True
|
870 | 889 |
|
871 | 890 | def monitorcommand(self, cmd, rcvdatatypes=None, rcvstruct=None):
|
872 | | - self.logger.debug("Sending monitorcommand\n")
|
| 891 | + self.logger.debug("Sending monitorcommand [0x%s]\n" % cmd[3::-1].encode("hex"))
|
873 | 892 | writelen = self.dev.cout(cmd)
|
874 | 893 | if rcvdatatypes:
|
875 | 894 | rcvdatatypes = "I" + rcvdatatypes # add the response
|