stlink: add dummy speed handlers
[fw/openocd] / src / jtag / stlink / stlink_transport.c
1 /***************************************************************************
2  *   Copyright (C) 2011 by Mathias Kuester                                 *
3  *   Mathias Kuester <kesmtp@freenet.de>                                   *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 /* project specific includes */
26 #include <jtag/interface.h>
27 #include <jtag/tcl.h>
28 #include <transport/transport.h>
29 #include <helper/time_support.h>
30 #include <target/target.h>
31 #include <jtag/stlink/stlink_tcl.h>
32 #include <jtag/stlink/stlink_interface.h>
33
34 COMMAND_HANDLER(stlink_transport_jtag_command)
35 {
36         LOG_DEBUG("stlink_transport_jtag_command");
37
38         return ERROR_OK;
39 }
40
41 static const struct command_registration
42 stlink_transport_stlink_subcommand_handlers[] = {
43         {
44          .name = "newtap",
45          .mode = COMMAND_CONFIG,
46          .jim_handler = jim_stlink_newtap,
47          .help = "Create a new TAP instance named basename.tap_type, "
48          "and appends it to the scan chain.",
49          .usage = "basename tap_type '-irlen' count "
50          "['-expected_id' number] ",
51          },
52
53         COMMAND_REGISTRATION_DONE
54 };
55
56 static const struct command_registration
57 stlink_transport_jtag_subcommand_handlers[] = {
58         {
59          .name = "init",
60          .mode = COMMAND_ANY,
61          .handler = stlink_transport_jtag_command,
62          },
63         {
64          .name = "arp_init",
65          .mode = COMMAND_ANY,
66          .handler = stlink_transport_jtag_command,
67          },
68         {
69          .name = "arp_init-reset",
70          .mode = COMMAND_ANY,
71          .handler = stlink_transport_jtag_command,
72          },
73         {
74          .name = "tapisenabled",
75          .mode = COMMAND_EXEC,
76          .jim_handler = jim_jtag_tap_enabler,
77          },
78         {
79          .name = "tapenable",
80          .mode = COMMAND_EXEC,
81          .jim_handler = jim_jtag_tap_enabler,
82          },
83         {
84          .name = "tapdisable",
85          .mode = COMMAND_EXEC,
86          .handler = stlink_transport_jtag_command,
87          },
88         {
89          .name = "configure",
90          .mode = COMMAND_EXEC,
91          .handler = stlink_transport_jtag_command,
92          },
93         {
94          .name = "cget",
95          .mode = COMMAND_EXEC,
96          .jim_handler = jim_jtag_configure,
97          },
98         {
99          .name = "names",
100          .mode = COMMAND_ANY,
101          .handler = stlink_transport_jtag_command,
102          },
103
104         COMMAND_REGISTRATION_DONE
105 };
106
107 static const struct command_registration stlink_transport_command_handlers[] = {
108
109         {
110          .name = "stlink",
111          .mode = COMMAND_ANY,
112          .help = "perform stlink actions",
113          .chain = stlink_transport_stlink_subcommand_handlers,
114          },
115         {
116          .name = "jtag",
117          .mode = COMMAND_ANY,
118          .chain = stlink_transport_jtag_subcommand_handlers,
119          },
120         COMMAND_REGISTRATION_DONE
121 };
122
123 static int stlink_transport_register_commands(struct command_context *cmd_ctx)
124 {
125         return register_commands(cmd_ctx, NULL,
126                                  stlink_transport_command_handlers);
127 }
128
129 static int stlink_transport_init(struct command_context *cmd_ctx)
130 {
131         LOG_DEBUG("stlink_transport_init");
132         struct target *t = get_current_target(cmd_ctx);
133
134         if (!t) {
135                 LOG_ERROR("stlink_transport_init: no current target");
136                 return ERROR_FAIL;
137
138         }
139
140         stlink_interface_open();
141
142         return stlink_interface_init_target(t);
143 }
144
145 static int stlink_transport_select(struct command_context *ctx)
146 {
147         LOG_DEBUG("stlink_transport_select");
148
149         int retval;
150
151         /* NOTE:  interface init must already have been done.
152          * That works with only C code ... no Tcl glue required.
153          */
154
155         retval = stlink_transport_register_commands(ctx);
156
157         if (retval != ERROR_OK)
158                 return retval;
159
160         return ERROR_OK;
161 }
162
163 static struct transport stlink_transport = {
164         .name = "stlink",
165         .select = stlink_transport_select,
166         .init = stlink_transport_init,
167 };
168
169 const char *stlink_transports[] = { "stlink", NULL };
170
171 static void stlink_constructor(void) __attribute__ ((constructor));
172 static void stlink_constructor(void)
173 {
174         transport_register(&stlink_transport);
175 }
176
177 bool transport_is_stlink(void)
178 {
179         return get_current_transport() == &stlink_transport;
180 }