File: parsei2c.pl

package info (click to toggle)
em8300 0.16.0-2
  • links: PTS
  • area: contrib
  • in suites: etch, etch-m68k
  • size: 2,024 kB
  • ctags: 1,492
  • sloc: ansic: 11,554; sh: 3,849; perl: 1,353; makefile: 429
file content (109 lines) | stat: -rwxr-xr-x 1,969 bytes parent folder | download | duplicates (2)
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;