Remote probe protocol

PyOCD provides a server and client for sharing and accessing debug probes across a TCP/IP network connection. This document describes the protocol design, available commands, and semantics.

Protocol

The protocol is very simple. Each request from the client is a single line comprised of the request encoded as JSON and followed by a single LF character (0x0A). The response from the server is the same format, with a JSON encoded reply plus LF.

A unique request ID is sent with every request. The response includes the ID of the request to which it belongs.

All requests are sent by the client. (A notification system from server to client may be added.)

Request structure

{
  "id": <int>,
  "request": <str>,
  "arguments": [
  ]
}

The arguments key is a list of any arguments for the command. It may be elided if there are no arguments required.

Response structure

{
  "id": <int>,
  "status": <int>,
  ["error": <str>,]
  ["result": <value>]
}

A successful response must have a status value of 0. A non-zero status indicates that an error occurred, and must be accompanied by an error key with an error message (may be the empty string). If the response is successful, then a result key may be included with the return value of the command. If there is no return value, then result is excluded.

Commands

The commands in the table below correspond directly to the methods of DebugProbe.

Command Arguments Result
hello version:int  
readprop    
open    
close    
lock    
unlock    
connect protocol:str  
disconnect    
swj_sequence length:int, bits:int  
set_clock freq:int  
reset    
assert_reset asserted:bool  
is_reset_asserted    
flush    
read_dp addr:int int
write_dp addr:int, data:int  
read_ap addr:int int
write_ap addr:int, data:int  
read_ap_multiple addr:int, count:int List[int]
write_ap_multiple addr:int, data:List[int]  
swo_start baudrate:int  
swo_stop    
swo_read   List[int]
get_memory_interface_for_ap ap_address_version:int, ap_nominal_address:int Option[int]
read_mem handle:int, addr:int, xfer_size:int int
write_mem handle:int, addr:int, value:int, xfer_size:int  
read_block32 handle:int, addr:int, word_count:int List[int]
write_block32 handle:int, addr:int, data:List[int]  
read_block8 handle:int, addr:int, word_count:int List[int]
write_block8 handle:int, addr:int, data:List[int]  

Semantics

The hello command includes the version of the remote probe protocol supported by the client. The server will return an error if this version doesn’t match the version of the protocol supported by the server.

Multiple clients may connect to a single remote probe. The server manages the requests to ensure that the underlying probe is only opened and connected once. The first client to connect a probe gets to choose the wire protocol (e.g., SWD or JTAG); subsequent connect are effectively ignored. Counts of clients who have opened and connected the probe are maintained so it is disconnected and closed when the last client disconnects and closes.