summaryrefslogtreecommitdiffstats
path: root/scripts/regsubst.pl
blob: 3b6b8aa2e96db7a6e4b4c76c42ff88609bfea2b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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<regsubst.pl> [B<-I> I<includepath>] I<filename>

=head1 DESCRIPTION

B<regsubst.pl> parses the given file recursively for #include directives and
then substitutes raw hex values in I<filename> 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<regsubst.pl> is dumb and so might replace values to aggressively. So better
double check the result.

=head1 OPTIONS

=over 4

=item B<-I> I<includepath>

Add I<includepath> 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 <mach/imx6-ddr-regs.h>
 #include <mach/imx6dl-ddr-regs.h>
 
 wm 32 0x020e0774 0x000C0000
 wm 32 0x020e0754 0x00000000
 ...

Then you can process the file with B<regsubst.pl>:

 $ scripts/regsubst.pl -I arch/arm/mach-imx/include flash-header-myboard.imxcfg
 soc imx6
 loadaddr 0x20000000
 dcdofs 0x400
 
 #include <mach/imx6-ddr-regs.h>
 #include <mach/imx6dl-ddr-regs.h>
 
 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
 $ mv 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;
};