From 0fb300488afb6ff028c48cfdd3e918a7c0cdf2ad Mon Sep 17 00:00:00 2001 From: Marcel Telka Date: Mon, 22 Jul 2002 21:23:50 +0000 Subject: [PATCH] Added initial simple JTAG parts detector. git-svn-id: https://urjtag.svn.sourceforge.net/svnroot/urjtag/trunk@71 b68d4a1b-bc3d-0410-92ed-d4ac073336b7 --- jtag/src/.cvsignore | 3 + jtag/src/Makefile.am | 32 ++++++ jtag/src/detect.c | 251 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 286 insertions(+) create mode 100644 jtag/src/.cvsignore create mode 100644 jtag/src/Makefile.am create mode 100644 jtag/src/detect.c diff --git a/jtag/src/.cvsignore b/jtag/src/.cvsignore new file mode 100644 index 00000000..e440fafd --- /dev/null +++ b/jtag/src/.cvsignore @@ -0,0 +1,3 @@ +Makefile.in +Makefile +.deps diff --git a/jtag/src/Makefile.am b/jtag/src/Makefile.am new file mode 100644 index 00000000..d7211e3c --- /dev/null +++ b/jtag/src/Makefile.am @@ -0,0 +1,32 @@ +# +# $Id$ +# +# Copyright (C) 2002 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. +# + +SUBDIRS = tap + +bin_PROGRAMS = detect + +detect_SOURCES = detect.c + +detect_LDADD = -Ltap -ltap -lioperm + +INCLUDES = -I$(top_srcdir)/include diff --git a/jtag/src/detect.c b/jtag/src/detect.c new file mode 100644 index 00000000..a2df2418 --- /dev/null +++ b/jtag/src/detect.c @@ -0,0 +1,251 @@ +/* + * $Id$ + * + * Copyright (C) 2002 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. + * + */ + +#include +#include +#include + +#include +#include +#include + +struct id_record { + char name[20]; + char fullname[100]; +}; + +int +find_record( char *filename, tap_register *key, struct id_record *idr ) +{ + FILE *file; + tap_register *tr; + int r = 0; + + file = fopen( filename, "r" ); + if (!file) + return 0; + + tr = register_alloc( key->len ); + + for (;;) { + char *p; + char *s; + char line[1024]; + + if (fgets( line, 1024, file ) == NULL) + break; + + /* remove comment and nl from the line */ + p = strpbrk( line, "#\n" ); + if (p) + *p = '\0'; + + p = line; + + /* skip whitespace */ + while (*p && isspace(*p)) + p++; + + /* remove ending whitespace */ + s = strchr( p, '\0' ); + while (s != p) { + if (!isspace(*--s)) + break; + *s = '\0'; + } + + /* line is empty? */ + if (!*p) + continue; + + /* find end of field */ + s = p; + while (*s && !isspace(*s)) + s++; + if (*s) + *s++ = '\0'; + + /* test field length */ + if (strlen( p ) != key->len) + continue; + + /* match */ + register_init( tr, p ); + if (register_compare( tr, key )) + continue; + + /* next field */ + p = s; + + /* skip whitespace */ + while (*p && isspace(*p)) + p++; + + /* line is empty? */ + if (!*p) + continue; + + /* find end of field */ + s = p; + while (*s && !isspace(*s)) + s++; + if (*s) + *s++ = '\0'; + + /* test field length */ + if (strlen( p ) >= sizeof idr->name) + continue; + + /* copy name */ + strcpy( idr->name, p ); + + /* next field */ + p = s; + + /* skip whitespace */ + while (*p && isspace(*p)) + p++; + + /* line is empty? */ + if (!*p) + continue; + + /* test field length */ + if (strlen( p ) >= sizeof idr->fullname) + continue; + + /* copy fullname */ + strcpy( idr->fullname, p ); + + r = 1; + break; + } + + fclose( file ); + + register_free( tr ); + + return r; +} + +void +detect_devices( char *db_path ) +{ + tap_register *zeros = register_fill( register_alloc( 32 ), 0 ); + tap_register *id = register_alloc( 32 ); + + char data_path[1024]; + + tap_reset(); + + tap_capture_dr(); + for (;;) { + tap_register *key; + struct id_record idr; + char *p; + + tap_shift_register( zeros, id, 0 ); + if (!register_compare( id, zeros )) { + tap_clock( 1, 0 ); /* Exit1-DR */ + tap_clock( 1, 0 ); /* Update-DR */ + break; + } + printf( "%s\n", register_get_string( id ) ); + + strcpy( data_path, db_path ); /* FIXME: Buffer overrun */ + + /* manufacturers */ + strcat( data_path, "/MANUFACTURERS" ); + + key = register_alloc( 11 ); + memcpy( key->data, &id->data[1], key->len ); + if (!find_record( data_path, key, &idr )) { + printf( " Unknown manufacturer!\n" ); + register_free( key ); + continue; + } + register_free( key ); + + printf( " Manufacturer: %s\n", idr.fullname ); + + /* parts */ + p = strrchr( data_path, '/' ); + if (p) + p[1] = '\0'; + else + data_path[0] = '\0'; + strcat( data_path, idr.name ); + strcat( data_path, "/PARTS" ); + + key = register_alloc( 16 ); + memcpy( key->data, &id->data[12], key->len ); + if (!find_record( data_path, key, &idr )) { + printf( " Unknown part!\n" ); + register_free( key ); + continue; + } + register_free( key ); + + printf( " Part: %s\n", idr.fullname ); + + /* steppings */ + p = strrchr( data_path, '/' ); + if (p) + p[1] = '\0'; + else + data_path[0] = '\0'; + strcat( data_path, idr.name ); + strcat( data_path, "/STEPPINGS" ); + + key = register_alloc( 4 ); + memcpy( key->data, &id->data[28], key->len ); + if (!find_record( data_path, key, &idr )) { + printf( " Unknown stepping!\n" ); + register_free( key ); + continue; + } + register_free( key ); + + printf( " Stepping: %s\n", idr.fullname ); + } + + register_free( zeros ); + register_free( id ); + return; +} + +int +main( void ) +{ + tap_init(); + + tap_set_trst( 0 ); + tap_set_trst( 1 ); + + detect_devices( "../data" ); + + tap_done(); + + return 0; +}