1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
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. *
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. *
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 ***************************************************************************/
23 /* project specific includes */
27 #include "configuration.h"
37 bitbang_interface_t
*bitbang_interface
;
39 int bitbang_execute_queue(void);
41 void bitbang_end_state(enum tap_state state
)
43 if (tap_move_map
[state
] != -1)
47 ERROR("BUG: %i is not a valid end state", state
);
52 void bitbang_state_move(void) {
55 u8 tms_scan
= TAP_MOVE(cur_state
, end_state
);
57 for (i
= 0; i
< 7; i
++)
59 tms
= (tms_scan
>> i
) & 1;
60 bitbang_interface
->write(0, tms
, 0);
61 bitbang_interface
->write(1, tms
, 0);
63 bitbang_interface
->write(0, tms
, 0);
65 cur_state
= end_state
;
68 void bitbang_runtest(int num_cycles
)
72 enum tap_state saved_end_state
= end_state
;
74 /* only do a state_move when we're not already in RTI */
75 if (cur_state
!= TAP_RTI
)
77 bitbang_end_state(TAP_RTI
);
81 /* execute num_cycles */
82 bitbang_interface
->write(0, 0, 0);
83 for (i
= 0; i
< num_cycles
; i
++)
85 bitbang_interface
->write(1, 0, 0);
86 bitbang_interface
->write(0, 0, 0);
89 /* finish in end_state */
90 bitbang_end_state(saved_end_state
);
91 if (cur_state
!= end_state
)
95 void bitbang_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
97 enum tap_state saved_end_state
= end_state
;
101 bitbang_end_state(TAP_SI
);
103 bitbang_end_state(TAP_SD
);
105 bitbang_state_move();
106 bitbang_end_state(saved_end_state
);
108 for (bit_cnt
= 0; bit_cnt
< scan_size
; bit_cnt
++)
110 if ((buffer
[bit_cnt
/8] >> (bit_cnt
% 8)) & 0x1) {
111 bitbang_interface
->write(0, (bit_cnt
==scan_size
-1) ? 1 : 0, 1);
112 bitbang_interface
->write(1, (bit_cnt
==scan_size
-1) ? 1 : 0, 1);
114 bitbang_interface
->write(0, (bit_cnt
==scan_size
-1) ? 1 : 0, 0);
115 bitbang_interface
->write(1, (bit_cnt
==scan_size
-1) ? 1 : 0, 0);
118 if (type
!= SCAN_OUT
)
120 if (bitbang_interface
->read())
121 buffer
[(bit_cnt
)/8] |= 1 << ((bit_cnt
) % 8);
123 buffer
[(bit_cnt
)/8] &= ~(1 << ((bit_cnt
) % 8));
128 bitbang_interface
->write(0, 0, 0);
129 bitbang_interface
->write(1, 0, 0);
136 if (cur_state
!= end_state
)
137 bitbang_state_move();
140 int bitbang_execute_queue(void)
142 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
147 if (!bitbang_interface
)
149 ERROR("BUG: Bitbang interface called, but not yet initialized");
158 #ifdef _DEBUG_JTAG_IO_
159 DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
161 if (cmd
->cmd
.end_state
->end_state
!= -1)
162 bitbang_end_state(cmd
->cmd
.end_state
->end_state
);
165 #ifdef _DEBUG_JTAG_IO_
166 DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
168 if (cmd
->cmd
.reset
->trst
== 1)
172 bitbang_interface
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
175 #ifdef _DEBUG_JTAG_IO_
176 DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
178 if (cmd
->cmd
.runtest
->end_state
!= -1)
179 bitbang_end_state(cmd
->cmd
.runtest
->end_state
);
180 bitbang_runtest(cmd
->cmd
.runtest
->num_cycles
);
183 #ifdef _DEBUG_JTAG_IO_
184 DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
186 if (cmd
->cmd
.statemove
->end_state
!= -1)
187 bitbang_end_state(cmd
->cmd
.statemove
->end_state
);
188 bitbang_state_move();
191 #ifdef _DEBUG_JTAG_IO_
192 DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
194 if (cmd
->cmd
.scan
->end_state
!= -1)
195 bitbang_end_state(cmd
->cmd
.scan
->end_state
);
196 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
197 type
= jtag_scan_type(cmd
->cmd
.scan
);
198 bitbang_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
199 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
200 return ERROR_JTAG_QUEUE_FAILED
;
205 #ifdef _DEBUG_JTAG_IO_
206 DEBUG("sleep", cmd
->cmd
.sleep
->us
);
208 jtag_sleep(cmd
->cmd
.sleep
->us
);
211 ERROR("BUG: unknown JTAG command type encountered");
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)