non-working EXTEST pin toggle
authorDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 9 Jun 2016 16:13:02 +0000 (18:13 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 9 Jun 2016 16:13:02 +0000 (18:13 +0200)
openocd-jtag-boundary-scan.pl

index b104942..bc02ce3 100755 (executable)
@@ -95,14 +95,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;
+
+my $BSR;
 
-print $sock "irscan x300.tap 0x55\n";
+# 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 +119,7 @@ while (<$sock>) {
        if ( /^\s*([A-F0-9]+)/ ) {
                my $hex = $1;
                my $bin = hex2bin($hex);
+               $BSR = $bin;
                print_io $bin;
                last;
        } else {
@@ -118,6 +127,46 @@ while (<$sock>) {
        }
 }
 
+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];
+               }
+       }
+       return join('', @o);
+}
+
 print "[press enter]\n";
-<STDIN>;
+my $cmd = <STDIN>;
+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 $b = substr($BSR,0,$bit+1)
+               . ( substr($BSR,$bit+1,1) ^ 1 )
+               . ( $v & 1 )
+               . substr($BSR,$bit+3)
+               ;
+
+       print diff_bits( $BSR, $b ), $/;
+
+       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)