move docs to wiki
This commit is contained in:
parent
fe209edbbb
commit
b22f97694a
209
README.md
209
README.md
|
@ -59,212 +59,7 @@ Other options are:
|
|||
|
||||
## Usage
|
||||
|
||||
These microcontrollers support the following protocols:
|
||||
|
||||
| MCU | SWD | JTAG | UART | SPI (flashrom) | I2C | Other stuff |
|
||||
|:------ |:---:|:----:|:----:|:-------------- |:--- |:--------------- |
|
||||
| RP2040 | X | X | X | X | X | Planned |
|
||||
|
||||
The [original repository]() (Dapper
|
||||
Mime) supported only SWD and UART, and worked for the RP2040 Pico and the
|
||||
STM32F072 Discovery. This fork focusses on adding more protocols, but the
|
||||
author of this fork only has a Raspberry Pi Pico.
|
||||
|
||||
The pin mapping for the RP2040 is as follows:
|
||||
|
||||
| Pin number | Usage | Usage | Pin number |
|
||||
|:---------- |:-------------- | --------------:| ----------:|
|
||||
| GP0 | stdio UART TX | | VBUS |
|
||||
| GP1 | stdio UART RX | | VSYS |
|
||||
| GND | <ground> | <ground> | GND |
|
||||
| GP2 | SWCLK/TCK | | 3V3 EN |
|
||||
| GP3 | SWDIO/TMS | | 3V3 OUT |
|
||||
| GP4 | TDI | | ADC VREF |
|
||||
| GP5 | TDO | | GP28 / ADC2|
|
||||
| GND | <ground> | <ground> | GND / AGND|
|
||||
| GP6 | nTRST | | GP27 / ADC1|
|
||||
| GP7 | nRESET | | GP26 / ADC0|
|
||||
| GP8 | UART TX | | RUN |
|
||||
| GP9 | UART RX | (1-wire, TODO) | GP22 |
|
||||
| GND | <ground> | <ground> | GND |
|
||||
| GP10 | UART CTS | SCL | GP21 |
|
||||
| GP11 | UART RTS | SDA | GP20 |
|
||||
| GP12 | MISO | | GP19 |
|
||||
| GP13 | nCS | | GP18 |
|
||||
| GND | <ground> | <ground> | GND |
|
||||
| GP14 | SCLK | | GP17 |
|
||||
| GP15 | MOSI | | GP16 |
|
||||
| <end>| <bottom> | <bottom> | <end>|
|
||||
|
||||
On the RP2040, two USB CDC interfaces are exposed: the first is the UART
|
||||
interface, the second is for Serprog. If you have no other USB-CDC intefaces,
|
||||
these will be `/dev/ttyACM0` and `/dev/ttyACM1`, respectively. If you have
|
||||
enabled the `USE_USBCDC_FOR_STDIO` option, there will be a third device file.
|
||||
|
||||
### UART
|
||||
|
||||
The UART pins are for connecting to the device to be debugged, the data is
|
||||
echoed back over the USB CDC interface (typically a `/dev/ttyACMx` device on
|
||||
Linux). If you want to get stdio readout of this program on your computer,
|
||||
connect GP0 to GP5, and GP1 to GP4, or alternatively, use the
|
||||
`USE_USBCDC_FOR_STDIO` CMake flag, which adds an extra USB-CDC interface for
|
||||
which stdio is used exclusively, while disabling stdio on the UART.
|
||||
|
||||
### SWD and JTAG debugging
|
||||
|
||||
In SWD mode, the pin mapping is entirely as with the standard Picoprobe setup,
|
||||
as described in Chapter 5 and Appendix A of [Getting Started with Raspberry Pi
|
||||
Pico](https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf)
|
||||
|
||||
In JTAG mode, TCK and TMS have the same pins as SWCLK and SWDIO, respectively,
|
||||
TDI and TDO are on the next two consecutive free pins.
|
||||
|
||||
In your OpenOCD flags, use `-f interface/cmsis-dap.cfg`. Default transport is
|
||||
JTAG, if OpenOCD doesn't specify a default to the probe.
|
||||
|
||||
### Serprog/Flashrom
|
||||
|
||||
For Serprog, use the following `flashrom` options (if `/dev/ttyACM1` is the USB
|
||||
serial device on your machine corresponding to the Serprog CDC interface of the
|
||||
Pico):
|
||||
|
||||
```
|
||||
flashrom -c <flashchip> -p serprog:dev=/dev/ttyACM1:115200 <rest of the read/write cmd>
|
||||
```
|
||||
|
||||
Different serial speeds can be used, too. Serprog support is *techincally*
|
||||
untested, as in it does output the correct SPI commands as seen by my logic
|
||||
analyzer, but I don't have a SPI flash chip to test it on.
|
||||
|
||||
### SPI, I2C and temperature sensor
|
||||
|
||||
This functionality depends on custom kernel modules being loaded: In the
|
||||
`host/modules/` directory, one can find the sources and a Makefile.
|
||||
|
||||
After loading the modules (and modprobing `i2c-dev` and `spidev`), devices for
|
||||
these interfaces should appear in `/dev`.
|
||||
|
||||
SPI and I2C can be controlled using the standard tools for these (eg. the
|
||||
utilities from `i2c-tools` package), and the temperature sensor should show
|
||||
up in `lm_sensors`.
|
||||
|
||||
Using `i2cdetect -l`, you should be able to see which I2C device belongs to
|
||||
the tool:
|
||||
|
||||
```
|
||||
$ sudo i2cdetect -l
|
||||
[...]
|
||||
i2c-1 i2c i915 gmbus dpb I2C adapter
|
||||
i2c-8 i2c Radeon i2c bit bus 0x95 I2C adapter
|
||||
i2c-15 i2c dmj-i2c-1-1:1.0 I2C adapter
|
||||
i2c-6 i2c Radeon i2c bit bus 0x93 I2C adapter
|
||||
i2c-13 i2c AUX C/DDI C/PHY C I2C adapter
|
||||
```
|
||||
|
||||
#### I2C temperature sensor emulation
|
||||
|
||||
If the board/MCU has a builtin temperature sensor, a fake I2C device on the bus
|
||||
can optionally be enabled to use it as a Jedec JC42.2-compliant temperature
|
||||
sensor (the exact sensor emulated is the Microchip MCP9808). To have it show
|
||||
up in `sensors`, do the following (with `BUSNUM` the number from the above
|
||||
`i2cdetect -l` output):
|
||||
```
|
||||
$ ./dmctl.sh tempsensor --set 0x18 # need to give it an address first
|
||||
$ sudo modprobe jc42
|
||||
$ # now tell the jc42 module that the device can be found at this address
|
||||
$ echo "jc42 0x18" | sudo tee /sys/bus/i2c/devices/i2c-BUSNUM/new_device
|
||||
$ sudo sensors # it should show up now:
|
||||
jc42-i2c-BUSNUM-18
|
||||
Adapter: i2c-tiny-usb at bus 001 device 032
|
||||
temp1: +23.1°C (low = -20.0°C)
|
||||
(high = +75.0°C, hyst = +75.0°C)
|
||||
(crit = +80.0°C, hyst = +80.0°C)
|
||||
```
|
||||
|
||||
Temperature readout may be a bit higher than the ambient temperature.
|
||||
|
||||
### Runtime configuration
|
||||
|
||||
Several settings can be applied at runtime, using the `dmctl` Python script.
|
||||
Settings are communicated over a vendor USB interface.
|
||||
|
||||
```
|
||||
$ ./dmctl.sh --help
|
||||
usage: dmctl [-h] [--conn CONN] subcommand ...
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--conn CONN Connection string. Either a dmj-char device in /dev, a USB
|
||||
bus.device number, or a USB VID:PID pair. Defaults to trying
|
||||
/dev/dmj-* (if there is only one), and cafe:1312 otherwise.
|
||||
|
||||
subcommands:
|
||||
For more info on each subcommand, run the program with 'subcommand --help' as
|
||||
arguments.
|
||||
|
||||
subcommand Command to send to the device
|
||||
get-device-info
|
||||
Shows device info
|
||||
get-mode-info Shows mode info. A mode can optionally be specified, default
|
||||
is the current mode.
|
||||
set-mode Set the device mode
|
||||
uart-cts-rts Get, enable/disable UART hardware flow control
|
||||
tempsensor Get or set the IRC emulation enable/address of the
|
||||
temperature sensor.
|
||||
jtag-scan JTAG pinout scanner
|
||||
sump-overclock
|
||||
SUMP logic analyzer overclock settings
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
$ ./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.
|
||||
For detailed usage notes, please visit the [wiki](https://git.lain.faith/sys64738/DapperMime-JTAG/wiki/Home).
|
||||
|
||||
## License
|
||||
|
||||
|
@ -303,7 +98,7 @@ projects. These respective licenses can be found in
|
|||
- interface 1 ("B"): index 2, epin 0x04, epout 0x83
|
||||
- interface 2 ("C"): index 3, epin 0x06, epout 0x85
|
||||
- interface 3 ("D"): index 4, epin 0x08, epout 0x87
|
||||
- or, FX2 emulation mode??? (useful links: https://sigrok.org/wiki/Fx2lafw ; https://sigrok.org/wiki/CWAV_USBee_SX/Info )
|
||||
- ~~or, FX2 emulation mode??? (useful links: https://sigrok.org/wiki/Fx2lafw ; https://sigrok.org/wiki/CWAV_USBee_SX/Info )~~ has a ROM/fw and everything, so, maybe not
|
||||
- [ ] Mode where you can define custom PIO stuff for custom pinouts/protocols??????
|
||||
- Maybe also with code that auto-reacts to stuff from the environment?
|
||||
- [ ] Facedancer implementation by connecting two picos via GPIO, one doing host
|
||||
|
|
|
@ -201,14 +201,14 @@ def main() -> int:
|
|||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument('--serial', type=str, default=None,
|
||||
help="Connection string to the CMSIS-DAP device, as "+\
|
||||
"a serial number, defaults to the first device found.")
|
||||
help="Connect to the CMSIS-DAP device with the "+\
|
||||
"specified serial number, defaults to the first device found.")
|
||||
|
||||
parser.add_argument('address', type=str, default='localhost', nargs='?',
|
||||
help="Host to bind to, for the XVC server, default "+\
|
||||
"localhost")
|
||||
parser.add_argument('port', type=int, default=2542, nargs='?',
|
||||
help="port to bind to, for the XVC server, default 2542")
|
||||
help="Port to bind to, for the XVC server, default 2542")
|
||||
|
||||
args = parser.parse_args()
|
||||
return xvc2dap_do(args)
|
||||
|
|
Loading…
Reference in New Issue