blob: 0de0aea3b3aede610f553065aa67261132a27e47 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/* rswdp.h - remote serial wire debug protocol
2 *
3 * Copyright 2011 Brian Swetland <swetland@frotz.net>
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/* Remote Serial Wire Debug Protocol */
19
20#ifndef _RSWDP_PROTOCOL_H_
21#define _RSWDP_PROTOCOL_H_
22
23/* Basic framing:
24 * - host and device exchange "transactions" consisting of
25 * some number of "messages".
26 * - each "message" has a 32bit header and may have 0 or more
27 * 32bit words of payload
28 * - a transaction may not exceed 4K (1024 words)
29 * - a transaction is sent in a series of USB BULK packets
30 * - the final packet must be a short packet unless the
31 * transaction is exactly 4K in length
32 * - packets must be a multiple of 4 bytes
33 * - the first message in a transaction must be
34 * CMD_TXN_START or CMD_TXN_ASYNC
35 */
36
37#define RSWD_MSG(cmd,op,n) ((((cmd)&0xFF) << 24) | (((op) & 0xFF)<<16) | ((n) & 0xFFFF))
38#define RSWD_MSG_CMD(n) (((n) >> 24) & 0xFF)
39#define RSWD_MSG_OP(n) (((n) >> 16) & 0xFF)
40#define RSWD_MSG_ARG(n) ((n) & 0xFFFF)
41
42#define RSWD_TXN_START(seq) (0xAA770000 | ((seq) & 0xFFFF))
43#define RSWD_TXN_ASYNC (0xAA001111)
44
45/* valid: either */
46#define CMD_NULL 0x00 /* used for padding */
47
48/* valid: host to target */
49#define CMD_SWD_WRITE 0x01 /* op=addr arg=count payload: data x count */
50#define CMD_SWD_READ 0x02 /* op=addr arg=count payload: data x count */
51#define CMD_SWD_DISCARD 0x03 /* op=addr arg=count payload: none (discards) */
52#define CMD_ATTACH 0x04 /* do swdp reset/connect handshake */
53#define CMD_RESET 0x05 /* arg=1 -> assert RESETn, otherwise deassert */
54#define CMD_DOWNLOAD 0x06 /* arg=wordcount, payload: addr x 1, data x n */
55#define CMD_EXECUTE 0x07 /* payload: addr x 1 */
56#define CMD_TRACE 0x08 /* op=tracebits n=0 */
57#define CMD_BOOTLOADER 0x09 /* return to bootloader for reflashing */
58#define CMD_SET_CLOCK 0x0A /* set SWCLK rate to n khz */
59#define CMD_SWO_CLOCK 0x0B /* set SWOCLK rate to n khz, 0 = disable SWO */
60#define CMD_JTAG_IO 0x0C /* op=0, arg=bitcount, data x (count/32) * 2 */
61 /* tms, tdi word pairs per 32bits */
62#define CMD_JTAG_TX 0x0D /* tms=op.0, arg=bitcount, data x (count/32) words of tdi */
63#define CMD_JTAG_RX 0x0E /* tms=op.0, tdi=op.1, arg=bitcount, return (count/32) words */
64#define CMD_JTAG_VRFY 0x0F /* arg=bitcount, tms/tdi data/mask, error if tdo&mask != data */
65
66/* valid: target to host */
67#define CMD_STATUS 0x10 /* op=errorcode, arg=commands since last TXN_START */
68#define CMD_SWD_DATA 0x11 /* op=0 arg=count, payload: data x count */
69#define CMD_SWO_DATA 0x12 /* op=0 arg=count, payload: ((count+3)/4) words */
70#define CMD_JTAG_DATA 0x14 /* op=0 arg=bitcount, payload: (arg/32) words */
71
72/* valid: target to host async */
73#define CMD_DEBUG_PRINT 0x20 /* arg*4 bytes of ascii debug output */
74
75/* valid: bidirectional query/config messages */
76#define CMD_VERSION 0x30 /* arg=bcdversion (0x0100 etc) */
77#define CMD_BUILD_STR 0x31 /* arg=wordcount, payload = asciiz */
78#define CMD_BOARD_STR 0x32 /* arg=wordcount, payload = asciiz */
79#define CMD_RX_MAXDATA 0x33 /* arg=bytes, declares senders rx buffer size */
80#define CMD_CLOCK_KHZ 0x34 /* arg=khz, reports active clock rate */
81
82/* CMD_STATUS error codes */
83#define ERR_NONE 0
84#define ERR_INTERNAL 1
85#define ERR_TIMEOUT 2
86#define ERR_IO 3
87#define ERR_PARITY 4
88#define ERR_BAD_MATCH 5
89
90#define RSWD_VERSION 0x0102
91
92#define RSWD_VERSION_1_0 0x0100
93#define RSWD_VERSION_1_1 0x0101
94#define RSWD_VERSION_1_2 0x0102
95
96// Pre-1.0
97// - max packet size fixed at 2048 bytes
98//
99// Version 1.0
100// - CMD_VERSION, CMD_BUILD_STR, CMD_BOARD_STR, CMD_RX_MAXDATA,
101// CMD_CLOCK_KHZ added
102//
103// Version 1.1
104// - CMD_SWO_DATA arg is now byte count, not word count
105//
106// Version 1.2
107// - CMD_JTAG_IO, CMD_JTAG_RX, CMD_JTAG_TX, CMD_JTAG_VRFY, CMD_JTAG_DATA added
108
109/* CMD_SWD_OP operations - combine for direct AP/DP io */
110#define OP_RD 0x00
111#define OP_WR 0x01
112#define OP_DP 0x00
113#define OP_AP 0x02
114#define OP_X0 0x00
115#define OP_X4 0x04
116#define OP_X8 0x08
117#define OP_XC 0x0C
118
119/* DP registers */
120#define DP_IDCODE (OP_DP|OP_X0)
121#define DP_ABORT (OP_DP|OP_X0)
122#define DP_DPCTRL (OP_DP|OP_X4)
123#define DP_RESEND (OP_DP|OP_X8)
124#define DP_SELECT (OP_DP|OP_X8)
125#define DP_BUFFER (OP_DP|OP_XC)
126
127#endif