Index: embios/trunk/tools/embios.py |
— | — | @@ -46,6 +46,28 @@ |
47 | 47 | print " If <force> is 1, the poweroff will be forced, otherwise it will be gracefully,"
|
48 | 48 | print " which may take some time."
|
49 | 49 | print ""
|
| 50 | + print " i2crecv <bus> <slave> <addr> <size>"
|
| 51 | + print " Reads data from an I2C device"
|
| 52 | + print " <bus> the bus index"
|
| 53 | + print " <slave> the slave address"
|
| 54 | + print " <addr> the start address on the I2C device"
|
| 55 | + print " <size> the number of bytes to read"
|
| 56 | + print ""
|
| 57 | + print " i2csend <bus> <slave> <addr> <db1> <db2> ... <dbN>"
|
| 58 | + print " Writes data to an I2C device"
|
| 59 | + print " <bus> the bus index"
|
| 60 | + print " <slave> the slave address"
|
| 61 | + print " <addr> the start address on the I2C device"
|
| 62 | + print " <db1> ... <dbN> the data in single bytes, seperated by whitespaces, eg. 0x37 0x56 0x45 0x12"
|
| 63 | + print ""
|
| 64 | + print " getprocessinformation <offset> <size> / getprocinfo <offset> <size>"
|
| 65 | + print " Fetches data on the currently running processes"
|
| 66 | + print " <offset> the offset in the data field"
|
| 67 | + print " <size> the number of bytes to be fetched"
|
| 68 | + print " ATTENTION: this function will be print the information to the console window."
|
| 69 | + print " If several threads are running this might overflow the window,"
|
| 70 | + print " causing not everything to be shown."
|
| 71 | + print ""
|
50 | 72 | print " lockscheduler"
|
51 | 73 | print " Locks (freezes) the scheduler"
|
52 | 74 | print ""
|
— | — | @@ -93,10 +115,23 @@ |
94 | 116 | if len(argv) != 3: usage()
|
95 | 117 | dev.poweroff(int(argv[2]))
|
96 | 118 |
|
97 | | - elif argv[1] == "flushcaches":
|
98 | | - if len(argv) != 2: usage()
|
99 | | - dev.flushcaches()
|
| 119 | + elif argv[1] == "i2cread":
|
| 120 | + if len(argv) != 6: usage()
|
| 121 | + dev.i2crecv(int(argv[2]), int(argv[3]), int(argv[4]), int(argv[5]))
|
100 | 122 |
|
| 123 | + elif argv[1] == "i2csend":
|
| 124 | + if len(argv) < 6: usage()
|
| 125 | + data = ""
|
| 126 | + ptr = 5
|
| 127 | + while ptr < lean(argv):
|
| 128 | + data += struct.pack("<B", int(argv[ptr]))
|
| 129 | + ptr += 1
|
| 130 | + dev.i2csend(int(argv[2]), int(argv[3]), int(argv[4]), data)
|
| 131 | +
|
| 132 | + elif argv[1] == "getprocessinformation" or argv[1] == "getprocinfo":
|
| 133 | + if len(argv) != 4: usage()
|
| 134 | + dev.getprocinfo(int(argv[2]), int(argv[3]))
|
| 135 | +
|
101 | 136 | elif argv[1] == "lockscheduler":
|
102 | 137 | if len(argv) != 2: usage()
|
103 | 138 | dev.freezescheduler(1)
|
— | — | @@ -121,6 +156,10 @@ |
122 | 157 | if len(argv) != 9: usage()
|
123 | 158 | dev.createthread(int(argv[2]), int(argv[3]), int(argv[4]), int(argv[5]), int(argv[6]), int(argv[7]), int(argv[8]))
|
124 | 159 |
|
| 160 | + elif argv[1] == "flushcaches":
|
| 161 | + if len(argv) != 2: usage()
|
| 162 | + dev.flushcaches()
|
| 163 | +
|
125 | 164 | else: usage()
|
126 | 165 |
|
127 | 166 |
|
Index: embios/trunk/tools/libembios.py |
— | — | @@ -434,25 +434,27 @@ |
435 | 435 |
|
436 | 436 | self.handle.bulkWrite(self.__coutep, struct.pack("<IBBBBII", 8, bus, slave, addr, size, 0, 0))
|
437 | 437 | data = self.__getbulk(self.handle, self.__cinep, 0x10 + size)
|
438 | | - self.__checkstatus(data)
|
| 438 | + self.__checkstatus(response)
|
439 | 439 |
|
440 | | - self.__myprint(" done\n", silent)
|
| 440 | + self.__myprint(" done\n data was:\n%s\n" % (self.__gethexviewprintout(data[16:])), silent)
|
441 | 441 |
|
442 | 442 | return data[16:]
|
443 | 443 |
|
444 | 444 |
|
445 | 445 | def i2csend(self, bus, slave, addr, data, silent = 0):
|
| 446 | + size = len(data)
|
446 | 447 | if (size > self.cout_maxsize - 0x10) or (size > 0xFF):
|
447 | 448 | raise Exception ("The data exceeds the maximum amount that can be send with this instruction.")
|
448 | 449 |
|
449 | 450 | self.__myprint("Writing 0x%2x bytes to 0x%2x at I2C device at bus 0x%2x, slave adress 0x%2x ..." % (size, addr, bus, slave), silent)
|
450 | 451 |
|
451 | | - self.handle.bulkWrite(self.__coutep, struct.pack("<IBBBBII", 9, bus, slave, addr, len(data), 0, 0) + data)
|
452 | | - self.__checkstatus(self.__readstatus())
|
| 452 | + self.handle.bulkWrite(self.__coutep, struct.pack("<IBBBBII", 9, bus, slave, addr, size, 0, 0) + data)
|
| 453 | + response = self.__getbulk(self.handle, self.__cinep, 0x10)
|
| 454 | + self.__checkstatus(response)
|
453 | 455 |
|
454 | 456 | self.__myprint(" done\n", silent)
|
455 | | -
|
456 | 457 |
|
| 458 | +
|
457 | 459 | #=====================================================================================
|
458 | 460 |
|
459 | 461 | def readusbcon(self, size, outtype = "", file = "", silent = 0):
|
— | — | @@ -500,10 +502,12 @@ |
501 | 503 | struct.unpack("<IIII", response[:0x10])[2],
|
502 | 504 | struct.unpack("<IIII", response[:0x10])[3])
|
503 | 505 | , silent)
|
504 | | - self.__myprint(self.gethexviewprintout(response[0x10:], "", 1), silent)
|
| 506 | + self.__myprint(self.__gethexviewprintout(response[0x10:], "", 1), silent)
|
505 | 507 | self.__myprint("\n\n", silent)
|
506 | | -
|
507 | | - elif (outtype != ""): # none of the above and also not "" which would be return only
|
| 508 | +
|
| 509 | + elif (outtype == ""):
|
| 510 | + pass # return only
|
| 511 | + else:
|
508 | 512 | raise Exception ("Invalid argument for <outtype>: '%s'." % (outtype))
|
509 | 513 |
|
510 | 514 | self.__myprint(" done\n", silent)
|
— | — | @@ -638,11 +642,12 @@ |
639 | 643 |
|
640 | 644 | out = []
|
641 | 645 | out[0] = struct.unpack("<I", response[4:8])[0] # Process information struct version
|
642 | | - out[1] = struct.unpack("<I", response[4:8])[0] # Process information table size
|
| 646 | + out[1] = struct.unpack("<I", response[8:12])[0] # Process information table size
|
| 647 | + out[2] = response # raw received data
|
643 | 648 |
|
644 | 649 | if (struct.unpack("<I", response[4:8])[0] == 1): # Process information struct version == 1
|
645 | 650 | p = 0x10
|
646 | | - process_n = 2 # actually process 0, but there are alread two other elements in out
|
| 651 | + process_n = 3 # actually process 0, but there are alread three other elements in out
|
647 | 652 | while True:
|
648 | 653 | # regs ==================================================
|
649 | 654 | keylen = 16
|
— | — | @@ -829,14 +834,47 @@ |
830 | 835 |
|
831 | 836 | process_n += 1
|
832 | 837 |
|
| 838 | + procinfoprint = ""
|
833 | 839 |
|
| 840 | + try:
|
| 841 | + i = 0
|
| 842 | + while (out[0] == 1) and (!silent): # Process information struct version == 1 && !silent
|
| 843 | + processinfoprint += "--------------------------------------------------------------------------------"
|
| 844 | + processinfoprint += "R0: 0x%08x, R1: 0x%08x, R2: 0x%08x, R3: 0x%08x,\n\
|
| 845 | + R4: 0x%08x, R5: 0x%08x, R6: 0x%08x, R7: 0x%08x,\n\
|
| 846 | + R8: 0x%08x, R9: 0x%08x, R10: 0x%08x, R11: 0x%08x,\n\
|
| 847 | + R12: 0x%08x, R13: 0x%08x, LR: 0x%08x, PC: 0x%08x\n" \
|
| 848 | + % (out[i+3]['regs'][0], out[i+3]['regs'][1], out[i+3]['regs'][2], out[i+3]['regs'][3], \
|
| 849 | + out[i+3]['regs'][4], out[i+3]['regs'][5], out[i+3]['regs'][6], out[i+3]['regs'][7], \
|
| 850 | + out[i+3]['regs'][8], out[i+3]['regs'][9], out[i+3]['regs'][10], out[i+3]['regs'][11], \
|
| 851 | + out[i+3]['regs'][12], out[i+3]['regs'][13], out[i+3]['regs'][14], out[i+3]['regs'][15] )
|
| 852 | + processinfoprint += "cpsr: 0b%032b " % (out[i+3]['cpsr'])
|
| 853 | + states = ["THREAD_FREE", "THREAD_SUSPENDED", "THREAD_READY", "THREAD_RUNNING", "THREAD_BLOCKED", "THREAD_DEFUNCT", "THREAD_DEFUNCT_ACK"]
|
| 854 | + processinfoprint += "state: %s " % (states[out[i+3]['state']])
|
| 855 | + processinfoprint += "nameptr: 0x%08x\n" % (out[i+3]['namepointer'])
|
| 856 | + processinfoprint += "current cpu time: 0x%08x " % (out[i+3]['cputime_current'])
|
| 857 | + processinfoprint += "total cpu time: 0x%016x\n" % (out[i+3]['cputime_total'])
|
| 858 | + processinfoprint += "startusec: 0x%08x " % (out[i+3]['startusec'])
|
| 859 | + processinfoprint += "queue next ptr: 0x%08x\n" % (out[i+3]['queue_next_pointer'])
|
| 860 | + processinfoprint += "timeout: 0x%08x\n" % (out[i+3]['timeout'])
|
| 861 | + processinfoprint += "blocked since: 0x%08x " % (out[i+3]['blocked_since'])
|
| 862 | + processinfoprint += "blocked by ptr: 0x%08x\n" % (out[i+3]['blocked_by_pointer'])
|
| 863 | + processinfoprint += "stackptr: 0x%08x " % (out[i+3]['stackpointer'])
|
| 864 | + blocktype = ["THREAD_NOT_BLOCKED", "THREAD_BLOCK_SLEEP", "THREAD_BLOCK_MUTEX", "THREAD_BLOCK_WAKEUP", "THREAD_DEFUNCT_STKOV", "THREAD_DEFUNCT_PANIC"]
|
| 865 | + processinfoprint += "block type: %s\n" % (blocktype[out[i+3]['block_type']])
|
| 866 | + threadtype = ["USER_THREAD", "SYSTEM_THREAD"]
|
| 867 | + processinfoprint += "thread type: %s\n" % (threadtype[out[i+3]['thread_type']])
|
| 868 | + processinfoprint += "priority: 0x%02x " % (out[i+3]['priority'])
|
| 869 | + processinfoprint += "cpu load: 0x%02x\n" % (out[i+3]['cpuload'])
|
| 870 | +
|
| 871 | + except IndexError:
|
| 872 | + processinfoprint += "--------------------------------------------------------------------------------"
|
834 | 873 |
|
835 | | -
|
836 | 874 | self.__myprint(" done\n\
|
837 | 875 | Process information struct version: 0x%8x\n\
|
838 | 876 | Total size of process information table: 0x%8x\n\
|
839 | 877 | %s"
|
840 | | - % (struct.unpack("<I", response[4:8]), struct.unpack("<I", response[8:12]), hexprint)
|
| 878 | + % (out[0], out[1], procinfoprint)
|
841 | 879 | , silent)
|
842 | 880 |
|
843 | 881 | return out
|