/* * This file is part of the Black Magic Debug project. * * Copyright (C) 2011 Black Sphere Technologies Ltd. * Written by Gareth McMullin * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* This file implements the low-level JTAG TAP interface. */ #include #include "general.h" #include "jtagtap.h" #include "platform.h" int jtagtap_init(void) { /* Make sure TMS is still output (shared with SWDIO). */ uint8_t cmd[] = { DEV2_OP_DIR_OUT, TMS_PIN }; platform_buffer_write (cmd, sizeof (cmd)); /* Go to JTAG mode for SWJ-DP */ for(int i = 0; i <= 50; i++) jtagtap_next(1, 0); /* Reset SW-DP */ jtagtap_tms_seq(0xE73C, 16); /* SWD to JTAG sequence */ jtagtap_soft_reset(); return 0; } void jtagtap_reset(void) { jtagtap_soft_reset(); } void jtagtap_srst(void) { } inline uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDO) { uint8_t cmd[] = { DEV2_OP_OUT_CHANGE, TMS_PIN | TDI_PIN, (dTMS ? TMS_PIN : 0) | (dTDO ? TDI_PIN : 0), DEV2_OP_OUT_SET, TCK_PIN, DEV2_OP_IN, DEV2_OP_OUT_RESET, TCK_PIN, }; platform_buffer_write (cmd, sizeof (cmd)); uint8_t rep[1]; platform_buffer_read (rep, sizeof (rep)); int ret = rep[0] & TDO_PIN; DEBUG("jtagtap_next(TMS = %d, TDO = %d) = %d\n", dTMS, dTDO, ret); return ret != 0; } #define PROVIDE_GENERIC_JTAGTAP_TMS_SEQ #define PROVIDE_GENERIC_JTAGTAP_TDI_TDO_SEQ #define PROVIDE_GENERIC_JTAGTAP_TDI_SEQ #include "jtagtap_generic.c"