forked from heartscrytech/PySWD
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsimplejtag_l0.py
61 lines (50 loc) · 1.52 KB
/
simplejtag_l0.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import time
import logging
import serial
from SWDAdapterBase import *
CMD_WRITE_TMS = ord('8') # +1
CMD_WRITE_TCK = ord(' ') # +1 aka SWCLK
CMD_READ_TMS = ord('d') # aka SWDIO
RESP_ACK = ord('+')
RESP_NACK = ord('-')
RESP_VAL = ord('0')
class Adapter(SWDAdapterBase):
def __init__(self, options):
SWDAdapterBase.__init__(self)
if not options.port:
raise SWDInitError("Port parameter is required")
self.hwlog = logging.getLogger("hwcomm")
self.port = serial.Serial(port=options.port, baudrate=115200, timeout=0.1)
self.init_adapter()
self.JTAG2SWD()
def init_adapter(self):
pass
def cmd(self, cmd):
self.port.write(bytearray([cmd]))
resp = self.port.read(1)
print "%02x:%s" % (cmd, resp),
return ord(resp)
def readBits(self, num):
"Read 1-8 bits from SWD"
res = 0
mask = 1
for i in xrange(num):
self.cmd(CMD_WRITE_TCK | 1)
self.cmd(CMD_WRITE_TCK)
v = self.cmd(CMD_READ_TMS)
if v & 1:
res |= mask
mask <<= 1
print
self.hwlog.debug("Read %#02x", res)
return res
def writeBits(self, val, num):
"Write 1-8 bits to SWD"
v = val
for i in xrange(num):
self.cmd(CMD_WRITE_TCK | 1)
self.cmd(CMD_WRITE_TMS + 1 if val & 1 else CMD_WRITE_TMS)
self.cmd(CMD_WRITE_TCK)
val >>= 1
print
self.hwlog.debug("Wrote %#02x", v)