use autodie;
use Data::Dump qw(dump);
use IO::Socket::INET;
+use Storable;
+
+my $openocd_remote = shift @ARGV || 'picam:4444';
+
my $bit2pin;
my $io2bit;
my $in_pin_map = 0;
my $pin_map = '';
+$|=1; # flush stdout
open(my $bsdl, '<', '_3128at100.bsd');
while(<$bsdl>) {
}
warn "# pin2io = ",dump( $pin2io );
+store \$pin2io, '/dev/shm/pin2io.storable';
my @sort = sort {
my $aa = $a; $aa =~ s/\D+//g;
$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
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;
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($_);
if ( /^\s*([A-F0-9]+)/ ) {
my $hex = $1;
my $bin = hex2bin($hex);
+ diff_bits($BSR, $bin);
+ $BSR = $bin;
print_io $bin;
last;
} else {
}
}
-print "[press enter]\n";
-<STDIN>;
+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 = <DATA>;
+ exit if ! $cmd;
+} else {
+ print "[press enter]\n";
+ $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 $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