fix --pins usage and filtering of boards in same pins file
[linux-gpio-pinout] / gpio.pl
diff --git a/gpio.pl b/gpio.pl
index c2af8ac..0e75092 100755 (executable)
--- a/gpio.pl
+++ b/gpio.pl
@@ -47,10 +47,19 @@ sub slurp {
 }
 
 my $pins;
+my $include = 0;
 
 my $model = slurp('/proc/device-tree/model');
 $model =~ s/\x00$//; # strip kernel NULL
 warn "# model [$model]";
+if ( $opt_pins ) {
+       $model = $opt_pins;
+       $model =~ s/^.*\///; # strip dir
+       $model =~ s/\..+$//; # strip extension
+       $include = 1;
+       warn "# $opt_pins model [$model] $include";
+}
+warn "# $opt_pins model [$model] $include";
 
 OPEN_PINS_AGAIN:
 open(DATA, '<', $opt_pins) if $opt_pins;
@@ -58,17 +67,16 @@ open(DATA, '<', $opt_pins) if $opt_pins;
 my @lines;
 my $line_i = 0;
 
-my $include = 0;
 while(<DATA>) {
        chomp;
        if ( m/^#\s(.+)/ ) {
-               warn "MODEL [$1] == [$model] ?\n";
                if ( $model =~ m/$1/ ) {
                        $include = 1;
                } else {
                        $include = 0;
                }
-       } elsif ( $include || $opt_pins ) {
+               warn "MODEL [$1] == [$model] include: $include\n";
+       } elsif ( $include ) {
                push @{ $pins->{$1} }, $line_i while ( m/\t\s*(\w+\d+)/g );
 
                push @lines, $_;
@@ -83,6 +91,7 @@ if ( ! $opt_pins && ! $pins ) {
        my $glob = $model;
        $glob =~ s/^(\w+).*$/$1/;
        my @pins = glob "pins/${glob}*";
+       die "pins/${glob} NOT FOUND for this board, please create one and contribute" unless @pins;
        warn "# possible pins: ",dump( \@pins );
        $opt_pins = $pins[0];
        goto OPEN_PINS_AGAIN;
@@ -160,6 +169,42 @@ while(<$fh>) {
 
 warn "# pin_function = ",dump($pin_function);
 
+
+# insert kernel gpio info
+my $linux_gpio_name;
+open(my $pins_fh, '<', (glob "/sys/kernel/debug/pinctrl/*/pins")[0]);
+while(<$pins_fh>) {
+       if ( m/^pin (\d+) \(([^\)]+)\)/ ) {
+               $linux_gpio_name->{$1} = $2;
+       }
+}
+warn "# linux_gpio_name = ",dump( $linux_gpio_name );
+
+
+my $gpio_debug;
+open(my $gpio_fh, '<', '/sys/kernel/debug/gpio');
+while(<$gpio_fh>) {
+       if (m/|/ ) {
+               s/^\s+//;
+               s/\s+$//;
+               my @l = split(/\s*[\(\|\)]\s*/, $_);
+               warn "XXX ", dump( \@l );
+               if ( $l[0] =~ m/gpio-(\d+)/ ) {
+                       if ( my $pin = $linux_gpio_name->{$1} ) {
+                               $gpio_debug->{ $pin } = $l[2];
+                               $l[3] =~ s/\s\s+/ /g;
+                               annotate_pin $pin, qq{"$l[2]" $l[3]};
+                       } else {
+                               warn "FIXME can't find $1 in ",dump( $linux_gpio_name );
+                       }
+               }
+       }
+
+}
+warn "# gpio_debug = ",dump( $gpio_debug );
+
+
+
 my $have_sunxi_pio = `which sunxi-pio`;
 if ( $have_sunxi_pio ) {
 
@@ -178,6 +223,34 @@ close($pio);
 
 } # have_sunxi_pio
 
+my $have_raspi_gpio = `which raspi-gpio`;
+if ( $have_raspi_gpio ) {
+
+my @gpio_pins;
+
+open(my $pio, '-|', 'raspi-gpio get');
+while(<$pio>) {
+       chomp;
+       if ( m/^\s*GPIO (\d+): (.+)/ ) {
+               my $pin = 'gpio' . $1;
+               push @gpio_pins, $1;
+               annotate_pin $pin, $2 if ! $opt_svg;
+       }
+}
+close($pio);
+
+open(my $pio, '-|', 'raspi-gpio funcs '.join(',',@gpio_pins));
+while(<$pio>) {
+       chomp;
+       s/,\s/ /g;
+       if (m/^(\d+)\s+(.*)/) {
+               annotate_pin 'gpio'.$1,"($2)" if $opt_alt;
+       }
+}
+close($pio);
+
+} # have_raspi_gpio
+
 
 my $pinmux;
 my $pinmux_path = (glob("/sys/kernel/debug/pinctrl/*/pinmux-functions"))[0];