libftdi/swdptap.c: Substantial speed increase for bitbanging SWD.
Provide the swd sequences unrolled.
This commit is contained in:
parent
992ccf91a9
commit
fce25b9fd5
|
@ -18,8 +18,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* MPSSE bit-banging SW-DP interface over FTDI.
|
/* MPSSE bit-banging SW-DP interface over FTDI with loop unrolled.
|
||||||
* Slow, but usable.
|
* Speed is sensible.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -125,3 +125,107 @@ void swdptap_bit_out(bool val)
|
||||||
platform_buffer_write(cmd, 3);
|
platform_buffer_write(cmd, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool swdptap_seq_in_parity(uint32_t *res, int ticks)
|
||||||
|
{
|
||||||
|
int index = ticks + 1;
|
||||||
|
uint8_t cmd[4];
|
||||||
|
unsigned int parity = 0;
|
||||||
|
|
||||||
|
cmd[0] = MPSSE_TMS_IN_PORT;
|
||||||
|
cmd[1] = MPSSE_TMS_SHIFT;
|
||||||
|
cmd[2] = 0;
|
||||||
|
cmd[3] = 0;
|
||||||
|
swdptap_turnaround(1);
|
||||||
|
while (index--) {
|
||||||
|
platform_buffer_write(cmd, 4);
|
||||||
|
}
|
||||||
|
uint8_t data[33];
|
||||||
|
unsigned int ret = 0;
|
||||||
|
platform_buffer_read(data, ticks + 1);
|
||||||
|
if (data[ticks] & 0x08)
|
||||||
|
parity ^= 1;
|
||||||
|
while (ticks--) {
|
||||||
|
if (data[ticks] & MPSSE_TMS_IN_PIN) {
|
||||||
|
parity ^= 1;
|
||||||
|
ret |= (1 << ticks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*res = ret;
|
||||||
|
return parity;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t swdptap_seq_in(int ticks)
|
||||||
|
{
|
||||||
|
int index = ticks;
|
||||||
|
uint8_t cmd[4];
|
||||||
|
|
||||||
|
cmd[0] = MPSSE_TMS_IN_PORT;
|
||||||
|
cmd[1] = MPSSE_TMS_SHIFT;
|
||||||
|
cmd[2] = 0;
|
||||||
|
cmd[3] = 0;
|
||||||
|
|
||||||
|
swdptap_turnaround(1);
|
||||||
|
while (index--) {
|
||||||
|
platform_buffer_write(cmd, 4);
|
||||||
|
}
|
||||||
|
uint8_t data[32];
|
||||||
|
uint32_t ret = 0;
|
||||||
|
platform_buffer_read(data, ticks);
|
||||||
|
while (ticks--) {
|
||||||
|
if (data[ticks] & MPSSE_TMS_IN_PIN)
|
||||||
|
ret |= (1 << ticks);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void swdptap_seq_out(uint32_t MS, int ticks)
|
||||||
|
{
|
||||||
|
uint8_t cmd[15];
|
||||||
|
uint index = 0;
|
||||||
|
swdptap_turnaround(0);
|
||||||
|
while (ticks) {
|
||||||
|
cmd[index++] = MPSSE_TMS_SHIFT;
|
||||||
|
if (ticks >= 7) {
|
||||||
|
cmd[index++] = 6;
|
||||||
|
cmd[index++] = MS & 0x7f;
|
||||||
|
MS >>= 7;
|
||||||
|
ticks -= 7;
|
||||||
|
} else {
|
||||||
|
cmd[index++] = ticks - 1;
|
||||||
|
cmd[index++] = MS & 0x7f;
|
||||||
|
ticks = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
platform_buffer_write(cmd, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void swdptap_seq_out_parity(uint32_t MS, int ticks)
|
||||||
|
{
|
||||||
|
uint8_t parity = 0;
|
||||||
|
int steps = ticks;
|
||||||
|
uint8_t cmd[18];
|
||||||
|
uint index = 0;
|
||||||
|
uint32_t data = MS;
|
||||||
|
swdptap_turnaround(0);
|
||||||
|
while (steps) {
|
||||||
|
cmd[index++] = MPSSE_TMS_SHIFT;
|
||||||
|
if (steps >= 7) {
|
||||||
|
cmd[index++] = 6;
|
||||||
|
cmd[index++] = data & 0x7f;
|
||||||
|
data >>= 7;
|
||||||
|
steps -= 7;
|
||||||
|
} else {
|
||||||
|
cmd[index++] = steps - 1;
|
||||||
|
cmd[index++] = data & 0x7f;
|
||||||
|
steps = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (ticks--) {
|
||||||
|
parity ^= MS;
|
||||||
|
MS >>= 1;
|
||||||
|
}
|
||||||
|
cmd[index++] = MPSSE_TMS_SHIFT;
|
||||||
|
cmd[index++] = 0;
|
||||||
|
cmd[index++] = parity;
|
||||||
|
platform_buffer_write(cmd, index);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue