X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=openocd-jtag-boundary-scan.pl;h=8462f5a888ffb4c76f6235b3b5ac99fb964aba31;hb=e768683830f3ead05b5d0979f7f394ba42e68823;hp=70a26139ddace432e4630a7e8c7c54cac0bd24d0;hpb=f8ac73821157c04312c25daa3e7feccba806f3f1;p=x300-pci diff --git a/openocd-jtag-boundary-scan.pl b/openocd-jtag-boundary-scan.pl index 70a2613..8462f5a 100755 --- a/openocd-jtag-boundary-scan.pl +++ b/openocd-jtag-boundary-scan.pl @@ -65,11 +65,13 @@ 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, $openocd_remote,"\n"; + my $o_bits = $bits; + $bits = reverse $bits; # make substr work as expected + + 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 @@ -77,14 +79,17 @@ 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 = $o_bits; } #foreach my $h (qw(0 1 2 e f 10 11 12 1e 1f 20 30 40 50 100 200 1000)) { @@ -126,7 +131,7 @@ while (<$sock>) { my $bin = hex2bin($hex); diff_bits($BSR, $bin); $BSR = $bin; - print_io $bin; + print_io $bin if $bin ne $last_bits; last; } else { warn "# in ",dump($_); @@ -146,31 +151,54 @@ sub diff_bits { $o[$i].='>'.$n[$i]; } } - return join('', @o); + my $diff = join('', @o); + print "# diff_bits $diff\n"; } print "[press enter]\n"; my $cmd = ; chomp $cmd; -if ( $cmd =~ /(\d+)=(\d)/ ) { - my ( $pin, $v ) = ( $1, $2 ); - warn "# pin $pin = $v\n"; +if ( $cmd =~ /(p|o)(\d+)=(\d+)/ ) { + my ( $what, $p, $v ) = ( $1, $2, $3 ); + + my $old_bsr = reverse $BSR; + my $b = $old_bsr; + + if ( $what eq 'p' && length($v) == 1 ) { - my $io = $pin2io->[$pin]; - my $bit = $io2bit->{$io}->[0]; + my $pin = $p; + warn "# pin $pin = $v\n"; - my $b = substr($BSR,0,$bit+1) - . ( substr($BSR,$bit+1,1) ^ 1 ) - . ( $v & 1 ) - . substr($BSR,$bit+3) - ; + my $io = $pin2io->[$pin]; + my $bit = $io2bit->{$io}->[0]; - print diff_bits( $BSR, $b ), $/; + $b = + substr($old_bsr,0,$bit+1) # leave input as-is + . ( $v eq 'Z' ? 1 : 0 ) # control + . ( $v & 1 ) # output + . substr($old_bsr,$bit+3) + ; + + } elsif ( $what eq 'o' && $p < 288 ) { + my $o = $p; + $b = substr($old_bsr,0,$o) . reverse $v . substr($old_bsr,$o+length($v)); + } else { + print "IGNORED ",dump( $what, $p, $v ); + } + + $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"; + +} elsif ( $cmd =~ m/\?/ ) { + $last_bits = ''; + print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD + print $sock "drscan x300.tap 288 0\n"; } else { print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD print $sock "drscan x300.tap 288 0\n";