README updates
This commit is contained in:
parent
0e7dc0010c
commit
fe209edbbb
44
README.md
44
README.md
|
@ -222,6 +222,50 @@ Example:
|
||||||
$ ./dmctl.py --conn cafe:1312 get-device-info
|
$ ./dmctl.py --conn cafe:1312 get-device-info
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### SUMP Logic Analyzer mode
|
||||||
|
|
||||||
|
The device can act as a logic analyzer, implementing the SUMP protocol. It
|
||||||
|
first needs to be put into mode 4, which can be done using the following
|
||||||
|
command:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./dmctl.sh set-mode 4
|
||||||
|
```
|
||||||
|
|
||||||
|
As soon as this is done, the SUMP logic analyzer should be available on the
|
||||||
|
first USB-CDC interface of the device. It can be used with a connection string
|
||||||
|
such as `ols:conn=/dev/ttyACM0` in sigrok and PulseView.
|
||||||
|
|
||||||
|
### XVC2DAP
|
||||||
|
|
||||||
|
`xvc2dap.py` is a Python script that implements a Xilinx Virtual Cable server
|
||||||
|
and talks to a CMSIS-DAP device, acting like a bridge between the two. This way,
|
||||||
|
you can use any CMSIS-DAP device (including this project) as a fake Xilinx
|
||||||
|
Platform Cable.
|
||||||
|
|
||||||
|
It requires pyOCD as a dependency (for its builtin `pydapaccess` module).
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./xvc2dap.py --help
|
||||||
|
usage: xvc2dap.py [-h] [--serial SERIAL] address [port]
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
address Host to bind to, for the XVC server, default localhost
|
||||||
|
port port to bind to, for the XVC server, default 2542
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
--serial SERIAL Connection string to the CMSIS-DAP device, as a serial
|
||||||
|
number, defaults to the first device found.
|
||||||
|
```
|
||||||
|
|
||||||
|
### USB Vendor interface protocol
|
||||||
|
|
||||||
|
The USB vendor interface protocol is described
|
||||||
|
[here](./wiki/USB-config-%26-command-protocol) in the wiki.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
TinyUSB is licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
TinyUSB is licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
||||||
|
|
|
@ -6,8 +6,6 @@ import struct
|
||||||
|
|
||||||
from typing import *
|
from typing import *
|
||||||
|
|
||||||
from pyocd.probe.pydapaccess import *
|
|
||||||
|
|
||||||
|
|
||||||
class EndOfStreamException(Exception): pass
|
class EndOfStreamException(Exception): pass
|
||||||
|
|
||||||
|
@ -67,14 +65,16 @@ def dap_split_jseq(nbits: int, tms: bytes, tdi: bytes) -> List[JtagSeq]:
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def get_dap(serial: Optional[str]) -> DAPAccess:
|
def get_dap(serial: Optional[str]) -> Any: #DAPAccess:
|
||||||
|
import pyocd.probe.pydapaccess as pydap
|
||||||
|
|
||||||
if serial is not None:
|
if serial is not None:
|
||||||
try:
|
try:
|
||||||
return DAPAccess.get_device(serial)
|
return pydap.DAPAccess.get_device(serial)
|
||||||
except Exception:# as e:
|
except Exception:# as e:
|
||||||
raise Exception("Could not find CMSIS-DAP device %s" % serial)
|
raise Exception("Could not find CMSIS-DAP device %s" % serial)
|
||||||
else:
|
else:
|
||||||
devs = DAPAccess.get_connected_devices()
|
devs = pydap.DAPAccess.get_connected_devices()
|
||||||
if len(devs) == 1:
|
if len(devs) == 1:
|
||||||
return devs[0]
|
return devs[0]
|
||||||
elif len(devs) == 0:
|
elif len(devs) == 0:
|
||||||
|
@ -97,7 +97,7 @@ def xvc_read_cmd(f) -> bytes:
|
||||||
r += bv
|
r += bv
|
||||||
|
|
||||||
|
|
||||||
def xvc_do_cmd(cmd, f, dap):
|
def xvc_do_cmd(cmd: bytes, f, dap):
|
||||||
if cmd == b"getinfo":
|
if cmd == b"getinfo":
|
||||||
# parameter is max vector len (in bits)
|
# parameter is max vector len (in bits)
|
||||||
# we use some value here (2k should be good enough), though in reality
|
# we use some value here (2k should be good enough), though in reality
|
||||||
|
@ -192,13 +192,19 @@ def xvc2dap_do(args: Any) -> int:
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
|
try:
|
||||||
|
import pyocd.probe.pydapaccess
|
||||||
|
except ImportError:
|
||||||
|
print("WARNING: pyocd module not found (not installed?), xvc2dap.py "+\
|
||||||
|
"will not work.")
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
parser.add_argument('--serial', type=str, default=None,
|
parser.add_argument('--serial', type=str, default=None,
|
||||||
help="Connection string to the CMSIS-DAP device, as "+\
|
help="Connection string to the CMSIS-DAP device, as "+\
|
||||||
"a serial number, defaults to the first device found.")
|
"a serial number, defaults to the first device found.")
|
||||||
|
|
||||||
parser.add_argument('address', type=str, default='localhost',
|
parser.add_argument('address', type=str, default='localhost', nargs='?',
|
||||||
help="Host to bind to, for the XVC server, default "+\
|
help="Host to bind to, for the XVC server, default "+\
|
||||||
"localhost")
|
"localhost")
|
||||||
parser.add_argument('port', type=int, default=2542, nargs='?',
|
parser.add_argument('port', type=int, default=2542, nargs='?',
|
||||||
|
|
Loading…
Reference in New Issue