# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Interface configuration for JTAG on the Nexys Video board through the
# FT2232H chip. This connection is labeled DTPI/DSPI in the board schematics.

# adapter speed
# Up to 30 MHz are supported by the FT2232H
adapter_khz 30000

adapter driver ftdi
transport select jtag

ftdi_vid_pid 0x0403 0x6010

# Not really required, but makes communication a bit more robust
ftdi_tdo_sample_edge falling

# Use Channel A (0), channel B (1) is taken by Xilinx JTAG
ftdi_channel 0

# FT2232H pin configuration
#
# Documentation:
# http://openocd.org/doc-release/html/Debug-Adapter-Configuration.html#Interface-Drivers
#
# Our configuration:
#
# Bit  MPSSE     FT2232    JTAG    Type   RstVal  Description
# ----------------------------------------------------------------------
# Bit0 TCK       ADBUS0    TCK     Out    0       Clock Signal Output
# Bit1 TDI       ADBUS1    TDI     Out    0       Serial Data Out
# Bit2 TDO       ADBUS2    TDO     In     0       Serial Data In
# Bit3 TMS       ADBUS3    TMS     Out    1       Select Signal Out
# Bit4 GPIOL0    ADBUS4    nTRST   Out    1       General Purpose I/O
# Bit5 GPIOL1    ADBUS5    nSRST   Out    1       General Purpose I/O
# Bit6 GPIOL2    ADBUS6    0       Out    0       General Purpose I/O
# Bit7 GPIOL3    ADBUS7    0       Out    0       General Purpose I/O
#
# Bit6 GPIOL2 is used to select between JTAG=1 and SPI=0 and controls
# the I/O MUX inside the earlgrey_nexsysvideo. Static so it is only
# mentioned in the init command below (makes it output value 1)
#
# Bit7 GPIOL3 is used to enable boot rom boot strap
#
# This corresponds to the following reset values (first number), and
# in/out layout (second number):
ftdi_layout_init 0x0078 0x00fb

# TAP reset (nTRST)
ftdi_layout_signal nTRST -ndata 0x0010

# System Reset (nSRST)
ftdi_layout_signal nSRST -ndata 0x0020

# FT2232 doesn't support open drain GPIO for reset pins
reset_config srst_push_pull trst_push_pull
