remove empty lines at beginng/end and draw last line/cut mark
[linux-gpio-pinout] / gpio.pl
diff --git a/gpio.pl b/gpio.pl
index b4e8a9a..d9fffeb 100755 (executable)
--- a/gpio.pl
+++ b/gpio.pl
@@ -7,15 +7,17 @@ use Getopt::Long;
 
 my $opt_svg = $ENV{SVG} || 0;
 my $opt_alt = $ENV{ALT} || 0;
 
 my $opt_svg = $ENV{SVG} || 0;
 my $opt_alt = $ENV{ALT} || 0;
-my $opt_invert = $ENV{INVERT} = 0;
-my $opt_vertical = $ENV{VERTICAL} = 0;
-my $opt_kernel = $ENV{kernel} = 1;
+my $opt_invert = $ENV{INVERT} || 0;
+my $opt_vertical = $ENV{VERTICAL} || 0;
+my $opt_zebra = $ENV{ZEBRA} || 0;
+my $opt_lines = $ENV{LINES} || 0;
 GetOptions(
        'svg!' => \$opt_svg,
        'alt!' => \$opt_alt,
        'invert!' => \$opt_invert,
        'vertical!' => \$opt_vertical,
 GetOptions(
        'svg!' => \$opt_svg,
        'alt!' => \$opt_alt,
        'invert!' => \$opt_invert,
        'vertical!' => \$opt_vertical,
-       'kernel!' => \$opt_kernel,
+       'zebra!' => \$opt_zebra,
+       'lines!' => \$opt_lines,
 );
 
 # svg font hints
 );
 
 # svg font hints
@@ -47,8 +49,6 @@ while(<DATA>) {
                } else {
                        $include = 0;
                }
                } else {
                        $include = 0;
                }
-       } elsif ( m/^#\s+/ ) {
-               $include = 1;
        } elsif ( $include ) {
                push @{ $pins->{$1} }, $line_i while ( m/\t(\w+\d+)/g );
 
        } elsif ( $include ) {
                push @{ $pins->{$1} }, $line_i while ( m/\t(\w+\d+)/g );
 
@@ -60,6 +60,9 @@ while(<DATA>) {
        }
 }
 
        }
 }
 
+shift(@lines) while ( ! $lines[0] );   # remove empty at beginning
+pop(@lines) while ( ! $lines[-1] );    # remove empty at end
+
 die "add pin definition for # $model" unless $pins;
 
 warn "# pins ",dump($pins);
 die "add pin definition for # $model" unless $pins;
 
 warn "# pins ",dump($pins);
@@ -76,8 +79,6 @@ while(<$fh>) {
                my ($pin, $function) = ($1,$2);
                $pin_function->{$pin} = "$device $function";
 
                my ($pin, $function) = ($1,$2);
                $pin_function->{$pin} = "$device $function";
 
-               next unless $opt_kernel;
-
                if ( $pins->{$pin} ) {
                        foreach my $line ( @{$pins->{$pin}} ) {
 warn "XXX $pin $line";
                if ( $pins->{$pin} ) {
                        foreach my $line ( @{$pins->{$pin}} ) {
 warn "XXX $pin $line";
@@ -106,10 +107,14 @@ foreach my $line (@lines) {
                next;
        }
        $line =~ s/(\[(?:uart|serial))([^\t]*\]\s[^\t]*(rx|tx)d?)/$1 $3$2/gi;
                next;
        }
        $line =~ s/(\[(?:uart|serial))([^\t]*\]\s[^\t]*(rx|tx)d?)/$1 $3$2/gi;
-       $line =~ s/(\[i2c)([^\t]*\]\s[^\t]*(sclk?|sda))/$1 $3$2/gi;
+       $line =~ s/(\[i2c)([^\t]*\]\s[^\t]*(scl?k?|sda))/$1 $3$2/gi;
        $line =~ s/(\[spi)([^\t]*\]\s[^\t]*(miso|mosi|s?clk|c[se]\d*))/$1 $3$2/gi;
        $line =~ s/\s*\([^\)]+\)//g if ! $opt_alt;
 
        $line =~ s/(\[spi)([^\t]*\]\s[^\t]*(miso|mosi|s?clk|c[se]\d*))/$1 $3$2/gi;
        $line =~ s/\s*\([^\)]+\)//g if ! $opt_alt;
 
+       # shorten duplicate kernel device/function
+       $line =~ s/\[serial (\w+) (uart\d+)\]/[$2 $1]/g;
+       $line =~ s/\[(\w+) (\w+) \1(\d+)\]/[$1$3 $2]/g;
+
        my @v = split(/\s*\t+\s*/,$line,4);
        push @line_parts, [ @v ];
        foreach my $i ( 0 .. 3 ) {
        my @v = split(/\s*\t+\s*/,$line,4);
        push @line_parts, [ @v ];
        foreach my $i ( 0 .. 3 ) {
@@ -250,6 +255,12 @@ my $max_x = $x;
 $max_x += $max_len[$_] * $font_w foreach ( 0 .. 3 );
 cut_mark $max_x, $y;
 
 $max_x += $max_len[$_] * $font_w foreach ( 0 .. 3 );
 cut_mark $max_x, $y;
 
+sub line {
+       my ($x,$y,$max_x) = @_;
+       push @cut_marks, sprintf($line_fmt, $x, $y-$font_b, $max_x, $y-$font_b);
+}
+
+
 my $last_cut_mark = 0;
 
 foreach my $i ( 0 .. $#line_parts ) {
 my $last_cut_mark = 0;
 
 foreach my $i ( 0 .. $#line_parts ) {
@@ -264,6 +275,7 @@ foreach my $i ( 0 .. $#line_parts ) {
                                cut_mark $x, $y;
                                cut_mark $max_x, $y;
                                $last_cut_mark = 1;
                                cut_mark $x, $y;
                                cut_mark $max_x, $y;
                                $last_cut_mark = 1;
+                               line $x, $y, $max_x if $opt_lines;
                                $y += 15; # make spacing between pinouts
                        }
                } elsif ( $last_cut_mark ) {
                                $y += 15; # make spacing between pinouts
                        }
                } elsif ( $last_cut_mark ) {
@@ -275,6 +287,8 @@ foreach my $i ( 0 .. $#line_parts ) {
                        #warn "CUTMARK no magic";
                }
 
                        #warn "CUTMARK no magic";
                }
 
+               line $x, $y, $max_x if $opt_lines && exists $line->[1];
+
                my ($fg,$bg) = @{ $cols->{txt} };
                my $tspan = qq{<tspan x="$x" y="$y" style="line-height:2.54;fill:$fg;stroke:none;">\n};
 
                my ($fg,$bg) = @{ $cols->{txt} };
                my $tspan = qq{<tspan x="$x" y="$y" style="line-height:2.54;fill:$fg;stroke:none;">\n};
 
@@ -291,8 +305,10 @@ foreach my $i ( 0 .. $#line_parts ) {
                push @later,sprintf $tspan, @$line;
                $y += 2.54;
 
                push @later,sprintf $tspan, @$line;
                $y += 2.54;
 
-               # swap pin colors for line stripes
-               swap_cols $_ foreach qw( pins txt );
+               # swap pin colors for line stripe
+               if ( $opt_zebra ) {
+                       swap_cols $_ foreach qw( pins txt );
+               }
 
        } else {
 
 
        } else {
 
@@ -307,6 +323,10 @@ foreach my $i ( 0 .. $#line_parts ) {
 }
 
 if ( $opt_svg ) {
 }
 
 if ( $opt_svg ) {
+       cut_mark $x,$y;
+       cut_mark $max_x,$y;
+       line $x, $y, $max_x if $opt_lines;
+
        print qq{
     <text
        id="text4506"
        print qq{
     <text
        id="text4506"
@@ -322,7 +342,7 @@ if ( $opt_svg ) {
 }
 
 __DATA__
 }
 
 __DATA__
-# Cubietech Cubieboard2
+# Cubietech Cubieboard
 ## U14 (Next to SATA connector)
 ###    SPI0
 48     PI13 (SPI0-MISO/UART6-RX/EINT25)        47      PI11 (SPI0-CLK/UART5-RX/EINT23)
 ## U14 (Next to SATA connector)
 ###    SPI0
 48     PI13 (SPI0-MISO/UART6-RX/EINT25)        47      PI11 (SPI0-CLK/UART5-RX/EINT23)
@@ -351,7 +371,6 @@ __DATA__
 4      PD1 (LCDD1/LVDS0N0)                     3       PD2 (LCDD2/LVDS0P1)
 2      Ground                                  1       PD0 (LCDD0/LVDSP0)
 
 4      PD1 (LCDD1/LVDS0N0)                     3       PD2 (LCDD2/LVDS0P1)
 2      Ground                                  1       PD0 (LCDD0/LVDSP0)
 
-# Cubietech Cubieboard2
 ## U15 (Between Ethernet port and USB ports)
 ### CSI1/TS
 1      VCC-5V                                  2       PH15 (CSI1-PWR/EINT15)
 ## U15 (Between Ethernet port and USB ports)
 ### CSI1/TS
 1      VCC-5V                                  2       PH15 (CSI1-PWR/EINT15)
@@ -435,3 +454,4 @@ __DATA__
 35     gpio19 (GPIO.24)        36      gpio16  (GPIO.27)
 37     gpio26 (GPIO.25)        38      gpio20  (GPIO.28)
 39     0v                      40      gpio21  (GPIO.29)
 35     gpio19 (GPIO.24)        36      gpio16  (GPIO.27)
 37     gpio26 (GPIO.25)        38      gpio20  (GPIO.28)
 39     0v                      40      gpio21  (GPIO.29)
+