Compare commits

...

4 Commits

Author SHA1 Message Date
Jochen Friedrich 41eaa6be81 bcm5365 support 14 years ago
Jochen Friedrich 56f567bcfb Add HULUG cable definitions 14 years ago
Jochen Friedrich c64859d6ff Temporary fixes. 14 years ago
Jochen Friedrich 807a8c62ed Print an error message if a DMA timeout occurs.
This still needs to be improved to stop the DMA
and report the error to the caller. But at least
it's no longer failing silently.
14 years ago

@ -101,6 +101,8 @@ nobase_dist_pkgdata_DATA = \
broadcom/bcm6348/bcm6348 \
broadcom/bcm6358/STEPPINGS \
broadcom/bcm6358/bcm6358 \
broadcom/bcm5365/STEPPINGS \
broadcom/bcm5365/bcm5365 \
bsdl/STD_1149_1_1990 \
bsdl/STD_1149_1_1994 \
bsdl/STD_1149_1_2001 \

@ -29,3 +29,4 @@
0100011100010010 bcm4712 BCM4712
0110001101011000 bcm6358 BCM6358
0110001101001000 bcm6348 BCM6348
0101001101100101 bcm5365 BCM5365

@ -0,0 +1,25 @@
#
# $Id: STEPPINGS 599 2004-06-13 18:16:43Z telka $
#
# Copyright (C) 2004 Alan Wallace <aww@adelphia.net>
#
# 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 2
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# Written by Alan Wallace <aww@adelphia.net>, 2004.
#
# bits 31-28 of the Device Identification Register
0001 bcm5365 Ver 1

@ -0,0 +1,47 @@
#
# $Id$
#
# JTAG declarations for Broadcom BCM5365
# Copyright (C) 2009 Jochen Friedrich <jochen@scram.de>
# Shamelessly copied from bcm6358
#
# 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 2
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
register BSR 1
register BR 1
register DIR 32
register EJIMPCODE 32
register EJADDRESS 32
register EJDATA 32
register EJCONTROL 32
register EJALL 96
instruction length 8
instruction EXTEST 00000000 BSR
instruction IDCODE 00000001 DIR
instruction SAMPLE/PRELOAD 00000010 BSR
instruction EJTAG_IMPCODE 00000011 EJIMPCODE
instruction EJTAG_ADDRESS 00001000 EJADDRESS
instruction EJTAG_DATA 00001001 EJDATA
instruction EJTAG_CONTROL 00001010 EJCONTROL
instruction EJTAG_ALL 00001011 EJALL
instruction EJTAGBOOT 00001100 BR
instruction NORMALBOOT 00001101 BR
instruction BYPASS 00011111 BR
initbus ejtag

@ -239,6 +239,10 @@ ejtag_run_pracc (urj_bus_t *bus, const uint32_t *code, unsigned int len)
}
else
{
/* Some older EJTAG 2.0 chips need this */
if (addr == 0)
addr = UINT32_C (0xff200200);
if (addr == UINT32_C (0xff200200) && pass++)
break;

@ -231,6 +231,9 @@ ejtag_dma_write (urj_bus_t *bus, unsigned int addr, unsigned int data, int sz)
}
while (ejctrl->out->data[DstRt] == 1); // This flag tell us the processor has completed the op
if (!timeout)
urj_log (URJ_LOG_LEVEL_NORMAL, "Timeout\n");
urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
urj_tap_chain_shift_instructions (bus->chain);
urj_tap_register_fill (ejctrl->in, 0);
@ -311,6 +314,9 @@ ejtag_dma_read (urj_bus_t *bus, unsigned int addr, int sz)
}
while (ejctrl->out->data[DstRt] == 1); // This flag tell us the processor has completed the op
if (!timeout)
urj_log (URJ_LOG_LEVEL_NORMAL, "Timeout\n");
urj_part_set_instruction (bus->part, "EJTAG_DATA");
urj_tap_chain_shift_instructions (bus->chain);
urj_tap_register_fill (ejdata->in, 0);
@ -466,6 +472,12 @@ ejtag_dma_bus_init (urj_bus_t *bus)
ejctrl->in->data[PerRst] = 0;
urj_tap_chain_shift_data_registers (bus->chain, 0);
// Clear Memory Protection Bit in DCR
urj_log (URJ_LOG_LEVEL_NORMAL, _("Clear memory protection bit in DCR\n"));
unsigned int val = ejtag_dma_read (bus, 0xff300000, DMA_WORD);
ejtag_dma_write (bus, 0xff300000, val & ~(1 << 2), DMA_WORD);
ejctrl->in->data[PrAcc] = 1;
ejctrl->in->data[ProbEn] = 1;
ejctrl->in->data[ProbTrap] = 1;
@ -501,13 +513,18 @@ ejtag_dma_bus_init (urj_bus_t *bus)
urj_tap_chain_shift_data_registers (bus->chain, 1);
}
// Clear watchdog, if any
// Clear Memory Protection Bit in DCR
urj_log (URJ_LOG_LEVEL_NORMAL, _("Clear memory protection bit in DCR\n"));
unsigned int val = ejtag_dma_read (bus, 0xff300000, DMA_WORD);
ejtag_dma_write (bus, 0xff300000, val & ~(1 << 2), DMA_WORD);
// Reset the processor
ejctrl->in->data[PrRst] = 1;
ejctrl->in->data[PerRst] = 1;
urj_tap_chain_shift_data_registers (bus->chain, 0);
// Release reset
ejctrl->in->data[PrRst] = 0;
ejctrl->in->data[PerRst] = 0;
urj_tap_chain_shift_data_registers (bus->chain, 0);
// Clear watchdog, if any
urj_log (URJ_LOG_LEVEL_NORMAL, _("Clear Watchdog\n"));
ejtag_dma_write (bus, 0xb8000080, 0, DMA_WORD);

@ -188,6 +188,16 @@
#define BITMASK_FLYSWATTER_nOE1 (1 << BIT_FLYSWATTER_nOE1)
#define BITMASK_FLYSWATTER_nOE2 (1 << BIT_FLYSWATTER_nOE2)
/* bit and bitmask definitions for HULUG board*/
#define BIT_HULUG_nLED2 1
#define BIT_HULUG_nLED3 3
#define BIT_HULUG_nTRST 4
#define BIT_HULUG_nSRST 6
#define BITMASK_HULUG_nLED2 (1 << BIT_HULUG_nLED2)
#define BITMASK_HULUG_nLED3 (1 << BIT_HULUG_nLED3)
#define BITMASK_HULUG_nTRST (1 << BIT_HULUG_nTRST)
#define BITMASK_HULUG_nSRST (1 << BIT_HULUG_nSRST)
/* --- Bit and bitmask definitions for usbScarab2 --- */
/* usbScarabeus2 is a design of Krzysztof Kajstura ( http://www.kristech.eu ). */
/* UrJTAG support added by Tomek Cedro ( http://www.tomek.cedro.info ) */
@ -838,6 +848,50 @@ ft2232_flyswatter_init (urj_cable_t *cable)
return URJ_STATUS_OK;
}
static int
ft2232_hulug_init (urj_cable_t *cable)
{
params_t *params = (params_t *) cable->params;
urj_tap_cable_cx_cmd_root_t *cmd_root = &(params->cmd_root);
if (urj_tap_usbconn_open (cable->link.usb) != URJ_STATUS_OK)
return URJ_STATUS_FAIL;
/* static low byte value and direction:
nTRST = 1, nSRST = 1 (ADBUS5 inverted) */
params->low_byte_value = BITMASK_HULUG_nTRST;
params->low_byte_dir = BITMASK_HULUG_nTRST | BITMASK_HULUG_nSRST;
/* Set Data Bits Low Byte
TCK = 0, TMS = 1, TDI = 0 */
urj_tap_cable_cx_cmd_queue (cmd_root, 0);
urj_tap_cable_cx_cmd_push (cmd_root, SET_BITS_LOW);
urj_tap_cable_cx_cmd_push (cmd_root,
params->low_byte_value | BITMASK_TMS);
urj_tap_cable_cx_cmd_push (cmd_root,
params->low_byte_dir | BITMASK_TCK
| BITMASK_TDI | BITMASK_TMS);
/* Set Data Bits High Byte */
/* Turn LED3 on */
params->high_byte_value = BITMASK_HULUG_nLED3;
params->high_byte_dir = BITMASK_HULUG_nLED2 | BITMASK_HULUG_nLED3;
urj_tap_cable_cx_cmd_push (cmd_root, SET_BITS_HIGH);
urj_tap_cable_cx_cmd_push (cmd_root, params->high_byte_value);
urj_tap_cable_cx_cmd_push (cmd_root, params->high_byte_dir);
ft2232_set_frequency (cable, FT2232_MAX_TCK_FREQ);
params->bit_trst = BIT_HULUG_nTRST; /* member of LOW byte */
params->bit_reset = BIT_HULUG_nSRST; /* member of LOW byte */
params->last_tdo_valid = 0;
params->signals = URJ_POD_CS_TRST | URJ_POD_CS_RESET;
return URJ_STATUS_OK;
}
static int
ft2232_usbscarab2_init (urj_cable_t *cable)
{
@ -1338,6 +1392,33 @@ ft2232_flyswatter_done (urj_cable_t *cable)
urj_tap_cable_generic_usbconn_done (cable);
}
static void
ft2232_hulug_done (urj_cable_t *cable)
{
params_t *params = (params_t *) cable->params;
urj_tap_cable_cx_cmd_root_t *cmd_root = &(params->cmd_root);
/* Set Data Bits Low Byte
disable output drivers */
urj_tap_cable_cx_cmd_queue (cmd_root, 0);
urj_tap_cable_cx_cmd_push (cmd_root, SET_BITS_LOW);
/* Set Data Bits Low Byte
set all to input */
urj_tap_cable_cx_cmd_push (cmd_root, SET_BITS_LOW);
urj_tap_cable_cx_cmd_push (cmd_root, 0);
/* Set Data Bits High Byte
set all to input */
urj_tap_cable_cx_cmd_push (cmd_root, SET_BITS_HIGH);
urj_tap_cable_cx_cmd_push (cmd_root, BITMASK_HULUG_nLED2);
urj_tap_cable_cx_cmd_push (cmd_root, 0);
urj_tap_cable_cx_xfer (cmd_root, &imm_cmd, cable,
URJ_TAP_CABLE_COMPLETELY);
urj_tap_cable_generic_usbconn_done (cable);
}
static void
ft2232_usbscarab2_done (urj_cable_t *cable)
{
@ -2359,6 +2440,26 @@ const urj_cable_driver_t urj_tap_cable_ft2232_flyswatter_driver = {
};
URJ_DECLARE_FTDX_CABLE(0x0403, 0x6010, "-mpsse", "Flyswatter", flyswatter)
const urj_cable_driver_t urj_tap_cable_ft2232_hulug_driver = {
"HULUG",
N_("HULUG (FT2232) Cable"),
URJ_CABLE_DEVICE_USB,
{ .usb = ft2232_connect, },
urj_tap_cable_generic_disconnect,
ft2232_cable_free,
ft2232_hulug_init,
ft2232_hulug_done,
ft2232_set_frequency,
ft2232_clock,
ft2232_get_tdo,
ft2232_transfer,
ft2232_set_signal,
urj_tap_cable_generic_get_signal,
ft2232_flush,
ftdx_usbcable_help
};
URJ_DECLARE_FTDX_CABLE(0x0403, 0x6010, "-mpsse", "HULUG", hulug)
const urj_cable_driver_t urj_tap_cable_ft2232_usbscarab2_driver = {
"usbScarab2",
N_("KrisTech usbScarabeus2 (FT2232) Cable"),

@ -51,6 +51,7 @@ _URJ_USB_FTDX(armusbtiny_h)
_URJ_USB_FTDX(flyswatter)
_URJ_USB_FTDX(gnice)
_URJ_USB_FTDX(gniceplus)
_URJ_USB_FTDX(hulug)
_URJ_USB_FTDX(jtagkey)
_URJ_USB_FTDX(milkymist)
_URJ_USB_FTDX(oocdlinks)

@ -50,6 +50,7 @@ _URJ_CABLE(ft2232)
_URJ_CABLE(ft2232_armusbocd)
_URJ_CABLE(ft2232_armusbtiny_h)
_URJ_CABLE(ft2232_flyswatter)
_URJ_CABLE(ft2232_hulug)
_URJ_CABLE(ft2232_gnice)
_URJ_CABLE(ft2232_gniceplus)
_URJ_CABLE(ft2232_jtagkey)

Loading…
Cancel
Save