# 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

interface 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
