blob: 026c4eed2f127fa82f54770a058614749f91fc28 (
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
ivtofs 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
ivtofs 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;
};
|