X-Git-Url: http://git.rot13.org/?p=linux-gpio-pinout;a=blobdiff_plain;f=gpio.pl;h=99e1703db13102d522e4a10a100cab8e472b83f4;hp=9b02c48f367d5884253889487c5b6124155b217e;hb=HEAD;hpb=5503d8eb06da6e17b83237d042d2c247a1c27d14 diff --git a/gpio.pl b/gpio.pl index 9b02c48..99e1703 100755 --- a/gpio.pl +++ b/gpio.pl @@ -17,6 +17,7 @@ my $opt_lines = 0; my $opt_read = ''; my $opt_pins = ''; my $opt_color = 0; +my $opt_pinmux = 0; GetOptions( 'svg!' => \$opt_svg, 'alt!' => \$opt_alt, @@ -30,6 +31,7 @@ GetOptions( 'read=s' => \$opt_read, 'pins=s' => \$opt_pins, 'color' => \$opt_color, + 'pinmux' => \$opt_pinmux, ); # svg font hints @@ -45,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; @@ -56,17 +67,16 @@ open(DATA, '<', $opt_pins) if $opt_pins; my @lines; my $line_i = 0; -my $include = 0; while() { 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, $_; @@ -79,8 +89,9 @@ while() { if ( ! $opt_pins && ! $pins ) { my $glob = $model; - my $glob =~ s/^(\w+).*$/$1/; + $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; @@ -158,6 +169,45 @@ 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 ) { + open(my $pio, '-|', 'sunxi-pio -m print'); while(<$pio>) { chomp; @@ -171,6 +221,66 @@ while(<$pio>) { } 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 * 1; # we need * 1 to strip leading zero + 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]; +if ( $opt_pinmux && -e $pinmux_path ) { + open(my $mux, '<', $pinmux_path); + while(<$mux>) { + chomp; + if ( m/function: (\w+), groups = \[ (.*) \]/ ) { + my ( $func, $pins ) = ( $1, $2 ); + foreach ( split(/\s+/,$pins) ) { + push @{ $pinmux->{$_} }, $func; + } + } else { + warn "IGNORED [$pinmux_path] [$_]\n"; + } + } + + foreach my $pin ( keys %$pinmux ) { + if ( exists $pins->{$pin} ) { + annotate_pin $pin, '{' . join(' ', @{$pinmux->{$pin}}) . '}'; + } else { + warn "IGNORED mux on $pin\n"; + } + } + + warn "# pinmux = ",dump( $pinmux ); +} + + + my @max_len = ( 0,0,0,0 ); my @line_parts;