my $opt_read = '';
my $opt_pins = '';
my $opt_color = 0;
+my $opt_pinmux = 0;
GetOptions(
'svg!' => \$opt_svg,
'alt!' => \$opt_alt,
'read=s' => \$opt_read,
'pins=s' => \$opt_pins,
'color' => \$opt_color,
+ 'pinmux' => \$opt_pinmux,
);
# svg font hints
}
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;
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, $_;
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;
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;
}
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;