X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=openocd-jtag-boundary-scan.pl;h=acb4a5dfa00d4fb0a5804c810ac457d96a39e68b;hb=9bc5611183afd89723d9cc4ec761e555332eeec7;hp=b104942941cd28c6fdd719be21b621d6af22f848;hpb=316689e3c17b6d291d6265c98f92c03b3d36633a;p=x300-pci diff --git a/openocd-jtag-boundary-scan.pl b/openocd-jtag-boundary-scan.pl index b104942..acb4a5d 100755 --- a/openocd-jtag-boundary-scan.pl +++ b/openocd-jtag-boundary-scan.pl @@ -5,6 +5,10 @@ use strict; use autodie; use Data::Dump qw(dump); use IO::Socket::INET; +use Storable; + +my $openocd_remote = shift @ARGV || 'picam:4444'; + my $bit2pin; my $io2bit; @@ -13,6 +17,7 @@ my $pin2io; my $in_pin_map = 0; my $pin_map = ''; +$|=1; # flush stdout open(my $bsdl, '<', '_3128at100.bsd'); while(<$bsdl>) { @@ -53,6 +58,7 @@ foreach my $map ( split(/\s*,\s*/, $pin_map) ) { } warn "# pin2io = ",dump( $pin2io ); +store \$pin2io, '/dev/shm/pin2io.storable'; my @sort = sort { my $aa = $a; $aa =~ s/\D+//g; @@ -60,11 +66,14 @@ my @sort = sort { $aa <=> $bb } keys %$io2bit; warn "# sort = ",dump(@sort); +my $last_bits = ''; sub print_io { my $bits = shift; - my $i = 0; -# foreach my $io ( @sort ) { - print "pin off io___ I C O | " x 4, "\n"; + $bits = reverse $bits; # make substr work as expected + + return if $last_bits eq $bits; + + print "pin off io___ ICO prv | " x 4, $openocd_remote,"\n"; foreach my $i ( 0 .. ($#$pin2io/4)-1 ) { foreach my $j ( 0 .. 3 ) { #my $pin = ($i*4) + $j + 1; # rows @@ -72,21 +81,24 @@ sub print_io { my $io = $pin2io->[$pin]; my $o = $io2bit->{$io}->[0]; if ( defined $o ) { - printf "%-3d %-3d %-5s %d %d %d | ", $pin, $o, $io, split(//, substr($bits, $o, 3)); + my $l = $b = substr($bits, $o, 3); + $l = substr($last_bits,$o,3) if $last_bits; + printf "%-3d %-3d %-5s %3s %3s | ", $pin, $o, $io, $b, $b ne $l ? $l : '' } else { - printf "%-3d ... %-5s | ", $pin, $io; + printf "%-3d ... %-5s %3s %3s | ", $pin, $io, '', ''; } } print "\n"; } print "\n"; + $last_bits = $bits; } #foreach my $h (qw(0 1 2 e f 10 11 12 1e 1f 20 30 40 50 100 200 1000)) { # printf "hex = %4s binary = %16s\n", $h, hex2bin($h); #} -my $sock = IO::Socket::INET->new('picam:4444'); +my $sock = IO::Socket::INET->new($openocd_remote); sub hex2bin { my $h = shift; @@ -95,14 +107,22 @@ sub hex2bin { return unpack("B$blen", pack("H$hlen", $h)); } -my $cmd; +sub bin2hex { + my $b = shift; + my $blen = length($b); + my $hlen = $blen / 4; + return unpack("H$hlen", pack("B$blen", $b)); +} -while(1) { +#my $cmd; -print $sock "irscan x300.tap 0x55\n"; +my $BSR; + +# first sample +print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD print $sock "drscan x300.tap 288 0\n"; -print $sock $cmd if $cmd; +while(1) { while (<$sock>) { warn "<< ",dump($_); @@ -111,6 +131,8 @@ while (<$sock>) { if ( /^\s*([A-F0-9]+)/ ) { my $hex = $1; my $bin = hex2bin($hex); + diff_bits($BSR, $bin); + $BSR = $bin; print_io $bin; last; } else { @@ -118,6 +140,130 @@ while (<$sock>) { } } -print "[press enter]\n"; -; +sub diff_bits { + my ($old, $new) = @_; + $old =~ s/(...)/$1 /g; + $new =~ s/(...)/$1 /g; + my @o = split(/ /, $old); + my @n = split(/ /, $new); + foreach my $i ( 0 .. $#o ) { + if ( $o[$i] eq $n[$i] ) { + $o[$i]='.'; + } else { + $o[$i].='>'.$n[$i]; + } + } + my $diff = join('', @o); + print "# diff_bits $diff\n"; +} + +my $cmd = ''; +if ( $ENV{SLEEP} ) { + sleep $ENV{SLEEP}; + $cmd = ; + exit if ! $cmd; +} else { + print "[press enter]\n"; + $cmd = ; } +chomp $cmd; + +if ( $cmd =~ /(\d+)=(\d)/ ) { + my ( $pin, $v ) = ( $1, $2 ); + warn "# pin $pin = $v\n"; + + my $io = $pin2io->[$pin]; + my $bit = $io2bit->{$io}->[0]; + + my $old_bsr = reverse $BSR; + + my $b = substr($old_bsr,0,$bit+1) + . ( substr($old_bsr,$bit+1,1) ^ 1 ) + . ( $v & 1 ) + . substr($old_bsr,$bit+3) + ; + $b = reverse $b; + + diff_bits( $BSR, $b ), $/; + + print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD + print $sock "drscan x300.tap 288 0x", bin2hex($b), "\n"; + print $sock "irscan x300.tap 0x00\n"; # EXTEST + print $sock "drscan x300.tap 288 0x", bin2hex($b), "\n"; +} else { + print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD + print $sock "drscan x300.tap 288 0\n"; +} + + +}#while(1) + +__DATA__ +5=1 +a +b +c +d +e +f +a +a +a +a +a +a +a +a +a +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +b +c +d +e +f +5=0 +a +b +c +d +e +f