diff --git a/jtag/ChangeLog b/jtag/ChangeLog index 97a1f415..f50543f4 100644 --- a/jtag/ChangeLog +++ b/jtag/ChangeLog @@ -1,3 +1,11 @@ +2003-01-08 Marcel Telka + + * include/cable.h: Added cable driver for ETC EI012 JTAG Cable. + * src/help.c (help): Ditto. + * src/jtag.c (main): Ditto. + * src/tap/Makefile.am: Ditto. + * src/tap/cable/ei012.c: Ditto. + 2003-01-08 Marcel Telka * configure.ac: Bumped version number to 0.2, added check-new and dist-bzip2 diff --git a/jtag/include/cable.h b/jtag/include/cable.h index fc96674a..129f67be 100644 --- a/jtag/include/cable.h +++ b/jtag/include/cable.h @@ -43,5 +43,6 @@ extern cable_driver_t *cable; extern cable_driver_t ea253_cable_driver; extern cable_driver_t dlc5_cable_driver; +extern cable_driver_t ei012_cable_driver; #endif /* CABLE_H */ diff --git a/jtag/src/help.c b/jtag/src/help.c index 2157dc6c..0e713e10 100644 --- a/jtag/src/help.c +++ b/jtag/src/help.c @@ -74,6 +74,7 @@ help( const char *cmd ) "none No cable connected\n" "DLC5 Xilinx DLC5 JTAG Parallel Cable III\n" "EA253 ETC EA253 JTAG Cable\n" + "EI012 ETC EI012 JTAG Cable\n" ); else if (strcmp( cmd, "detect" ) == 0) printf( diff --git a/jtag/src/jtag.c b/jtag/src/jtag.c index bfa30ad0..f14a4066 100644 --- a/jtag/src/jtag.c +++ b/jtag/src/jtag.c @@ -145,6 +145,11 @@ main( void ) } else if (strcmp( t, "EA253" ) == 0) { cable = &ea253_cable_driver; + if (!cable->init( port )) + cable = NULL; + } else if (strcmp( t, "EI012" ) == 0) { + cable = &ei012_cable_driver; + if (!cable->init( port )) cable = NULL; } else { diff --git a/jtag/src/tap/Makefile.am b/jtag/src/tap/Makefile.am index ff96248d..7a2bc289 100644 --- a/jtag/src/tap/Makefile.am +++ b/jtag/src/tap/Makefile.am @@ -28,6 +28,7 @@ libtap_a_SOURCES = \ register.c \ state.c \ cable/dlc5.c \ - cable/ea253.c + cable/ea253.c \ + cable/ei012.c INCLUDES = -I$(top_srcdir)/include $(OPENWINCE_INC) diff --git a/jtag/src/tap/cable/ei012.c b/jtag/src/tap/cable/ei012.c new file mode 100644 index 00000000..63e1eeda --- /dev/null +++ b/jtag/src/tap/cable/ei012.c @@ -0,0 +1,108 @@ +/* + * $Id$ + * + * ETC EI012 JTAG Cable Driver + * Copyright (C) 2002, 2003 ETC s.r.o. + * + * 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 Marcel Telka , 2002, 2003. + * + */ + +#include +#include + +#include "cable.h" +#include "state.h" + +/* + * data D[7:0] (pins 9:2) + */ +#define TCK 0 +#define TDI 1 +#define TMS 2 +#define TRST 4 + +/* + * 7 - BUSY (pin 11) + * 6 - ACK (pin 10) + * 5 - PE (pin 12) + * 4 - SEL (pin 13) + * 3 - ERROR (pin 15) + */ +#define TDO 7 + +static unsigned int port; + +static int +ei012_init( unsigned int aport ) +{ + tap_state_init(); + port = aport; + printf( "Initilizing ETC EI012 JTAG Cable on parallel port at 0x%x\n", port ); + if (ioperm( port, 2, 1 )) { + printf( "Error: Initialization failed!\n" ); + return 0; + } + tap_state_set_trst( (inb( port ) >> TRST) & 1 ); + + return 1; +} + +static void +ei012_done( void ) +{ + ioperm( port, 2, 0 ); + + tap_state_done(); +} + +static void +ei012_clock( int tms, int tdi ) +{ + int trst = tap_state_get_trst(); + + tms &= 1; + tdi &= 1; + + outb( (trst << TRST) | (0 << TCK) | (tms << TMS) | (tdi << TDI), port ); + outb( (trst << TRST) | (1 << TCK) | (tms << TMS) | (tdi << TDI), port ); + + tap_state_clock( tms ); +} + +static int +ei012_get_tdo( void ) +{ + outb( (tap_state_get_trst() << TRST) | (0 << TCK), port ); + return ((inb( port + 1 ) ^ 0x80) >> TDO) & 1; /* BUSY is inverted */ +} + +static void +ei012_set_trst( int new_trst ) +{ + tap_state_set_trst( new_trst ); + outb( (new_trst & 1) << TRST, port ); +} + +cable_driver_t ei012_cable_driver = { + ei012_init, + ei012_done, + ei012_clock, + ei012_get_tdo, + ei012_set_trst +};