X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=openocd-jtag-boundary-scan.pl;h=726b30d35fd9964fb561129d52ebbbf1fc76a8b6;hb=e92a900a2490410e534c084b3142eb868179f1af;hp=aa4ea26a7e9db8af88aeaf8572dce12d24fa65c7;hpb=c2e9fe0f58b02d50dc6ef23c32e5187dd78b2fac;p=x300-pci diff --git a/openocd-jtag-boundary-scan.pl b/openocd-jtag-boundary-scan.pl index aa4ea26..726b30d 100755 --- a/openocd-jtag-boundary-scan.pl +++ b/openocd-jtag-boundary-scan.pl @@ -9,6 +9,7 @@ use Storable; my $openocd_remote = shift @ARGV || 'picam:4444'; my $bsdl_file = $ENV{BSDL} || '_3128at100.bsd'; +$bsdl_file = '3064at44.bsd'; # XXX my $BOUNDARY_LENGTH = 288; my $entity; @@ -21,6 +22,8 @@ my $pin_map = ''; $|=1; # flush stdout +require 'gpio.pl'; + open(my $bsdl, '<', $bsdl_file); while(<$bsdl>) { if ( m/PIN_MAP_STRING/ ) { @@ -70,11 +73,52 @@ warn "# pin2io = ",dump( $pin2io ); #store \$pin2io, $bsdl_file . '.pin2io.storable'; store \$pin2io, $entity . '.pin2io.storable'; +my $pin_desc; +foreach my $pin_file ( glob "pins/$entity*.tsv" ) { + open(my $fh, '<', $pin_file); + while(<$fh>) { + chomp; + my ($pin,$desc, $bcm) = split(/\t+/,$_,3); + $pin_desc->{$pin} = $desc; + gpio::add_bcm_desc( $bcm => $desc ); + } + close($fh); + warn "# $pin_file ",dump($pin_desc); +} + +{ + my $pin_file = 'Altera/epm3064_dac/3064at44.qsf'; + open(my $fh, '<', $pin_file); + while(<$fh>) { + chomp; + my ($set,$pin, $op, $desc) = split(/\s+/,$_,4); + if ( $set =~ m/set_location_assignment/i && $op =~ m/-to/i && $pin =~ s/^PIN_//ig ) { + $pin_desc->{$pin} = $desc; # overwrite pin description + } else { + warn "# ignored $_\n"; + } + } + close($fh); + warn "# $pin_file ",dump($pin_desc); +} + +=for remove my @sort = sort { my $aa = $a; $aa =~ s/\D+//g; my $bb = $b; $bb =~ s/\D+//g; $aa <=> $bb } keys %$io2bit; warn "# sort = ",dump(@sort); +=cut + +sub bits { + my $bits = shift; + return $bits; # FIXME disable for now + $bits =~ s/0/ /; + $bits =~ s/^(.)0/$1 /; + $bits =~ s/^1/I/; + $bits =~ s/^(.)1/$1./; + return $bits; +} my $last_bits = ''; sub print_io { @@ -89,12 +133,25 @@ sub print_io { my $pin = ($#$pin2io/4) * $j + $i + 1; # columns my $io = $pin2io->[$pin]; my $o = $io2bit->{$io}->[0]; + if ( defined $o ) { 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 : '' + + my $desc = $pin_desc->{$pin} || ''; + my $bits = bits($b); + if ( $b ne $l ) { + my @b = split(//, $bits); + my @l = split(//, bits($l)); + $bits = ''; + foreach ( 0 .. $#b ) { + $bits .= $b[$_] eq $l[$_] ? $b[$_] : "\e[33;7;1m$b[$_]\e[0m"; + } + } + + printf "%-3d %-3d %-5s %3s %-8s | ", $pin, $o, $io, $bits, $desc; } else { - printf "%-3d ... %-5s %3s %3s | ", $pin, $io, '', ''; + printf "%-3d ... %-5s %3s %-8s | ", $pin, $io, '', ''; } } print "\n"; @@ -125,6 +182,8 @@ sub bin2hex { #my $cmd; + + my $BSR; # first sample @@ -143,6 +202,7 @@ while (<$sock>) { diff_bits($BSR, $bin); $BSR = $bin; print_io $bin if $bin ne $last_bits; + gpio::pins(); last; } else { warn "# in ",dump($_); @@ -160,7 +220,7 @@ sub diff_bits { $o[$i]='.'; } else { my $pin = $bit2pin->{ $BOUNDARY_LENGTH - ($i * 3) - 3 }->[0]; - $o[$i] = " $pin:" . $o[$i] . '>' . $n[$i]; + $o[$i] = " $pin@" . ( $i * 3 ) . ":" . $o[$i] . '>' . $n[$i]; } } my $diff = join('', @o); @@ -179,11 +239,11 @@ if ( $cmd =~ /(p|o)(\d+)=(\d+)/ ) { if ( $what eq 'p' && length($v) == 1 ) { my $pin = $p; - warn "# pin $pin = $v\n"; - my $io = $pin2io->[$pin]; my $bit = $io2bit->{$io}->[0]; + warn "# pin $pin = $v io=$io bit=$bit\n"; + $b = substr($old_bsr,0,$bit+1) # leave input as-is . ( $v eq 'Z' ? 1 : 0 ) # control @@ -216,6 +276,7 @@ warn "XXX",length($old_bsr), " == ",length($b); print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD print $sock "drscan x300.tap $BOUNDARY_LENGTH 0\n"; } else { + gpio::cmd( $cmd ); print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD print $sock "drscan x300.tap $BOUNDARY_LENGTH 0\n"; }