mips_ejtag.c|h: use version specific IMPs
[fw/openocd] / contrib / rpc_examples / ocd_rpc_example.py
1 #!/usr/bin/env python3
2 """
3 OpenOCD RPC example, covered by GNU GPLv3 or later
4 Copyright (C) 2014 Andreas Ortmann (ortmann@finf.uni-hannover.de)
5
6
7 Example output:
8 ./ocd_rpc_example.py
9 echo says hi!
10
11 target state: halted
12 target halted due to debug-request, current mode: Thread
13 xPSR: 0x01000000 pc: 0x00000188 msp: 0x10000fd8
14
15 variable @ 0x10000000: 0x01c9c380
16
17 variable @ 0x10000000: 0xdeadc0de
18
19 memory (before): ['0xdeadc0de', '0x00000011', '0xaaaaaaaa', '0x00000023',
20 '0x00000042', '0x0000ffff']
21
22 memory (after): ['0x00000001', '0x00000000', '0xaaaaaaaa', '0x00000023',
23 '0x00000042', '0x0000ffff']
24 """
25
26 import socket
27 import itertools
28
29 def strToHex(data):
30     return map(strToHex, data) if isinstance(data, list) else int(data, 16)
31
32 def hexify(data):
33     return "<None>" if data is None else ("0x%08x" % data)
34
35 def compareData(a, b):
36     for i, j, num in zip(a, b, itertools.count(0)):
37         if i != j:
38             print("difference at %d: %s != %s" % (num, hexify(i), hexify(j)))
39
40
41 class OpenOcd:
42     COMMAND_TOKEN = '\x1a'
43     def __init__(self, verbose=False):
44         self.verbose = verbose
45         self.tclRpcIp       = "127.0.0.1"
46         self.tclRpcPort     = 6666
47         self.bufferSize     = 4096
48
49         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
50
51     def __enter__(self):
52         self.sock.connect((self.tclRpcIp, self.tclRpcPort))
53         return self
54
55     def __exit__(self, type, value, traceback):
56         try:
57             self.send("exit")
58         finally:
59             self.sock.close()
60
61     def send(self, cmd):
62         """Send a command string to TCL RPC. Return the result that was read."""
63         data = (cmd + OpenOcd.COMMAND_TOKEN).encode("utf-8")
64         if self.verbose:
65             print("<- ", data)
66
67         self.sock.send(data)
68         return self._recv()
69
70     def _recv(self):
71         """Read from the stream until the token (\x1a) was received."""
72         data = bytes()
73         while True:
74             chunk = self.sock.recv(self.bufferSize)
75             data += chunk
76             if bytes(OpenOcd.COMMAND_TOKEN, encoding="utf-8") in chunk:
77                 break
78
79         if self.verbose:
80             print("-> ", data)
81
82         data = data.decode("utf-8").strip()
83         data = data[:-1] # strip trailing \x1a
84
85         return data
86
87     def readVariable(self, address):
88         raw = self.send("ocd_mdw 0x%x" % address).split(": ")
89         return None if (len(raw) < 2) else strToHex(raw[1])
90
91     def readMemory(self, wordLen, address, n):
92         self.send("array unset output") # better to clear the array before
93         self.send("mem2array output %d 0x%x %d" % (wordLen, address, n))
94
95         output = self.send("ocd_echo $output").split(" ")
96
97         return [int(output[2*i+1]) for i in range(len(output)//2)]
98
99     def writeVariable(self, address, value):
100         assert value is not None
101         self.send("mww 0x%x 0x%x" % (address, value))
102
103     def writeMemory(self, wordLen, address, n, data):
104         array = " ".join(["%d 0x%x" % (a, b) for a, b in enumerate(data)])
105
106         self.send("array unset 1986ве1т") # better to clear the array before
107         self.send("array set 1986ве1т { %s }" % array)
108         self.send("array2mem 1986ве1т 0x%x %s %d" % (wordLen, address, n))
109
110 if __name__ == "__main__":
111
112     def show(*args):
113         print(*args, end="\n\n")
114
115     with OpenOcd() as ocd:
116         ocd.send("reset")
117
118         show(ocd.send("ocd_echo \"echo says hi!\"")[:-1])
119         show(ocd.send("capture \"ocd_halt\"")[:-1])
120
121         # Read the first few words at the RAM region (put starting adress of RAM
122         # region into 'addr')
123         addr = 0x10000000
124
125         value = ocd.readVariable(addr)
126         show("variable @ %s: %s" % (hexify(addr), hexify(value)))
127
128         ocd.writeVariable(addr, 0xdeadc0de)
129         show("variable @ %s: %s" % (hexify(addr), hexify(ocd.readVariable(addr))))
130
131         data = [1, 0, 0xaaaaaaaa, 0x23, 0x42, 0xffff]
132         wordlen = 32
133         n = len(data)
134
135         read = ocd.readMemory(wordlen, addr, n)
136         show("memory (before):", list(map(hexify, read)))
137
138         ocd.writeMemory(wordlen, addr, n, data)
139
140         read = ocd.readMemory(wordlen, addr, n)
141         show("memory  (after):", list(map(hexify, read)))
142
143         compareData(read, data)
144
145         ocd.send("resume")