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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#!/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;
|