1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
#!/usr/bin/perl
use IO::Handle;
STDERR->autoflush(1);
sub print_result {
$dstr = "";
foreach my $d (@data) {
$dstr .= sprintf("0x%x,",$d)
}
if($bitn) {
print "bits=$bitn r/w=$rw slaveaddress=",
sprintf("0x%x",$slaveaddr),
" subaddress=", sprintf("0x%x",$subaddr),
" data=", $dstr, " sr=",sprintf("%x",$sr>>1),"\n";
}
}
$oepin = 0x3c3c;
$pin = 0x1c;
$DATA = 0x8;
$CLK = 0x10;
$CLK2 = 0x2;
while(<>) {
if(/Write/ && /register 0x1f4[de]/) {
# print;
s/register (0x1f4[de])/$reg = hex($1);/e;
s/Write 0x([0-9a-f]+)/$val=hex($1)/e;
if($reg == 0x1f4d) {
$en = $val >> 8;
$pin = ~$en & $pin | $en & $val & 0xff;
} else {
$en = $val >> 8;
$oepin = ~$en & $oepin | $en & $val & 0xff;
}
$outpin = ~$oepin | $pin;
$data = $outpin & $DATA ? 1 : 0;
$data = $oepin & $DATA ? $data : 'Z';
$clk = $outpin & $CLK ? 1 : 0;
if($clk && (!$data && $lastdata)) {
$outbit = 'S';
} elsif($clk && ($data && !$lastdata)) {
$outbit = 'P';
} elsif(!$clk && $lastclk && ($outbit ne 'S')) {
$outbit = $data;
} else {
$outbit = '';
}
print $outbit;
if($outbit eq 'S') {
undef @data;
$bitn = 0;
} elsif($outbit eq 'P') {
print "\n";
&print_result;
} elsif($outbit ne '') {
$sr <<= 1;
$sr |= $outbit;
if(($sr & 0xc060100) == 0xc060000) {
printf " %02X %02X SR = 0x%08X\n", ($sr >> 9) & 0xff ,($sr & 0xff),$sr;
$sr=0;
}
{
if($bitn == 6) { $slaveaddr = $sr & 0x7f; last; }
if($bitn == 7) { $rw = $lastbusdata; last; }
if($bitn == 16) { $subaddr = $sr & 0xff; last; }
if($bitn >= 25 && (($bitn-25) % 9) == 0) { push(@data,$sr & 0xff); last; }
}
$bitn++;
}
$lastclk = $clk;
$lastdata = $data;
} else {
if(!/0x1f4d/) {
print;
}
}
}
&print_result;
|