diff --git a/scripts/regsubst.pl b/scripts/regsubst.pl new file mode 100755 index 0000000..9621a58 --- /dev/null +++ b/scripts/regsubst.pl @@ -0,0 +1,129 @@ +#!/usr/bin/perl +# +# This script is documented in Perl Pod, you can pretty-print it using +# +# $ perldoc scripts/regsubst.pl. +# +# The real code starts after "=cut" below. + +=head1 NAME + +regsubst.pl - helper script to make use of defines + +=head1 SYNOPSIS + +B [B<-I> I] I + +=head1 DESCRIPTION + +B parses the given file recursively for #include directives and +then substitutes raw hex values in I by definitions found and prints +the result to stdout. + +This is targeted to make i.MX DCD tables more readable but for sure can be used +elsewhere too. + +=head1 BUGS + +B is dumb and so might replace values to aggressively. So better +double check the result. + +=head1 OPTIONS + +=over 4 + +=item B<-I> I + +Add I to the list of search paths for include files. + +=back + +=head1 EXAMPLE + +First you have to add the right #include directives to your file: + + $ cat flash-header-myboard.imxcfg + soc imx6 + loadaddr 0x20000000 + dcdofs 0x400 + + #include + #include + + wm 32 0x020e0774 0x000C0000 + wm 32 0x020e0754 0x00000000 + ... + +Then you can process the file with B: + + $ scripts/regsubst.pl -I arch/arm/mach-imx/include flash-header-myboard.imxcfg + soc imx6 + loadaddr 0x20000000 + dcdofs 0x400 + + #include + #include + + wm 32 MX6_IOM_GRP_DDR_TYPE 0x000C0000 + wm 32 MX6_IOM_GRP_DDRPKE 0x00000000 + ... + +If the result looks ok, you can replace the file: + + $ scripts/regsubst.pl -I arch/arm/mach-imx/include flash-header-myboard.imxcfg > u + $ mov u flash-header-myboard.imxcfg + +=cut + +use strict; +use warnings; +use Getopt::Long qw(GetOptions); + +my @includepaths; + +GetOptions('I=s' => \@includepaths); + +my %regnamemap; + +sub scan { + my @incfiles; + + push @incfiles, @_; + + foreach my $i (@incfiles) { + foreach my $incpath (@includepaths) { + if (-e "$incpath/$i") { + open(my $fd, "<", "$incpath/$i") || die "Failed to open include file $incpath/$i"; + + while (<$fd>) { + if (/^\s*#\s*include\s+["<](.*)[">]/) { + push @incfiles, $1; + }; + + if (/^\s*#\s*define\s+([A-Z_0-9]*)\s+(0x[0-9a-f]+)/) { + my $regname = $1; + my $regaddrre = $2 =~ s/^0x0*/0x0\*/r; + $regnamemap{$regaddrre} = $regname; + }; + }; + + close($fd); + + last; + } + } + } +} + +while (<>) { + my $line = $_; + + if (/#include ["<](.*)[">]/) { + scan $1; + } + + foreach my $regaddr (keys %regnamemap) { + $line =~ s/$regaddr/$regnamemap{$regaddr}/ei; + } + print $line; +};